微信公众号开发之获取access_token

微信公众号开发详细教程

官方文档

公众平台的API调用所需的access_token的使用及生成方式说明:

1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

接口调用请求说明

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明

参数是否必须说明
grant_type获取access_token填写client_credential
appid第三方用户唯一凭证
secret第三方用户唯一凭证密钥,即appsecret

开发过程中调用其它的接口都需要access_token。token机制,调用接口验证appid和secrect的合法性,如果合法就返回access_token,调用其它接口的时候只需要携带access_token,而不用多次验证appid和secrect的合法性。两个小时后失效。

自己封装接口调用:

 public String getAccessToken() throws UnsupportedEncodingException {
        String gramt_type = "client_credential";
        String appid = "";
        String secret = "";
        String accessToken = "";
        //1.使用默认的配置的httpclient
        CloseableHttpClient client = HttpClients.createDefault();
        //2.使用get方法
        HttpGet httpGet = new HttpGet("https://api.weixin.qq.com/cgi-bin/token?" +
                "grant_type=" + gramt_type + "&appid=" + appid + "&secret=" + secret);
        CloseableHttpResponse response = null;

        try {
            //3.执行请求,获取响应
            response = client.execute(httpGet);
            //看请求是否成功,这儿打印的是http状态码
            if (response.getStatusLine().getStatusCode() == 200) {
                //4.获取响应的实体内容,就是我们所要抓取得网页内容
                HttpEntity entity = response.getEntity();

//            5.将其打印到控制台上面
//            方法一:使用EntityUtils
                if (entity != null) {
                    String data = EntityUtils.toString(entity, "utf-8");
                    JSONObject jsonObject = JSON.parseObject(data);
                    accessToken = jsonObject.getString("access_token");
                }
                EntityUtils.consume(entity);
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return accessToken;
    }

自己调用接口封装实在是太过于繁琐。

微信提供的微信公众号开发工具包

依赖文件

        <!-- 微信开发工具包 -->
        <dependency>
            <groupId>me.chanjar</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>me.chanjar</groupId>
            <artifactId>weixin-java-common</artifactId>
            <version>1.3.3</version>
        </dependency>

开发工具类帮我们封装了接口,而我们只是简单的调用api就可以。

public class WXTest {
    @Test
    public void courseTemplateTest(){
      //创建配置对象
      WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage=new WxMpInMemoryConfigStorage();
      //微信公众号的appid
      wxMpInMemoryConfigStorage.setAppId("");
      //微信公众号的密钥
      wxMpInMemoryConfigStorage.setSecret("");
      //创建服务对象
      WxMpService service=new WxMpServiceImpl();
      //将配置对象注入服务对象中
      service.setWxMpConfigStorage(wxMpInMemoryConfigStorage);

        try {
            String access_token=service.getAccessToken();
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
}
}

实际上工具类的底层跟我们所写的代码是一样的,可以看一看。

 public String getAccessToken(boolean forceRefresh) throws WxErrorException {
        if (forceRefresh) {
            this.wxMpConfigStorage.expireAccessToken();
        }

        if (this.wxMpConfigStorage.isAccessTokenExpired()) {
            Object var2 = this.globalAccessTokenRefreshLock;
            synchronized(this.globalAccessTokenRefreshLock) {
                if (this.wxMpConfigStorage.isAccessTokenExpired()) {
                    String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + this.wxMpConfigStorage.getAppId() + "&secret=" + this.wxMpConfigStorage.getSecret();

                    try {
                        HttpGet httpGet = new HttpGet(url);
                        if (this.httpProxy != null) {
                            RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy).build();
                            httpGet.setConfig(config);
                        }

                        CloseableHttpResponse response = this.getHttpclient().execute(httpGet);
                        String resultContent = (new BasicResponseHandler()).handleResponse(response);
                        WxError error = WxError.fromJson(resultContent);
                        if (error.getErrorCode() != 0) {
                            throw new WxErrorException(error);
                        }

                        WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
                        this.wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
                    } catch (ClientProtocolException var10) {
                        throw new RuntimeException(var10);
                    } catch (IOException var11) {
                        throw new RuntimeException(var11);
                    }
                }
            }
        }

        return this.wxMpConfigStorage.getAccessToken();
    }

如果不嫌繁琐,可以自己去封装调用这些接口。

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页