网络知识 娱乐 java微信公众号接入(3)

java微信公众号接入(3)

上一篇文章写了微信消息处理和回复图文消息,这篇文章写如何获取微信的access_token,并保存

1

先看看微信文档

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的刷新流程。

公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。小程序无需配置IP白名单。

接口调用请求说明

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

maven依赖:


<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.55</version>
</dependency>

一、带上微信的appid和secret以GET方式请求https

二、以流的方式读取请求文本,封装为bean

三、注意:请求的微信access_token默认可以使用2小时,过期后得重新请求

Bean:expires_in默认设置7200,在创建对象的时候可以带上

public class AccessToken {
    private String accessToken;    private Long expiresIn;
    public AccessToken() {    }
    public AccessToken(String accessToken, String expires_in) {        this.accessToken = accessToken;        this.expiresIn = System.currentTimeMillis() + Integer.parseInt(expires_in) * 1000;    }
    public boolean isExpired(){        return System.currentTimeMillis() > this.expiresIn;    }
    public String getAccessToken() {        return accessToken;    }
    public void setAccessToken(String accessToken) {        this.accessToken = accessToken;    }
    public Long getExpiresIn() {        return expiresIn;    }
    public void setExpiresIn(Long expiresIn) {        this.expiresIn = expiresIn;    }
    }

带上appid和appsecret就行,不过这种方式不推荐,后期可以写在配置文件上,会方便很多

public class WxMsgHandlerUtil {    private static final String GET_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";    private static final String APPID = "xxx";    private static final String APPSECRET = "xxx";         private static AccessToken accessToken;         /**     * 解析tonken     */    public static void getToken(){        String url = GET_TOKEN_URL.replace("APPID",APPID).replace("APPSECRET",APPSECRET);        String tokenStr = this.getToken(url);        System.out.println("tokenStr:" + tokenStr);        accessToken = JSONObject.parseObject(tokenStr, AccessToken.class);          //accessToken.setExpiresIn(7200L);         //System.out.println(accessToken);    }            /**     * 获取token     */    public static String  getToken(String url){        try {            URL url_1 = new URL(url);            //开链接            URLConnection urlConnection = url_1.openConnection();            InputStream is = urlConnection.getInputStream();            byte[] bytes = new byte[1024];            int len;            StringBuilder sb = new StringBuilder();            while ((len = is.read(bytes)) != -1){                sb.append(new String(bytes,0,len));            }            return sb.toString();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return null;    }        /**     * 向外暴露AccessToken     * @return     */    public static String expiredToken(){        if (accessToken == null || accessToken.isExpired()){            getToken();        }        return accessToken.getAccessToken();    }}

测试一下:

public class WxCoreServiceImpiTest  {
    private static final Logger log = LoggerFactory.getLogger(WxCoreServiceImpl.class);
    public static void main(String[] args) {        String accessToken = WxMsgHandlerUtil.expiredToken();        System.out.println("accessToken:" + accessToken);    }}

读取到的json

tokenStr:{"access_token":"19_TzA9ZDZtmpIPmRN7UELKU4KiVY-raKBnWs76L3GsH-lPRakjyPrfRkvLjyuA_ICcU5jOVCIH-JY5zHkv32rUz5Z2ARlks-H97aasfQCPw-EuRysgsZIFwIwg9XXXXXX","expires_in":7200}