(本文介绍的是普通access_token,不是网页授权access_token)
一、普通access_token是什么?
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新。
二、注意事项
由于access_token有效期为2小时,并且每天有实时调用量上限次数,所以最好开发的时候最好把access_token存储起来,判断上次获取的access_token是否有效,如果有效,就需要再次发起请求去获取access_token了。
重复获取将导致上次获取的access_token失效
存储access_token有2种方式
- 存储在内存中(本文介绍这种方式,只适用于部署单点项目,部署多点项目会造成access_token错误)
- 存储在数据库中
三、官方文档
三、代码实例
AccessTokenUtils
/**
* access_token是公众号的全局唯一接口调用凭据
* access_token的每天有调用限额
* 长期存储access_token
* */
public class AccessTokenUtils {
private static Logger log = LoggerFactory.getLogger(AccessTokenUtils.class);
private static Map<String, String> accessTokenMap = new HashMap<>();
public static Map<String, String> getAccessToken() {
String time = accessTokenMap.get("time");
String accessToken = accessTokenMap.get("access_token");
Long nowDate = new Date().getTime();
if (accessToken != null && time != null && nowDate - Long.parseLong(time) < (1.5*60*60*1000)) {
log.info("accessToken存在,且没有超时 , 返回accessTokenMap");
return accessTokenMap;
}
synchronized (AccessTokenUtils.class) {
if(accessToken != null && time != null && nowDate - Long.parseLong(time) < (1.5*60*60*1000)) {
log.info("accessToken存在,且没有超时 , 返回accessTokenMap");
return accessTokenMap;
}
log.info("accessToken 超时 , 或者不存在 , 重新获取");
try {
String accessToken=WeiXinUtils.getAccessToken();
log.info("time:"+nowDate);
log.info("access_token:"+accessToken);
accessTokenMap.put("time", nowDate + "");
accessTokenMap.put("access_token", accessToken);
} catch (Exception e) {
log.error("微信服务器发生错误",e);
}
return accessTokenMap;
}
}
WeiXinUtils
下文代码中使用的UrlConUtil在Http请求UrlConUtil工具类中
/**
* access_token是公众号的全局唯一接口调用凭据
* */
public static String getAccessToken(){
String accessToken = "";
String grantType = "client_credential";// 获取access_token填写client_credential
String appId ="自己微信公众号的appId";// 第三方用户唯一凭证
String secret = "自己微信公众号的密钥";// 第三方用户唯一凭证密钥,即appsecret
// 这个url链接地址和参数皆不能变
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grantType + "&appid=" + appId + "&secret="+ secret;
try {
JSONObject jsonObject = UrlConUtil.httpsRequest(url, "GET", null);
logger.info("获取access_token返回的json:"+jsonObject);
Long expiresIn = jsonObject.getLong("expires_in");
logger.info("微信获取的expires_in:"+expiresIn);
String accessToken = jsonObject.getString("access_token");
logger.info("微信获取的access_token:"+accessToken);
}catch (Exception e){
logger.debug("获取access_token发生异常",e);
}
return accessToken;
}