• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-22) 39次浏览 已收录 0个评论
文章目录[隐藏]

<body>

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

<code>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;     }}</code>

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

<code>    $access_token=$this->getWxAccessToken();</code>

报错信息如下

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

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


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

回复内容:

<body>

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

<code>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;     }}</code>

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

<code>    $access_token=$this->getWxAccessToken();</code>

报错信息如下

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

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


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

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

……本2文来源gaodai.ma#com搞##代!^码@网3

搞代gaodaima码导致服务不稳定
使用中控服务器存储access_token,这样统一服务,不会发生业务之间的冲突,保证了数据的一致性

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:微信获取多次获取全局的access_token冲突导致无效?(算是解决)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址