大家都知道,微信中調用訂閱用戶接口中需要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無效,可能是調用太頻繁!"; //$strjson

throw new Exception('錯誤:取得token無效');

}

$obj = fopen("saestor://weixindata/token.txt","w+"); //SAE禁用fopen本地文件,這里需要Storage

fwrite($obj,$token);

$this -> _token = $token;

}

//封裝私有方法,調用得到Get的參數,$needToken默認為false, 不取值,這里有一個潛規則,%s為 self::$_token

private 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;

}大概意思是,默認就是從文本文件中取這個值,當這個值過期的時候,重新調用 InitToken 這個方法,獲得最新的AccessToken。這樣AccessToken就永遠不會過期了。

這是我想到的辦法,歡迎大家給出更好的方法,相互學習,相互提高。

php 防止access token过期,微信調用接口,防止Access_token過期的方法相关推荐

  1. php access token缓存,微信小程序PHP 生成access_token存入缓存

    每个小程序都会对应后台的一系列接口.access_token一天2000次,每个有效期为2小时.所以可以保存到缓存中,每隔一段时间去获取一次. 把appid和secret放在全局配置文件中,方便调用 ...

  2. 百度AI Access Token过期处理

    Access Token作为请求百度AI接口以及太多需要第三方平台开发接口的唯一凭据,都存在有效期的问题.而过期处理是很有必要的. 一.问题现状 Access Token的获取一般都是Https请求, ...

  3. 【GitHub】Personal Access Token过期导致本地仓库无法直接push到远程

    自从GitHub引入access token后,clone 私人仓库到本地需要使用它否则无法push,但access token过期后,原来token clone到本地的仓库,每次push都需要输新t ...

  4. 获取百度开放平台Access Token,调用百度统计接口

    官方文档:http://developer.baidu.com/wiki/index.php?title=docs/oauth 获取 Access Token有几种方式 由于项目需求比较简单,这里选择 ...

  5. 第三方登录access token过期问题

    前几天参加面试的时候,被面试官问道第三方登录的问题,流程其实很简单,但是当面试官问为什么要保存access token,它过不过期有什么意义.当时答得不是很对,现在总结一下: 第三方登录流程 第一步: ...

  6. PHP微信防止token过期,微信调用接口,防止Access_token过期的方法

    大家都知道,微信中调用订阅用户接口中需要Access_token,而根据微信官方文档中说明: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情 ...

  7. ACCESS TOKEN

    Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...

  8. JWT Token、ID Token、Access Token、Refresh Token

    JWT 简介 JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519 ...

  9. Access Token 与 Refresh Token【转载哒科普啊】

    Access Token 与 Refresh Token access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因为, ...

最新文章

  1. Java异常之异常机制
  2. 为什么 GROUP BY 之后不能直接引用原表中的列?
  3. Intel汇编程序设计-高级过程(上)
  4. mysql怎么显示创表的语句_141张图带你 MySQL 入门
  5. MySQL之父Michael Wideneus:有自己的电脑,我可以做任何事情
  6. 毕设题目:Matlab验证码识别
  7. Nero Burning Rom V6多区段刻录详解
  8. Sublime Text自定制代码片段之 快速生成html结构
  9. 嵌入式开发的学习路径
  10. 计算机专业法语词汇,法语计算机及网络词汇(4)
  11. 采用RP2040 MCU的树莓派Pico迷你开发板介绍
  12. 广州大学--金融股票数据分析
  13. 第三方浏览器h5 android测试,H5案例分享:使用JS判断客户端、浏览器、操作系统类型...
  14. html盒子距离上边距50px,Margin的垂直外边距问题
  15. 来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注
  16. 基于全景分割Max-Deeplab的版面分析:Towards End-to-End Unified Scene Text Detection and Layout Analysis
  17. chrome/Edge搜索技巧
  18. 气势恢弘大气的英文字体免费下载[otf,ttf,woff]
  19. 适合环保工程行业的项目管理软件
  20. 在Centos7上安装osp

热门文章

  1. java中synized_ConcurrentHashMap和Collection s.SynizedMap(Map)
  2. java socket通信需要另外加密么_Java Socket实战之五 使用加密协议传输对象
  3. All xxx functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
  4. 最强光源解析,做纺织的你知道D65,CWF,TL84,U30,HOR的区别吗?
  5. Lisp的永恒之道(转)
  6. iOS 动画之Spring动画、Block动画、GIF图
  7. ThinkJS入门+实例(实现认证权限等基本功能)
  8. 又见The request sent by the client was syntactically incorrect ()
  9. 使用一次性密码本通过 SSH 安全登录 Linux
  10. JDBC防止SQL注入