官方解释:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
使用redis缓存access_token、定时任务采用spring quartz。
逻辑见代码
更新access_token代码
/**
*
* @Title: updateAccessToken
* @Description: 供 定时任务更新 AccessToken,同时更新 JsAPITicket
* @return
* @throws
* @author
*/
public synchronized boolean updateAccessToken() throws Exception{
boolean updateRes = Boolean.FALSE;
try {
for (int i = 0; i < WeiXinConstants.WEIXIN_CACHE_RETRY; i++) {
String accessTokenFromWeixin = getAccessTokenFromWeiXin();
String jsApiTicketFromWeiXin = this.getJsApiTicketFromWeiXin(accessTokenFromWeixin);
//放入缓存 cacheManager.set(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN, accessTokenFromWeixin);
cacheManager.set(WeiXinConstants.WEIXIN_CACHE_KEY_JS_API_TICKET, jsApiTicketFromWeiXin);
updateRes = Boolean.TRUE;
if(updateRes){
break;
}
}
} catch (Exception e) {
logger.error("定时任务更新 微信 端 access token 和 js api ticket 异常:",e);
throw e;
}
return updateRes;
}
从缓存中获取access_token
/**
* @Title: getAccessToken
* @Description: 获取 微信 AccessToken
* @return
* @throws
* @author
*/
public String getAccessToken() throws Exception{
String accessToken = "";
try {
accessToken = cacheManager.getString(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN);
if(StringUtils.isBlank(accessToken)){
this.updateAccessToken();
accessToken = cacheManager.getString(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN);
}
} catch (Exception e) {
logger.error(" 获取 微信 AccessToken 异常:",e);
throw e;
}
return accessToken;
}
Spring quartz 的频率刚开始定为1小时一次,后代码中出现access_token 超时现象,最后检查代码未发现其他地方直接去微信服务器拿token的【因为只有从微信服务器端拿过后,缓存中token就会失效】,后又把定时频率调整为半小时一次,24X2=48,每天才48次,未出现access_token超时现象。。。。