微信获取多次获取全局的access_token冲突导致无效?(算是解决)
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是基于用户的,你这样每个用户访问一次就刷一次了。
建议放到缓存或者数据库,定期刷新。
上一篇: 咸菜腌制太咸怎样处理比较好?