微信公眾平臺開發歷程(五)
阿新 • • 發佈:2019-02-05
關於微信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; }