小程序、微信开发关于accesstoken的问题

2019-07-05  本文已影响0人  我不是机器猫

关于小程序开发支付,或者消息推送,或者微信支付 都需要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中,设置好过期时间就可以了。

上一篇下一篇

猜你喜欢

热点阅读