1. 程式人生 > >微信開發筆記之快取access_token

微信開發筆記之快取access_token

官方解釋:access_token是公眾號的全域性唯一票據,公眾號呼叫各介面時都需使用access_token。開發者需要進行妥善儲存。access_token的儲存至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access_token失效。

使用redis快取access_token、定時任務採用spring quartz。
邏輯見程式碼
更新access_token程式碼

/**
     * 
     * @Title: updateAccessToken 
     * @Description: 供 定時任務更新 AccessToken,同時更新 JsAPITicket
     * @return
* @throws * @author */
public synchronized boolean updateAccessToken() throws Exception{ boolean updateRes = Boolean.FALSE; try { for (int i = 0; i < WeiXinConstants.WEIXIN_CACHE_RETRY; i++) { String accessTokenFromWeixin = getAccessTokenFromWeiXin(); String jsApiTicketFromWeiXin = this
.getJsApiTicketFromWeiXin(accessTokenFromWeixin); //放入快取 cacheManager.set(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN, accessTokenFromWeixin); cacheManager.set(WeiXinConstants.WEIXIN_CACHE_KEY_JS_API_TICKET, jsApiTicketFromWeiXin); updateRes = Boolean.TRUE; if
(updateRes){ break; } } } catch (Exception e) { logger.error("定時任務更新 微信 端 access token 和 js api ticket 異常:",e); throw e; } return updateRes; }

從快取中獲取access_token

/**
     * @Title: getAccessToken 
     * @Description: 獲取 微信 AccessToken
     * @return
     * @throws 
     * @author
     */
    public String getAccessToken()  throws Exception{
        String accessToken = "";
        try {
            accessToken =  cacheManager.getString(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN);
            if(StringUtils.isBlank(accessToken)){
                this.updateAccessToken();
                accessToken =  cacheManager.getString(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN);
            }
        } catch (Exception e) {
            logger.error(" 獲取 微信 AccessToken 異常:",e);
            throw e;
        }

        return accessToken;
    }

Spring quartz 的頻率剛開始定為1小時一次,後代碼中出現access_token 超時現象,最後檢查程式碼未發現其他地方直接去微信伺服器拿token的【因為只有從微信伺服器端拿過後,快取中token就會失效】,後又把定時頻率調整為半小時一次,24X2=48,每天才48次,未出現access_token超時現象。。。。