1. 程式人生 > >微信公眾號開發 定時獲取AccessToken

微信公眾號開發 定時獲取AccessToken

介面呼叫請求說明

https請求方式: GET  https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

引數說明

引數                  是否必須        說明
grant_type          是           獲取access_token填寫client_credential
appid               是           第三方使用者唯一憑證
secret              是           第三方使用者唯一憑證金鑰,即appsecret

返回說明

正常情況下,微信會返回下述JSON資料包給公眾號:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

錯誤時微信會返回錯誤碼等資訊,JSON資料包示例如下(該示例為AppID無效錯誤):

{"errcode":40013,"errmsg":"invalid appid"}

由開發者檔案可以知道,accesstoken每天獲取2000次,每次的有效時長是7200秒,及2小時。
我們可以將accesstoken獲取後儲存在資料庫中,每2小時重新整理一次,也可以儲存在記憶體裡,等等。
博主這裡新建了一個servlet,在init()裡寫了個死迴圈,建立執行緒,獲取accesstoken,休眠7000秒(預留200秒)。

servlet:

public class InitServlet extends HttpServlet {
    public void init() throws ServletException {
        TokenThread.appid = getInitParameter("appid");
        TokenThread.appsecret = getInitParameter("appsecret");
        new Thread(new TokenThread()).start();
    }
}

thread:

public
class TokenThread implements Runnable { public static String appid=""; public static String appsecret=""; public static AccessToken accesstoken=null; public void run() { while (true) { try { accesstoken=GetAccessToken.getInterfaceToken(appid, appsecret); if (null!=accesstoken) { System.out.println("獲取accesstoken成功,accesstoken:"+accesstoken.getAccess_token()+" 有效時間為"+accesstoken.getExpires_in()); Thread.sleep((accesstoken.getExpires_in()-200)*1000);//休眠7000秒 } else { Thread.sleep(60*1000); } } catch (Exception e) { System.out.println(e.getMessage()); System.out.println("正在重新獲得accesstoken"); try { Thread.sleep(60*1000); } catch (Exception e2) { System.out.println(e2.getMessage()); } } } } }

getAccessToken():

public class GetAccessToken {
    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    public static AccessToken getInterfaceToken(String appid, String appsecret) {
        AccessToken accessToken = null;
        String requestUrl = access_token_url.replace("APPID", appid).replace(
                "APPSECRET", appsecret);
        new InterfaceUtil();
        JSONObject jsonObject = InterfaceUtil.httpRequest(requestUrl, "GET",
                null);
        if (null != jsonObject) {
            try {
                accessToken = new AccessToken();
                accessToken.setAccess_token(jsonObject
                        .getString("access_token"));
                accessToken.setExpires_in(jsonObject.getInt("expires_in"));
            } catch (Exception e) {
                accessToken = null;
                System.out.println(e.getMessage());
            }
        }
        return accessToken;

    }
}

accesstoken pojo:

/*
 * access_token格式:json
 * {"access_token":"ACCESS_TOKEN","expires_in":7200}
 * @param access_token 獲取到的憑證
 * @param expires_in 憑證有效時間,單位:秒
 */
public class AccessToken {
    private String access_token;
    private int expires_in;
    public AccessToken(String access_token, int expires_in) {
        super();
        this.access_token = access_token;
        this.expires_in = expires_in;
    }
    public AccessToken() {
        super();
    }
    public String getAccess_token() {
        return access_token;
    }
    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }
    public int getExpires_in() {
        return expires_in;
    }
    public void setExpires_in(int expires_in) {
        this.expires_in = expires_in;
    }

}

InitServlet在web.xml中的配置與普通Servlet的配置有幾點區別:1)通過配置向Servlet中傳入引數;2)通過配置使得Web伺服器啟動時就載入該Servlet;3)沒有配置,因為InitServlet並不對外提供訪問。
web.xml:

 <servlet>
  <servlet-name>AccessToken</servlet-name>
  <servlet-class>com.grxa.servlet.InitServlet</servlet-class>
  <init-param>
  <param-name>appid</param-name>
  <param-value>wxdb27fc2590eac6a5</param-value>
  </init-param>
  <init-param>
  <param-name>appsecret</param-name>
  <param-value>e9601e65ef89532a2e060a6bf2696372</param-value>
  </init-param>
  <load-on-startup>0</load-on-startup>
  </servlet>