微信access_token缓存与更新
由于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缓存与更新的更多相关文章
- C# 微信access_token缓存和过期刷新
摘自:http://blog.csdn.net/hechurui/article/details/22398849 首先建立一个Access_token类 /// <summary> // ...
- 解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
最近开发的微信公众号项目中(项目采用Vue + Vux 构建,站点部署在IIS8.5上),遇到个非常奇葩的问题,发布站点内容后,通过微信打开网址发现是空白页面(后来验证是微信浏览器缓存了入口文件-in ...
- 微信支付(20140923更新)商户支付密钥key的生成与设置
微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 设置商户号支付密钥方法如下: 1. 申请通过审核后,打开微信发来 ...
- js的动态加载、缓存、更新以及复用(三)
总体思路 1. 建立一个js服务,该服务实现通用js文件的加载.依赖.缓存.更新以及复用. 2. 各个项目如果使用通用js,可(bi)以(xu)使用js服务实现加载. 3. Js服务只提供通用的 ...
- checking在浏览器为应用缓存查找更新时触发
离线的Web应用,就是在设备不能上网的时候还能运行应用.html5把离线应用作为重点,主要是开发人员的心愿.离线应用的开发的步骤有:首先应该知道设备是否能够上网;然后应该还能访问一定的资源(如图像.C ...
- ecshop微信支付(0923更新)商户支付密钥key的生成与设置
ECSHOP 微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 申请微信支付手机版部分时需要填写的配置接口地址: ...
- 微信支付(0923更新)商户支付密钥key的生成与设置
微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 设置商户号支付密钥方法如下: 1. 申请通过审核后,打开微信发来 ...
- OAuth2.0学习(1-8) 授权方式五之Access_Token令牌过期更新
OAuth2.0的Access_Token令牌过期更新 如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌. 客户端发 ...
- 获取微信access_token
/** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...
随机推荐
- FreeRTOS+CubeMX编程实践
一.关于FreeRTOS 1.什么是FreeRTOS? FreeRTOS是一个轻量级的操作系统.FreeRTOS提供的功能包括:任务管理.时间管理.信号量.消息队列.内存管理.记录功能等,可基本满足较 ...
- vim 下几种比较省劲的方式(vi结合着用)
Vim的几种模式 正常模式:可以使用快捷键命令,或按:输入命令行. 插入模式:可以输入文本,在正常模式下,按i.a.o等都可以进入插入模式. 可视模式:正常模式下按v可以进入可视模式, 在可视模式下, ...
- Vue踩坑1——驼峰命名
使用自定义Vue组件的时候,其他个方面都正常,但是浏览器就是显示不出自定义标签里的内容 <!DOCTYPE html> <html lang="en"> & ...
- python基础练习题(题目 对10个数进行排序)
day24 --------------------------------------------------------------- 实例037:排序 题目 对10个数进行排序. 分析:先输入1 ...
- XCTF练习题---MISC---easycap
XCTF练习题---MISC---easycap flag:FLAG:385b87afc8671dee07550290d16a8071 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一个流量 ...
- 【爬虫+情感判定+Top10高频词+词云图】“刘畊宏“热门弹幕python舆情分析
一.背景介绍 最近一段时间,刘畊宏真是火出了天际,引起一股全民健身的热潮,毕竟锻炼身体,是个好事! 针对此热门事件,我用Python的爬虫和情感分析技术,针对小破站的弹幕数据,分析了众多网友弹幕的舆论 ...
- 【mq】从零开始实现 mq-08-配置优化 fluent
前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...
- springCloud 微服务通过minio实现文件上传和文件下载接口
直接上代码吧,好多文章的下载都写的不明不白的,让人理解错,气死了!! 文件上传功能 文件上传很简单,首先你得部署好minio,然后写好配置信息,我的是动态读取nacos上配置的yml @Autowir ...
- AQS源码探究之竞争锁资源
AQS源码探究---竞争锁资源 我们进入ReentrantLock源码中查看其内部类 Sync 对AQS进行扩展公共方法并定义抽象方法的抽象类 FaireSync 实现公平锁的AQS的实现类 UnFa ...
- 4┃音视频直播系统之浏览器中通过 WebRTC 进行桌面共享
一.共享桌面原理 共享桌面在直播系统中是一个必备功能 共享者:每秒钟抓取多次屏幕,每次抓取的屏幕都与上一次抓取的屏幕做比较,取它们的差值,然后对差值进行压缩:如果是第一次抓屏或切幕的情况,即本次抓取的 ...