根據appid和appsecret可以調用接口得到通用的accessToken,有效時間是2個小時,重復調用接口上次的值將失效,每次業務邏輯都調用接口會造成服務不穩定,所以需要一個方法每隔兩個小時自動刷新accessToken。可以定義一個全局的map實現緩存,時間到了自動清除緩存中的數據
1 /** 2 * 獲取AccessToken並緩存 3 */ 4 public static String getAccessToken(String appid, String appsecret) { 5 String accessToken = ""; 6 AccessToken token = new AccessToken(); 7 8 if (HashMapUtil.tokenMap.size() > 0) { 9 token = HashMapUtil.tokenMap.get("access_token"); 10 // 當前時間 11 Calendar nowTime = Calendar.getInstance(); 12 nowTime.setTime(new Date()); 13 // 通用接口憑證申請時間加過期時間 14 // 特殊處理:過期時間減60秒 15 Calendar applyTime = Calendar.getInstance(); 16 applyTime.setTime(token.getApplyTime()); 17 applyTime.add(Calendar.SECOND, token.getExpiresIn() - 60); 18 // 比較時間 19 if (nowTime.compareTo(applyTime) >= 0) { 20 // Token失效,刪除內存中的數據 21 HashMapUtil.tokenMap.remove("access_token"); 22 token=getAccessTokenFromWX(appid,appsecret); 23 token.setApplyTime(new Date()); 24 HashMapUtil.tokenMap.put("access_token",token); 25 accessToken = token.getToken(); 26 } else { 27 // Token有效 28 accessToken = token.getToken(); 29 } 30 }else{ 31 token=getAccessTokenFromWX(appid,appsecret); 32 token.setApplyTime(new Date()); 33 HashMapUtil.tokenMap.put("access_token",token); 34 accessToken = token.getToken(); 35 } 36 37 return accessToken; 38 } 39 /** 40 * 微信服務器獲取access_Token 41 */ 42 public static AccessToken getAccessTokenFromWX(String appid, String appsecret) { 43 AccessToken accessToken=null; 44 String requestUrl = WechatInterfacesUrl.ACCESS_TOKEN_URL.replace("APPID", appid).replace("APPSECRET", appsecret); 45 JSONObject jsonObject = HttpUtils.httpsRequest(requestUrl, "GET", null); 46 // 如果請求成功 47 if (null != jsonObject) { 48 try { 49 accessToken = new AccessToken(); 50 accessToken.setToken(jsonObject.getString("access_token")); 51 accessToken.setExpiresIn(jsonObject.getInt("expires_in")); 52 } catch (JSONException e) { 53 accessToken = null; 54 // 獲取token失敗 55 log.error("獲取access_token失敗 errcode:" + jsonObject.getInt("errcode") + ",errmsg:" + jsonObject.getString("errmsg")); 56 } 57 } 58 return accessToken; 59 }