微信调用接口,防止Access_token过期的方法
来源:互联网 发布:麦当劳 知乎 编辑:程序博客网 时间:2024/04/28 16:26
大家都知道,微信中调用订阅用户接口中需要Access_token,而根据微信官方文档中说明:
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效
所以这就导致我们每次去获取订阅用户相关信息的时候都去重新取access_token。这就造成两个问题。
1. 慢,因为取access_token是远程在腾讯提供的API网址上,所以会有一定的延迟。
2. 访问次数越多,超出接口调用限制,会被腾讯限制。我就遭过。后来查API手册才知道有这句话:
默认每个公众帐号都不能超过下面的频率限制。 当超出调用接口频率限制,调用对应接口将会收到如下错误信息:
{"errcode":45009,"errmsg":"api freq out of limit"}
接口名称 频率限制
获取凭证接口 200(次/天)
自定义菜单创建接口 100(次/天)
自定义菜单查询接口 1000(次/天)
自定义菜单删除接口 100(次/天)
所以针对此问题,我想出了用文本文件或XML来存取动态的access_token。反正2小时才过期,写入又不频繁。当然你也可以存取到数据库。
同样的我用到了SAE的Storage
然后对访问用户相关信息和得到AccessToken的类 进行了封装:
//得到订阅用户 (返回数组)public function GetUserList(){$strjson = $this -> GetUrlReturn("https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s");$openidarr= $strjson->data->openid;//print_r($openidarr); 调试return $openidarr;}//得到订阅用户详情(返回对象)public function GetUserDetail($openid){$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid={$openid}";$strjson = $this -> GetUrlReturn($url);return $strjson;}/*** 私有成员变量 存token值* 因为//access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。* 正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。*/private $_token ;/*** 私有方法**///得到Token对象并写入到配置文件private function InitToken(){$url = sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",APPID, SECRET);//echo APPID;$ch = curl_init(); //创建一个新url资源curl_setopt($ch, CURLOPT_URL,$url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$a = curl_exec($ch);$strjson=json_decode($a);$token = $strjson->access_token;if (empty($token)){//修改 {"errcode":45009,"errmsg":"api freq out of limit"}echo "错误:取得token无效,可能是调用太频繁!"; //$strjsonthrow new Exception('错误:取得token无效'); }$obj = fopen("saestor://weixindata/token.txt","w+"); //SAE禁用fopen本地文件,这里需要Storagefwrite($obj,$token);$this -> _token = $token;}//封装私有方法,调用得到Get的参数,$needToken默认为false, 不取值,这里有一个潜规则,%s为 self::$_tokenprivate function GetUrlReturn($url, $needToken = false){//第一次为空,则从文件中读取if (empty($this -> _token)){$obj = fopen("saestor://weixindata/token.txt","r"); $this -> _token = fgets($obj,1000);}//为空则重新取值if (empty($this -> _token) || $needToken){$this ->InitToken(); }$newurl = sprintf($url, $this -> _token);$ch = curl_init(); //创建一个新url资源curl_setopt($ch, CURLOPT_URL,$newurl);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$a = curl_exec($ch);$strjson=json_decode($a);//var_dump($strjson); //开启可调试if (!empty($strjson-> errcode)){switch ($strjson-> errcode){case 40001:$this -> GetUrlReturn($url, true); //重新取值,可能是过期导致break;case 41001:throw new Exception("缺少access_token参数:".$strjson->errmsg); break;default:throw new Exception($strjson->errmsg); //其他错误,抛出break;}}return $strjson;}
这是我想到的办法,欢迎大家给出更好的方法,相互学习,相互提高。
0 0
- 微信调用接口,防止Access_token过期的方法
- 防止Access_token过期的方法
- 微信接口调用凭证access_token的管理
- 微信开发-access_token 过期解决方法
- 微信企业号开发之access_token接口调用示例
- 微信获取用户信息的两个接口和两个ACCESS_TOKEN
- 微信获取用户信息的两个接口和两个ACCESS_TOKEN
- 微信的全局接口使用凭证access_token和网页授权临时access_token
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
- 微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题
- 微信开发,access_token,时间上没有过期,但已失效的问题
- (已解决)access_token没过期,但已失效的问题{"errcode":40001}-java-微信
- 获取微信基础接口凭证Access_token
- 获取微信基础接口凭证Access_token
- openjudge 计算概论 字符串1:统计字符数
- java.util.Stack创建栈
- 基于 RBAC 的 Web Security Framework 的研究与应用
- VS2010中使用Modeling Project定制DSL以及自动化代码生成
- 音速启动(VStart)中使用相对路径存储应用链接
- 微信调用接口,防止Access_token过期的方法
- Delphi6-xe5 中的MD5实现方法
- eclipse 打开已有的项目
- 解决android SDK 打不开的方法(WIN8 64bit)
- 通过众筹方式获得项目启动的第一笔资金
- Linux netstat命令详解
- 递归查找文件加下内容有str字符串的文件
- 新媒体销售人要大胆开口
- 静态库的基本使用