版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zc_ad/article/details/83346157
过了两三天开始写微信的第二个博文,最近有点疯狂,将近两天的时间写了快20篇博文,以后要将缺失的博文补回来。好了,开始说微信获取AccessToken以及菜单的操作。
获取AccessToken的原因很简单,因为调用微信的接口都需要AccessToken,每天获取accessToken的次数是一定的,而且accessToken有过期时间,本人通过java实现的,需要用到的框架有retrofit(网络请求框架),我会将此框架的代码块放在博文中,现在不在此博文中详细说明retrofit的使用,以后会陆续写关于retrofit的博文。
首先需要引用retrofit的maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<!--ArrayUtils 等基础jar-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<!-- commons-io,FileUtils -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.3.0</version>
</dependency>
<!--json解析-->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.3.0</version>
</dependency>
<!--xml解析-->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-simplexml</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>adapter-rxjava</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
封装retrofit,注意的是,此出使用的是https请求(这个我弄了好久才搞出来 = =)。
package com.xichuan.wechat.common.http;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* Created by XiChuan 2018-06-11.
*/
public class HttpClient {
private static Logger logger = LoggerFactory.getLogger(HttpClient.class);
public static final HttpClient INSTANCE = new HttpClient();
/**
* 获取HTTPS
* @param clazz
* @param host
* @param <T>
* @return
*/
public <T> T getHttpsClient(Class<T> clazz,String host) {
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor((String s) -> {
});
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
SSLSocketFactory sslSocketFactory = trustAllHosts();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(logInterceptor)
.sslSocketFactory(sslSocketFactory)
.hostnameVerifier((String, SSLSession) -> {
//logger.debug("ssl hostname verifier with host: {}", host);
return true;
}).build();
Retrofit retrofitUser = new Retrofit.Builder()
.baseUrl(host)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofitUser.create(clazz);
}
/**(因为调用第三方网站无法得到证书),信任所有的HTTPS连接*/
private static SSLSocketFactory trustAllHosts() {
SSLSocketFactory sslSocketFactory = null;
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
}
};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
sslSocketFactory = sc.getSocketFactory();
} catch (Throwable e) {
e.printStackTrace();
}
return sslSocketFactory;
}
}
定义微信请求接口。
package com.xichuan.wechat.wx.api;
import com.xichuan.wechat.common.http.HttpClient;
import net.sf.json.JSONObject;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by XiChuan 2018-09-26.
*/
public interface WXDevApis {
/**1.获取accessToken*/
@GET("/cgi-bin/token")
Call<Object> getAccessToken(@Query("grant_type")String grantType,
@Query("appid")String appId,
@Query("secret")String secret);
/**2.创建菜单*/
@POST("/cgi-bin/menu/create")
Call<Object> createMenu(@Query("access_token")String accessToken,
@Body JSONObject json);
/**3.获取菜单*/
@GET("/cgi-bin/menu/get")
Call<Object> getMenu(@Query("access_token")String accessToken);
/**4.删除菜单*/
@GET("/cgi-bin/menu/delete")
Call<Object> deleteMenu(@Query("access_token")String accessToken);
class builder{
private static String url = "https://api.weixin.qq.com";
public static WXDevApis getWXDevApis(){
return HttpClient.INSTANCE.getHttpsClient(WXDevApis.class,url);
}
}
}
一.获取accessToken
注意修改代码中的appid与secret,这个两个参数是在你微信公众号后台里面的。
public class WXTest {
private static final String APPID = "wx111112121219";
private static final String SECRET = "2eweqe12222222221211111";
private static Gson gson = new Gson();
public static void main(String[] args)throws IOException{
getAccessToken();
}
/**1.获取accessToken*/
public static void getAccessToken()throws IOException{
Response<Object> response =
WXDevApis.builder.getWXDevApis().getAccessToken("client_credential", APPID, SECRET).execute();
if (response.isSuccessful()){
AccessToken accessToken = gson.fromJson( gson.toJson(response.body()), AccessToken.class);
if (StringUtils.isBlank(accessToken.access_token)){
System.out.println("get access token error!,"+gson.toJson(response.body()));
}else{
System.out.println(accessToken.access_token );
}
}else{
System.out.println("request error");
}
}
}
二.创建菜单
创建菜单,微信接口文档中已经给出每个字段的含义了,在此分下一下创建菜单的代码。
扫描二维码关注公众号,回复:
3889172 查看本文章
微信创建菜单json参数说明
参数 是否必须 说明
button 是 一级菜单数组,个数应为1~3个
sub_button 否 二级菜单数组,个数应为1~5个
type 是 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型
name 是 菜单标题,不超过16个字节,子菜单不超过60个字节
key click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view、miniprogram类型必须 网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。
media_id media_id类型和view_limited类型必须 调用新增永久素材接口返回的合法media_id
appid miniprogram类型必须 小程序的appid(仅认证公众号可配置)
pagepath miniprogram类型必须 小程序的页面路径
创建菜单代码:
package com.xichuan.wechat.wx.api;
import com.google.gson.Gson;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import retrofit2.Response;
import java.io.IOException;
/**
* Created by XiChuan on 2018-09-26.
*/
public class WXTest {
private static Gson gson = new Gson();
private static String ACCESS_TOKEN = "15_0Lv0-A6NqWq-ob8W8ufelVhwHI-SaihRYCi9Ph4I949P0QKH1aQPl3x2Fsjudc84uW9BhA3fAik1qWr2mxubQPUaQDBX3Xvlj5BXp4N69AuRU9uKTJwjBsvSbup-CXoarJu_q-HbNfk6gZr7VXRjAHAQSM1";
public static void main(String[] args)throws IOException{
createMenu();
}
/**3.创建菜单*/
public static void createMenu()throws IOException{
//一级菜单
JSONArray menuBtnArray = new JSONArray();
//一级按钮button1
JSONObject menuBtn1 = new JSONObject();
menuBtn1.put("type","view");
menuBtn1.put("name","百度");
menuBtn1.put("url","http://www.baidu.com");
menuBtnArray.add(menuBtn1);
//一级按钮button2
JSONObject menuBtn2 = new JSONObject();
menuBtn2.put("name","父菜单");
menuBtn2.put("key","V1001_btn3");
//二级菜单->menuBtn2
JSONArray menuBtn2Array = new JSONArray();
//二级按钮Button1
JSONObject menuBtn2Sub1 = new JSONObject();
menuBtn2Sub1.put("type","view");
menuBtn2Sub1.put("name","百度");
menuBtn2Sub1.put("url","http://www.baidu.com");
menuBtn2Array.add(menuBtn2Sub1);
//二级按钮Button2
JSONObject menuBtn2Sub2 = new JSONObject();
menuBtn2Sub2.put("type","view");
menuBtn2Sub2.put("name","搜狗");
menuBtn2Sub2.put("url","http://www.sogou.com");
menuBtn2Array.add(menuBtn2Sub2);
menuBtn2.put("sub_button",menuBtn2Array);
menuBtnArray.add(menuBtn2);
JSONObject button = new JSONObject();
button.put("button",menuBtnArray);
System.out.println(button.toString());
Response<Object> response =
WXDevApis.builder.getWXDevApis().createMenu(ACCESS_TOKEN,button).execute();
if (response.isSuccessful()){
System.out.println(gson.toJson(response.body()));
}else{
System.out.println("request error");
}
}
}
创建菜单时,生产的json:
{
"button": [{
"type": "view",
"name": "百度",
"url": "http://www.baidu.com"
}, {
"name": "父菜单",
"key": "V1001_btn3",
"sub_button": [{
"type": "view",
"name": "百度",
"url": "http://www.baidu.com"
}, {
"type": "view",
"name": "搜狗",
"url": "http://www.sogou.com"
}]
}]
}
三.获取菜单
package com.xichuan.wechat.wx.api;
import com.google.gson.Gson;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import retrofit2.Response;
import java.io.IOException;
/**
* Created by XiChuan 2018-09-26.
*/
public class WXTest {
private static Gson gson = new Gson();
private static String ACCESS_TOKEN = "15_0Lv0-A6NqWq-ob8W8ufelVhwHI-SaihRYCi9Ph4I949P0QKH1aQPl3x2Fsjudc84uW9BhA3fAik1qWr2mxubQPUaQDBX3Xvlj5BXp4N69AuRU9uKTJwjBsvSbup-CXoarJu_q-HbNfk6gZr7VXRjAHAQSM1";
public static void main(String[] args)throws IOException{
getMenu();
}
/**3.获取菜单*/
public static void getMenu()throws IOException{
Response<Object> response =
WXDevApis.builder.getWXDevApis().getMenu(ACCESS_TOKEN).execute();
if (response.isSuccessful()){
System.out.println(gson.toJson(response.body()));
}else{
System.out.println("request error");
}
}
}
四.删除菜单
package com.xichuan.wechat.wx.api;
import com.google.gson.Gson;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import retrofit2.Response;
import java.io.IOException;
/**
* Created by XiChuan on 2018-09-26.
*/
public class WXTest {
private static Gson gson = new Gson();
private static String ACCESS_TOKEN = "15_0Lv0-A6NqWq-ob8W8ufelVhwHI-SaihRYCi9Ph4I949P0QKH1aQPl3x2Fsjudc84uW9BhA3fAik1qWr2mxubQPUaQDBX3Xvlj5BXp4N69AuRU9uKTJwjBsvSbup-CXoarJu_q-HbNfk6gZr7VXRjAHAQSM1";
public static void main(String[] args)throws IOException{
deleteMenu();
}
/**3.删除菜单*/
public static void deleteMenu()throws IOException{
Response<Object> response =
WXDevApis.builder.getWXDevApis().deleteMenu(ACCESS_TOKEN).execute();
if (response.isSuccessful()){
System.out.println(gson.toJson(response.body()));
}else{
System.out.println("request error");
}
}
}
对于会retrofit的同学来说,上面的代码应该很简单,因为就是调用微信提供的接口而已,但不会retrofit的同学,建议学习学习,这个网络请求框架比原生态的httpClient请求方便的多的多。好了,本博客就到这里吧。