微信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 ...
随机推荐
- 32位x86处理器架构
我们看看32 位 x86 处理器的基本架构特点.这些处理器包括了 Intel IA-32 系列中的成员和所有 32 位 AMD 处理器. 操作模式 x86 处理器有三个主要的操作模式:保护模式.实地址 ...
- Go 框架学习之旅 ① 深入解析 net/http 启动服务的层级逻辑
Web Server. net/http 标准库怎么学. 库函数. 结构定义. 结构函数. 思维导图解析HTTP服务端. 层级逻辑. 创建框架的Server结构. OSI参考模型. TCP/IP五层模 ...
- Electron 从零创建一个 Windows/OS X/Linux 的桌面可执行程序
[外链图片转存失败(img-3RucrgcX-1562556984462)(http://7vzsvy.com1.z0.glb.clouddn.com/electron-1-2.png "E ...
- Blazor 组件库 BootstrapBlazor 中Editor组件介绍
组件介绍 Editor组件是对Summernote 组件的二次封装. 组件分为div模式和editor模式. 默认状态下editor模式的组件样子如下: 其代码如下: <Editor @bind ...
- 分布式任务调度平台XXL-JOB安装及使用
一.为什么需要任务调度平台 在Java中,传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题: 不支持集群.不支持统计.没有管理平台.没有失败报警.没有监控等等而且在现在分布 ...
- 二次封装这几个 element-ui 组件后,大大减少了我 CRUD 的时间
element-ui 因其组件丰富.可拓展性强.文档详细等优点成为 Vue 最火的第三方 UI 框架.element-ui 其本身就针对后台系统设计了很多实用的组件,基本上满足了平时的开发需求. 既然 ...
- rocketmq消息及流程
1.为什么用mq 优势 主要有3个: 应用解耦(降低微服务之间的关联). 异步提速(微服务拿到mq消息后同时工作). 削峰填谷(可以消息堆积) 劣势 系统可用性降低(MQ一旦宕机整个系统不可用) 复杂 ...
- 给swap分区扩容
一.先添加一块硬盘,如果硬盘空间还有没有被分区的也可以使用,再创建一个分区(分区可以是主分区或者扩展的逻辑分区) fdisk /dev/sdb n 代表创建分区 p 代表 ...
- 第一个MVC程序
配置版 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version="1.0" e ...
- QY-19 GNSS位移监测站 地质灾害在线监测-实时预警
概述 GNSS的全称是全球导航卫星系统(Global Navigation Satellite System),它是泛指所有的卫星导航系统,包括全球的.区域的和增强的,如美国的GPS.俄罗斯的Glon ...