微信获取AccessToken以及菜单的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 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请求方便的多的多。好了,本博客就到这里吧。

猜你喜欢

转载自blog.csdn.net/zc_ad/article/details/83346157
今日推荐