由于Access Token有效期只有7200秒,而每天调用获取的次数只有2000次,所以需要将Access Token进行缓存来保证不触发超过最大调用次数。另外在微信公众平台中,绝大多数高级接口都需要Access Token授权才能进行调用,开发者需要使用中控服务器统一进行缓存与更新,以避免各自刷新而混乱。
下面代码使用缓存来保存Access Token并在3600秒之后自动更新。

1 class class_weixin
2 {
3 var $appid = APPID;
4 var $appsecret = APPSECRET;
5
6 //构造函数,获取Access Token
7 public function __construct($appid = NULL, $appsecret = NULL)
8 {
9 if($appid && $appsecret){
10 $this->appid = $appid;
11 $this->appsecret = $appsecret;
12 }
13
14 //方法1. 缓存形式
15 if (isset($_SERVER['HTTP_APPNAME'])){ //SAE环境,需要开通memcache
16 $mem = memcache_init();
17 }else { //本地环境,需已安装memcache
18 $mem = new Memcache;
19 $mem->connect('localhost', 11211) or die ("Could not connect");
20 }
21 $this->access_token = $mem->get($this->appid);
22 if (!isset($this->access_token) || empty($this->access_token)){
23 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret;
24 $res = $this->http_request($url);
25 $result = json_decode($res, true);
26 $this->access_token = $result["access_token"];
27 $mem->set($this->appid, $this->access_token, 0, 3600);
28 }
29
30 //方法2. 本地写入
31 $res = file_get_contents('access_token.json');
32 $result = json_decode($res, true);
33 $this->expires_time = $result["expires_time"];
34 $this->access_token = $result["access_token"];
35
36 if (time() > ($this->expires_time + 3600)){
37 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret;
38 $res = $this->http_request($url);
39 $result = json_decode($res, true);
40 $this->access_token = $result["access_token"];
41 $this->expires_time = time();
42 file_put_contents('access_token.json', '{"access_token": "'.$this->access_token.'", "expires_time": '.$this->expires_time.'}');
43 }
44 }
45
46 protected function http_request($url, $data = null)
47 {
48 $curl = curl_init();
49 curl_setopt($curl, CURLOPT_URL, $url);
50 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
51 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
52 if (!empty($data)){
53 curl_setopt($curl, CURLOPT_POST, 1);
54 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
55 }
56 curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
57 $output = curl_exec($curl);
58 curl_close($curl);
59 return $output;
60 }
61 }

上面代码中,定义了一个类class_weixin,在类的构造函数中来更新并缓存Access Token,该函数介绍使用了两种方法。
方法一:使用memcache缓存的方法,首先对memcache进行初始化(第15行~第22行),然后读取缓存中的Access Token值(第21行),如果该值不存在或者为空值(第22行),则重新接口获取(第23行~第26行),并将值存在缓存中同时设置过期时间为3600秒(第27行)。
方法二:使用本地文件读写的方式,首先读取文件access_token.json中的值并将文件中的JSON格式字符串进行编码转成数组(第31行~第34行),并将文件中access_token和expires_time值保存到this对象中,然后判断上次保存的时间距离现在是否已超过3600秒(第36行),如果已经超过则重新调用接口获取(第37行~第41行),并将Access Token和时间更新到文件access_token.json中(第42行)。
最后,类中定义了一个protected型函数http_request,该函数使用curl实现向微信公众平台接口以get或post方式请求数据,几乎适用于所有微信接口数据的访问及提交。

如果读者在使用方法二的时候不能自动创建文件或者抛出语法错误,那么可以自己在同一级目录下先创建一个access_token.json的文件,并把以下初始内容保存在该文件中。

{
"access_token":"abcdefghijklnm",
"expires_time":1166327133
}

微信access_token缓存与更新的更多相关文章

  1. C# 微信access_token缓存和过期刷新

    摘自:http://blog.csdn.net/hechurui/article/details/22398849 首先建立一个Access_token类 /// <summary> // ...

  2. 解决微信浏览器缓存站点入口文件(IIS部署Vue项目)

    最近开发的微信公众号项目中(项目采用Vue + Vux 构建,站点部署在IIS8.5上),遇到个非常奇葩的问题,发布站点内容后,通过微信打开网址发现是空白页面(后来验证是微信浏览器缓存了入口文件-in ...

  3. 微信支付(20140923更新)商户支付密钥key的生成与设置

    微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 设置商户号支付密钥方法如下: 1. 申请通过审核后,打开微信发来 ...

  4. js的动态加载、缓存、更新以及复用(三)

    总体思路 1.  建立一个js服务,该服务实现通用js文件的加载.依赖.缓存.更新以及复用. 2.  各个项目如果使用通用js,可(bi)以(xu)使用js服务实现加载. 3.  Js服务只提供通用的 ...

  5. checking在浏览器为应用缓存查找更新时触发

    离线的Web应用,就是在设备不能上网的时候还能运行应用.html5把离线应用作为重点,主要是开发人员的心愿.离线应用的开发的步骤有:首先应该知道设备是否能够上网;然后应该还能访问一定的资源(如图像.C ...

  6. ecshop微信支付(0923更新)商户支付密钥key的生成与设置

    ECSHOP 微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 申请微信支付手机版部分时需要填写的配置接口地址: ...

  7. 微信支付(0923更新)商户支付密钥key的生成与设置

    微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 设置商户号支付密钥方法如下: 1. 申请通过审核后,打开微信发来 ...

  8. OAuth2.0学习(1-8) 授权方式五之Access_Token令牌过期更新

    OAuth2.0的Access_Token令牌过期更新 如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌. 客户端发 ...

  9. 获取微信access_token

    /** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...

随机推荐

  1. mpvue使用scss

    安装scss 安装命令如下,不带版本号可能会导致报错 npm i sass-loader@7.3.1 -D npm i node-sass@4.14.1 -D 然后修改 build 文件夹下的 web ...

  2. LC-283

    题目链接:https://leetcode-cn.com/problems/move-zeroes/ 首先想到了快排(简易思想),0为中间点, 把不等于0(注意题目没说不能有负数)的放到中间点的左边, ...

  3. Metaspaloit漏洞利用

    Metaspaloit介绍Metaspaloit介绍 Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提 ...

  4. SpatiaLite 数据库使用记录

    SpatiaLite 数据库使用记录 官网 https://www.gaia-gis.it/fossil/libspatialite/index 下载地址 https://www.gaia-gis.i ...

  5. form表单请求

    form 表单的acton属性指向url:端口号/(服务器get,post的参数), meyhod='get'/'post'  请求方式,必须要加上name属性. <form action=&q ...

  6. vue3 监听路由($route)变化

      setup() {      // ...   },   watch: {     $route(m, n) {       console.log('mm', m)       console. ...

  7. 牛客网 第十八届浙大城市学院程序设计竞赛(同步赛)J--万万没想到 啦啦啦啦啦

    我觉得我可以继续wa下去(手动魔鬼笑)--------------------------------------------   原题链接:https://ac.nowcoder.com/acm/c ...

  8. 从0开始基于Webpack5 搭建HTML+Less 前端工程

              基于Webpack5 搭建HTMl+Less的前端项目 新建一个文件夹(比如命名为webpack) 用编辑器打开该文件夹,并在编辑器的终端执行 npm init -y 自动创建pa ...

  9. ThreadLocal的原理及产生的问题

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. ThreadLocal的原理 特点 ThreadLocal和Sychro ...

  10. python学习-Day23

    目录 今日内容详细 logging模块(续集) 日志模块的主要组成部分 配置字典 配置字典在项目中的使用 第三方模块 如何利用工具下载第三方模块 查看当前解释器下载的第三方模块 下载第三方模块 直接使 ...