关于微信accesstoken的有效时间问题
虽然微信官方给的说法是微信accesstoken的有效时间是2小时,重新获取之后原来的accesstoken的有效时间是5分钟,但是最近发现,accesstoken真正的有效时间不是2小时,看了论坛上大家的讨论发现accesstoken的有效时间不定,有的说2小时有用,有的是10分钟就失效了,但是前提是你的accesstoken没有被刷新。
经过查询和讨论,找出了一个方案,就是我们在定时获取accesstoken那边修改,将两小时修改成5分钟校验一次accesstoken的有效性,找到了一个获取用户信息的接口,每天上限50000w次,每五分钟调一次即可。
原来的方法请查看之前的开发历程
private static Logger log = LoggerFactory.getLogger(TokenThread.class);
public static String appid = "appid";
public static String appsecret = "appserect";
public static AccessToken accessToken = null;
public static String jsapi_ticket = null;
public void run() {
accessToken = WeixinUtil.getAccessToken(appid, appsecret);
jsapi_ticket = WeixinUtil.getJSAPI(accessToken.getToken());
while (true) {
try {
//判断accessToken是否有效
Boolean Check = WeixinUtil.CheckAccessToken(accessToken.getToken(), "一个有效的用户的openId");
log.info("判断accessToken是否有效:" + Check);
if (!Check) {//无效
//走线程重新获取accessToken
accessToken = WeixinUtil.getAccessToken(appid, appsecret);
jsapi_ticket = WeixinUtil.getJSAPI(accessToken.getToken());
log.info("重新获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
log.info("重新获取jsapi_ticket成功,有效时长{}秒 jsapi_ticket:{}", accessToken.getExpiresIn(), jsapi_ticket);
//重新获取后睡眠线程5分钟
Thread.sleep(5 * 60 * 1000);
} else {//有效,睡眠线程5分钟
log.info("有效获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
log.info("有效获取jsapi_ticket成功,有效时长{}秒 jsapi_ticket:{}", accessToken.getExpiresIn(), jsapi_ticket);
Thread.sleep(5 * 60 * 1000);
}
} catch (InterruptedException e) {
try {
Thread.sleep(60 * 1000);//睡眠1分钟
} catch (InterruptedException e1) {
log.error("{}", e1);
}
log.error("{}", e);
}
}
}
我的校验方法比较傻,直接判断返回字符串有没有错误标识
/**校验accessToken是否有效的接口**/
public static boolean CheckAccessToken(String access_token, String openId) {
boolean result = false;
String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + openId + "&lang=zh_CN";
JSONObject jsonObject = httpRequest(url, "GET", null);
if (null != jsonObject) {
String json = jsonObject.toString();
log.info("json:" + json);
if (json.indexOf("errcode") > -1) {
result = false;
log.info("accessToken失效");
} else {
result = true;
log.info("accessToken有效");
}
}
return result;
}