小赖子的英国生活和资讯

缓存 微信API的 Token

阅读 桌面完整版

微信提供API接口, 使用接口的第一步是需要通过以下API获得一个 access token, 这个 token 目前有效期 2个小时.

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

如果在过期之前调用API将会返回同样的 token, 问题是这个API的调用次数每天是有上限的 所以我们需要尽可能的重复利用这个 token. 我们可以把这个 token 存到数据库或者文件中 只要不过期 就可以反复使用.

以下PHP脚本就提供了这样一个功能, 把获取的token和有效期存到文件中 只要不过期就提供缓存的值 这样可以减少调用微信API的次数(减少因调用API所带来的延时).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
define('APPID', '您的APPID');
define('APPSECRET', '您的APP SECRET');
define('TOKENFILE', 'token.txt'); 
define('EXPIRY', '有效期.txt');
 
date_default_timezone_set('UTC');
 
function getToken() {
  $tokenfile = TOKENFILE;
  $expiryfile = EXPIRY;
  if (is_file($tokenfile)) {
    $token = trim(file_get_contents($tokenfile));
  }
  if ($token && is_file($expiryfile)) {
    $x = (integer)trim(file_get_contents($expiryfile));
    if ($x > 0) {
      if (time() < $x) { // 这个 token 仍然有效
        return $token;
      } 
    }  
  } 
  // 无法找到有效的 token 所以就访问微信API获得这个 token
  $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=" . APPSECRET;
  $data = trim(file_get_contents($url)); 
  if ($data) {
    $data = json_decode($data, true);
    if ($data) {
      $token = $data['access_token'];
      $expiry = time() + (integer)$data['expires_in'];
      // 把得到的数据缓存在文件中 以备下次使用 
      file_put_contents($tokenfile, $token, LOCK_EX);
      file_put_contents($expiryfile, $expiry, LOCK_EX);
      return $token;
    }
  }
  // 无法获得 例如网络原因
  return ""; 
}
define('APPID', '您的APPID');
define('APPSECRET', '您的APP SECRET');
define('TOKENFILE', 'token.txt'); 
define('EXPIRY', '有效期.txt');

date_default_timezone_set('UTC');

function getToken() {
  $tokenfile = TOKENFILE;
  $expiryfile = EXPIRY;
  if (is_file($tokenfile)) {
    $token = trim(file_get_contents($tokenfile));
  }
  if ($token && is_file($expiryfile)) {
    $x = (integer)trim(file_get_contents($expiryfile));
    if ($x > 0) {
      if (time() < $x) { // 这个 token 仍然有效
        return $token;
      } 
    }  
  } 
  // 无法找到有效的 token 所以就访问微信API获得这个 token
  $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=" . APPSECRET;
  $data = trim(file_get_contents($url)); 
  if ($data) {
    $data = json_decode($data, true);
    if ($data) {
      $token = $data['access_token'];
      $expiry = time() + (integer)$data['expires_in'];
      // 把得到的数据缓存在文件中 以备下次使用 
      file_put_contents($tokenfile, $token, LOCK_EX);
      file_put_contents($expiryfile, $expiry, LOCK_EX);
      return $token;
    }
  }
  // 无法获得 例如网络原因
  return ""; 
}

英文: How to Cache WeChat Token via PHP?
Github 代码

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version