微信服务号的access_token获取及使用方法
access_token有2个小时的时效性,要有一个机制保证最长2个小时重新获取一次
因为接口调用上限每天2000次,所以不能调用太频繁
基于以上2点
这里要处理的就是:系统启动时,初始化一个线程进行token的获取,在token过期之前就行再次获取。保证可用性。
首先:appid和appsercret要在测试号或者公众号中获取到
1,web.xml中配置一个servlet进行监听
<!-- 配置初始化获取微信权限token的servlet -->
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>
com.xxx.weixin.InitServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
2,处理servlet并注入appid和appsecret参数启动线程
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = LoggerFactory.getLogger(InitServlet.class);
public void init() throws ServletException {
logger.info("****初始化微信access_token获取****");
try {
logger.info("weixin api appid:" + WeiXinConstant.getAppid());
logger.info("weixin api appsecret:" + WeiXinConstant.getAppsecret());
if ("".equals(WeiXinConstant.getAppid()) || "".equals(WeiXinConstant.getAppsecret())) {
logger.error("微信获取accessToken时 ,appid 和 appsecret无效。");
} else {
// 启动定时获取access_token的线程
logger.info("****启动线程获取微信access_token");
new Thread(new TokenThread()).start();
}
} catch (Exception e) {
e.printStackTrace();
logger.error("获取微信access_token出错了===", e);
}
}
}
3,线程的实现最好在7000秒以内进行再次获取token
使用的时候 直接TokenThread.accessToken.getToken() 就ok了
public class TokenThread implements Runnable {
private static Logger log = LoggerFactory.getLogger(TokenThread.class);
public static AccessToken accessToken = WeiXinUtil.getAccessToken(WeiXinConstant.getAppid(), WeiXinConstant.getAppsecret());
public void run() {
log.info("--------------------TokenThread进来 了------------------------------");
while (true) {
try {
accessToken = WeiXinUtil.getAccessToken(WeiXinConstant.getAppid(), WeiXinConstant.getAppsecret());
if (null != accessToken) {
log.info("微信获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
// 休眠7000秒
Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);
} else {
log.info("微信获取access_token为空了,休眠60秒后重新获取。");
// 如果access_token为null,60秒后再获取
Thread.sleep(60 * 1000);
}
} catch (InterruptedException e) {
try {
Thread.sleep(60 * 1000);
} catch (InterruptedException e1) {
log.error("线程休眠出错=={}", e1.getMessage());
}
log.error("获取微信token线程出错=={}", e.getMessage());
}
}
}
}
4,例:获取用户信息返回json
返回值:{“city”:”“,”country”:”中国”,”groupid”:0,”headimgurl”:”“…}
//获取openid参考上一篇
https://blog.csdn.net/alen_en/article/details/80944373
//获取用户信息
JSONObject jsonObject = WeiXinUtil.getUserInfo(TokenThread.accessToken.getToken(),openid);
具体方法
public static JSONObject getUserInfo(String accessToken, String openid) {
String requestUrl = WeiXinConstant.userinfo_url.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openid);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
return jsonObject;
}
// 直接获取用户信息
public static String userinfo_url = “https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN“;