微信开发定时刷新accessToken

根据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     }

 

posted @ 2015-07-01 11:46  荣耀海布里  阅读(3615)  评论(0编辑  收藏  举报