想必大家也知道accessToken每天只能调用2000次 那么频繁的调用会是accessToken不够用
获取accessToken的官方文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
接下来我就简单的对这种方法进行一点优化
首先定义accessToken实体类
/**
* accesstoken 实体类
*
* @author Administrator
*
*/
public class AccessToken {
private String accessToken;// 获取到的凭证
private int expiresin;// 凭证有效时间 单位:秒
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresin() {
return expiresin;
}
public void setExpiresin(int expiresin) {
this.expiresin = expiresin;
}
}
接下来就是声明一个静态类 来存放获取到的accessToken
/**
* 用于存放生成的accesstoken
*
* @author Administrator
*
*/
public class AccessTokenInfo {
// 注意是静态的
public static AccessToken accessToken = null;
}
接下来定义一个servlet来获取assessToken
/**
* 用于获取accessToken的Servlet
*
* @author Administrator
*
*/
@WebServlet(name = "AccessTokenServlet", urlPatterns = { "/AccessTokenServlet" }, loadOnStartup = 1, initParams = {
@WebInitParam(name = "appId", value = "wx**********"),//对应公众号的appid
@WebInitParam(name = "appSecret", value = "*************") })//对应公众号的appSecret
public class AccessTokenServlet extends HttpServlet {
// 定义log4j输出
Logger logger = Logger.getLogger(this.getClass());
@Override
public void init() throws ServletException {
super.init();
//获取定义的公众号信息
final String appId = getInitParameter("appId");
final String appSecret = getInitParameter("appSecret");
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try { // 获取accessToken
AccessTokenInfo.accessToken = getAccessToken(appId, appSecret); // 获取成功
if (AccessTokenInfo.accessToken != null) {
System.out.println(AccessTokenInfo.accessToken.getAccessToken());
Thread.sleep(7000 * 1000);
// Thread.sleep(10 * 1000);// 10秒钟获取一次
} else { // 获取失败
Thread.sleep(1000 * 3);
// 获取的access_token为空 休眠3秒
}
} catch (Exception e) {
logger.error("获取accessToken异常:" + e);
try {
Thread.sleep(1000 * 10);
// 发生异常休眠10秒
} catch (Exception e1) {
logger.error("线程休眠异常:" + e1);
}
}
}
}
}).start();
}
/**
* 获取access_token
*
* @return AccessToken
*/
private AccessToken getAccessToken(String appId, String appSecret) {
/**
* 接口地址为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,其中grant_type固定写为client_credential即可。
*/
// 获取基础接口的token 微信公众号的 appid和secret
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret="
+ appSecret;
// 调用请求方法
String json = urlToJson(url);
// 把获取的数据转换为json格式
JSONObject json1 = JSONObject.parseObject(json.toString());
// 获取access_token
// String access_token = json1.get("access_token").toString();
AccessToken token = new AccessToken();
token.setAccessToken(json1.getString("access_token"));
token.setExpiresin(json1.getInteger("expires_in"));
return token;
}
/**
* 对url发送请求并获取返回的数据
*
* @param url
* @return
*/
public String urlToJson(String url) {
StringBuffer json1 = new StringBuffer();
try {
URL oracle = new URL(url);
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "utf-8"));
String inputLine = null;
// StringBuffer json1 = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
json1.append(inputLine);
}
} catch (Exception e) {
logger.error("Exception url请求错误", e);
}
return json1.toString();
}
}
这样就可以在项目启动的时候获取一次accessToken 然后接下来每两小时获取一次