微信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 ...
随机推荐
- JWT&RSA实现单点登录(详细介绍)
今天给大家讲一下基于JWT&RSA的单点登录(Single Sign On,简称SSO)解决方案 概念 首先要了解几个概念 单点登录(Single Sign On) JWT RSA 背景 为什 ...
- 面试官:RabbitMQ有哪些工作模式?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 今天又.又.又来面试了,还是老规 ...
- 【课程汇总】OpenHarmony 成长计划知识赋能第三期系列课程(附链接)
OpenHarmony 开源开发者成长计划第三期知识赋能课程硬核程度再次升级,带领开发者上手 OpenHarmony 的标准系统应用开发,学习标准设备应用开发,使用 eTS UI 开发分布式应用样例, ...
- 1903021116—吉琛—Java第三周作业—eclipse创建Java程序
项目 内容 课程班级博客链接 19级信计班 这个作业要求链接 eclipse如何创建java程序 java语言基础(上) 我的课程学习目标 1. 学习博客园更多使用技巧 2. 通过作业实践熟练与熟悉掌 ...
- HashMap和Hashtable以及ConcurrentHashMap的区别
HashMap和Hashtable的区别 何为HashMap HashMap是在JDK1.2中引入的Map的实现类. HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部 ...
- vue 时间过滤器
过滤器:定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理).语法:1.注册过滤器: Vue.filter(name ,callback)或new Vue{filters:{}}2. ...
- Jenkins Build step 'Execute shell' marked build as failure
问题出现: Jenkins一直都构建成功,今天突然报错:Jenkins Build step 'Execute shell' marked build as failure 问题原因: By defa ...
- mybatis通用功能代码生成工具
mybatis操作数据库的过程中,如果只考虑单表操作,mapper和dao层基本80%的都是固定的,故而可以使用工具进行生成,文末提供自己编写的工具(基于mysql存储过程):作者其实就是使用(myb ...
- java实现空心金字塔
前言 最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面 ...
- 你不知道的JS 中——yield
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...