思考题解析

上节课提到了一个问题:每次使用access_token时直接调用接口获取是否可以? 首先我们看一下获取access_token接口的调用频率限制:

公众号类型 每日调用上限/次
测试号 2000
服务号 100000

因为接口调用有频率限制如果站点访问量较小可以每次都调用access_token接口,如果站点访问量较大或者以后的访问量可能会增大那就需要合理规划access_token的更新与维护方案。

access_token的存储

既然使用access_token时不能每次都调用接口,那需要将有效期内的access_token进行适当的存储,每次获取时直接获取即可。如果系统访问量不是很大可以存储在数据库、缓存文件中,如果访问量较高可以存储在缓存中(memcache、redis等)。

为什么更新access_token

存储之后为什么需要更新呢?上节课提到access_token的有效期为2个小时如果到期前不更新会造成access_token失效,接口也无法正常调用。

如何更新access_token

更新的话重新调用一下api获取并保存就可以了,但是什么时候使用什么方式更新需要做一下分析。如果程序在使用access_token时判断其即将到有效期则重新调用一下接口更新是否可以呢?其实这种方案是不严谨的,因为可能会有并发造成access_token被覆盖的情况。所以比较好的方式是使用单独的中控服务器进行定时更新,如果条件不允许也没必要使用单独的服务器,可以在现有服务器上使用计划任务实现。

使用计划任务实现access_token的更新

为了方便演示本案例使用文件存储access_token,只需要将之前的程序略作修改即可,如果实际项目中使用可做对应修改。需要注意的时计划任务执行程序时程序中的路径要使用绝对路径。
程序代码如下:

//加载初始化配置 这里使用绝对路径 根据实际路径进行配置
$path = '/路径**/';
//加载初始化配置
include $path . 'config/init.php';
//构建接口URL
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
//请求接口(推荐使用curl)
$json_token = file_get_contents($url);
//json存储到文件
file_put_contents($path . 'token/token.txt', $json_token);

编写好程序后将文件保存并手动执行一下确定程序可用,例如

/usr/local/php/bin/php /home/wwwroot/weixin/token/get_access_token.php

然后使用crontab -e编辑计划任务,假设设置30分钟执行一次则可以使用

*/30      *       *       *       *  /usr/local/php/bin/php /home/wwwroot/weixin/token/get_access_token.php

设置完毕后可以检验任务是否可以定时执行,测试时可以设置成1分钟执行一次方便调试。

本文档由黎明互联官方发布