zoukankan      html  css  js  c++  java
  • 微信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
    }
  • 相关阅读:
    codeforces 669C C. Little Artem and Matrix(水题)
    codeforces 669B B. Little Artem and Grasshopper(水题)
    oracle drop table recyclebin恢复
    odu恢复drop表--不通过logmnr挖掘object_id
    odu恢复drop表--通过logmnr挖掘object_id
    odu恢复delete 表
    GO学习-(7) Go语言基础之流程控制
    GO学习-(6) Go语言基础之运算符
    GO学习-(4) Go语言基础之变量和常量
    GO学习-(3) VS Code配置Go语言开发环境
  • 原文地址:https://www.cnblogs.com/objects/p/7146497.html
Copyright © 2011-2022 走看看