上一篇文章写了微信消息处理和回复图文消息,这篇文章写如何获取微信的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}