1. 程式人生 > >微信公眾平臺開發歷程(五)

微信公眾平臺開發歷程(五)

關於微信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;
	}