首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》5.3 案例实践

关灯直达底部

5.3.1 自动缓存与更新Access Token

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

下面代码使用缓存来保存Access Token并在3600s之后自动更新。


 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环境,需要开通memcache16             $mem = memcache_init;17         }else {                                        // 本地环境,须安装memcache18             $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_cre       dential&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         $callback_ip = $this->get_callback_ip;36         if (time > ($this->expires_time + 3600) || !isset($callback_ip['ip_list'])){37             $url = "https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_cre       dential&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行),并将值存在缓存中,同时设置过期时间为3600s(第27行)。

方法二:使用本地文件读写的方式,首先读取文件access_token.json中的值并对文件中的JSON格式字符串进行编码转成数组(第31~34行),再将文件中access_token和expires_time的值保存到this对象中,然后判断上次保存的时间距离现在是否已超过3600s(第36行)。如果已经超过,则重新调用接口获取(第37~41行),并将Access Token和时间更新到文件access_token.json中(第42行)。

最后,类中定义了一个protected型函数http_request,该函数使用curl实现向微信公众平台接口以get或post方式请求数据,几乎适用于所有微信接口数据的访问及提交。