微信开发之 Access Token

微信开发会经常用到 access_token,如使用 Jssdk、发送模板消息、拉取用户列表、修改自定义菜单等等。
微信开发有两个 access_token,做 Oauth2 授权登录的 access_token 和其它时候的 access_token,显然上面的举例都属于“其它时候”。
所以,请忽略“Oauth2 授权登录”,以下讲到的均是“其它时候的 access_token”。

access_token 特性:

  • 过期时间。每次获取 access_token,微信会返回其过期时间,当前版本过期时间为 7200,也就是两个小时,一旦 access_token 过期,就得重新获取。
  • 唯一性。一旦获取 access_token,当前 access_token 就是唯一可用的,之前获取的全部失效。
  • 接口次数有限。每天可获取 access_token 十万次。

以上三个特性,决定了 access_token 必须做全局缓存

注意:调用接口时,需登录“微信公众平台-开发-基本配置”提前将服务器 IP 地址添加到 IP 白名单中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function getAccessToken() {
$access_token = S($this->appid);
if($access_token == false){
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
$res = json_decode($this->curlGet($url));
$access_token = $res->access_token;
S($this->appid,$access_token,7000);
}
return $access_token;
}
function curlGet($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
  • S( ) 是 ThinkPHP 3.2 自带的文件缓存,有过期机制,可替换为其他缓存函数。
  • curlGet( ) 使用 curl( ) 而不要使用 file_get_contents( )。
  • 过期时间设置为 7000,一定程度上避免因为网络问题导致 access_token 过期
  • 项目若有其它地方需要用到access_token,建议调用此方法,或至少使用同样的缓存方式,避免使用无效的access_token