小程序、微信开发关于accesstoken的问题
关于小程序开发支付,或者消息推送,或者微信支付 都需要accesstoken。微信官方文档如下
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
有些开发同学每次都是现调用接口,根本不缓存accesstoken,这种首先可能会达到限制次数的问题,其次可能会存在一部分访问没有处理完,另外一个访问又重新获取accesstoken,从而导致别人的accesstoken过期了的问题。
accesstoken 默认是有每天2000次的调用限制,有些同学觉得,这个怎么能够用啊?可是accesstoken还有个属性就是有7200秒的有效期,也就是两个小时,理论上一天最多消耗12次调用,没有过期就调用缓存里面的,所以是完全够用的。
下面以java代码为例实现这个过程。
@Controller
@RequestMapping("wx")
public class WxController {
private Loggerlog = LoggerFactory.getLogger(UserController.class);
private static AccessToken myAccessToken;
@Value("${wxapp.appid}")
private String appId;
@Value("${wxapp.secret}")
private String secret;
@ResponseBody
@RequestMapping("accesstoken")
public String getAccessToken(){
try {
if (myAccessToken !=null && StringUtil.isNotEmpty(myAccessToken.getAccessToken()) && ((new Date().getTime() -myAccessToken.getDate().getTime()) /1000) <=7000) {//这里为了保险设置成7000秒过期,而不是7200秒
//没有过期
return myAccessToken.getAccessToken();
}else {
//已经过期,则重新申请
String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +appId +"&secret=" +secret;
String json = MsgHttpRequest.get(url);
JSONObject jsonObject = JSONObject.parseObject(json);
if (jsonObject.containsKey("access_token")) {
AccessToken accessToken =new AccessToken();
accessToken.setAccessToken(jsonObject.get("access_token").toString());
accessToken.setDate(new Date());
myAccessToken = accessToken;
return myAccessToken.getAccessToken();
}else {
log.error("获取getAccessToken异常:" + json);
}
}
}catch (Exception ex) {
log.error("getAccessToken错误:");
ex.printStackTrace();
}
return "";
}
}
还有一个实体类
public class AccessToken {
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
private StringaccessToken;
private Datedate;
}
其实比较简单,使用一个静态变量来当作缓存保存获取的accesstoken, 每次获取的时候比较一下是否过期了,过期了就重新获取,否则就用缓存里面的。当然你也可以把accesstoken放到redis中,设置好过期时间就可以了。