接口调用请求说明
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>