当前位置:Gxlcms > PHP教程 > 微信获取多次获取全局的access_token冲突导致无效?(算是解决)

微信获取多次获取全局的access_token冲突导致无效?(算是解决)

时间:2021-07-01 10:21:17 帮助过:93人阅读

token默认是7200秒过期,如果有第二地方也请求同一个token的话,那么第一个token会在5分钟之内过期。也就是说我第二次请求的时候如果时间过短会引起冲突。
刚刚学习微信开发,代码写的不是很完美。只过了是否大于7200生存期的判断,看到有人说可以判断每分钟读取,不知道各位大大对我的代码有什么优化建议?谢谢

function getWxAccessToken(){
    if ( $_SESSION['access_token'] && $_SESSION['expire_time'] > time() ) {
        //未过期
        return $_SESSION['access_token'];
    }else {
        $appid        = "wx3bbf9ae731a6eb07";
        $appsecret = "2b14a75fa48825ef3c76c8949b5e030f";
        $url          = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $res =$this->https_request($url,'get','json');
        $access_token = $res["access_token"];
        //将重新获取到的access_token存到session里
        $_SESSION['access_token']=$access_token;
        $_SESSION['expire_time']=time()+7200;
        return $access_token; 
    }
}

起冲突的是同一个控制器下的一个方法,每次调用都是用

    $access_token=$this->getWxAccessToken();

报错信息如下

array(2) {
  ["errcode"] => int(40001)
  ["errmsg"] => string(81) "invalid credential, access_token is invalid or not latest hint: [pd4MfA0688vr40!]"
}

看到官方说的
0.0官方的意思就是不要用业务逻辑点去刷新token,我这么写好像就是属于用业务逻辑刷新,用第三方中控什么意思呢


把方法的绝对路径放在二维码生成器里,扫描。这样调试的结果比浏览器直接访问正确点感觉。
多数情况下,浏览器打开如果报40001,基本上程序是没问题的

回复内容:

token默认是7200秒过期,如果有第二地方也请求同一个token的话,那么第一个token会在5分钟之内过期。也就是说我第二次请求的时候如果时间过短会引起冲突。
刚刚学习微信开发,代码写的不是很完美。只过了是否大于7200生存期的判断,看到有人说可以判断每分钟读取,不知道各位大大对我的代码有什么优化建议?谢谢

function getWxAccessToken(){
    if ( $_SESSION['access_token'] && $_SESSION['expire_time'] > time() ) {
        //未过期
        return $_SESSION['access_token'];
    }else {
        $appid        = "wx3bbf9ae731a6eb07";
        $appsecret = "2b14a75fa48825ef3c76c8949b5e030f";
        $url          = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $res =$this->https_request($url,'get','json');
        $access_token = $res["access_token"];
        //将重新获取到的access_token存到session里
        $_SESSION['access_token']=$access_token;
        $_SESSION['expire_time']=time()+7200;
        return $access_token; 
    }
}

起冲突的是同一个控制器下的一个方法,每次调用都是用

    $access_token=$this->getWxAccessToken();

报错信息如下

array(2) {
  ["errcode"] => int(40001)
  ["errmsg"] => string(81) "invalid credential, access_token is invalid or not latest hint: [pd4MfA0688vr40!]"
}

看到官方说的
0.0官方的意思就是不要用业务逻辑点去刷新token,我这么写好像就是属于用业务逻辑刷新,用第三方中控什么意思呢


把方法的绝对路径放在二维码生成器里,扫描。这样调试的结果比浏览器直接访问正确点感觉。
多数情况下,浏览器打开如果报40001,基本上程序是没问题的

建议将access_token存储到数据库,这样各处业务都使用同一个token,这样就不会发生每个业务逻辑点各自请求access_token的情况了;
官方文档的意思是如果业务逻辑在多台服务器上,由于access_token和expire_time存储在session中,服务器之间不会共享session,就会导致每台服务器上的业务都会发起请求,如果其中一台服务器上的access_token尚未超时,而另一台服务器重新请求了access_token,使得第一台服务器上的access_token失效,继而使用过期的access_token去请求服务,导致服务不稳定
使用中控服务器存储access_token,这样统一服务,不会发生业务之间的冲突,保证了数据的一致性

access_token对所有的调用是通用的,没必要放session,每个人的session又不一样,一般放缓存里面,要不然你就放数据库就好了。
每次用到的时候都去数据库里面差有效期内的话,直接用,失效的话重新获取,再插入数据库。

session是基于用户的,你这样每个用户访问一次就刷一次了。
建议放到缓存或者数据库,定期刷新。

人气教程排行