美文网首页
小程序、微信开发关于accesstoken的问题

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

作者: 我不是机器猫 | 来源:发表于2019-07-05 19:17 被阅读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中,设置好过期时间就可以了。

    相关文章

      网友评论

          本文标题:小程序、微信开发关于accesstoken的问题

          本文链接:https://www.haomeiwen.com/subject/wocyhctx.html