微信公眾號開發 定時獲取AccessToken
阿新 • • 發佈:2019-01-26
介面呼叫請求說明
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>