access_token是公众号和小程序的全局唯一接口调用凭证,调用公众号和小程序各服务端接口时都需要使用到access_token。
微信官方对于每日接口调用的次数都做了限制,这其中包括了生成access_token的接口,因此官方建议开发者使用中控服务器统一获取和刷新access_token。
中控服务器好处在于:1. 保证access_token每日都不会超出访问限制,保证服务的正常;2. 提高调用其他服务的接口的性能,因为不用再每次调用接口前先发送一次access_token获取请求。
本文主要讲解如何开发一个单文件的access_token中控脚本,该脚本能够同时以命令行和Web形式执行。
思路首先我们需要使用数据库或Redis存储公众号或小程序的应用信息,包括appid和appkey。
其次我们需要调用微信获取access_token信息的接口去获取access_token和access_token有效期(默认为expires_in字段)。
最后我们将接口获取到的access_token和有效期缓存到Redis中,这样下次请求access_token时直接从Redis返回未过期的值即可。
函数原型:getAccessToken(string $appid, bool $refresh = true): ?string。其中参数$appid为公众号或小程序的应用ID。参数$refresh表示是否强制刷新缓存。
开发(PHP版)第一步、开发实用工具集Utils
第二步、封装Redis操作
我们需要将应用信息以Hash结构存储到Redis中;在调用接口时为了保证在分布式环境下只允许一个请求能够调用微信接口,因此我们还需要创建一个分布式锁。
PHP环境操作Redis可以通过两个扩展来实现:a. C语言版phpredis b. PHP版Predis。C语言版性能优于PHP版,但是需要编译PHP扩展,因此对于无权限编译扩展的环境下不适用。本文使用PHP版Predis扩展。
使用Composer直接安装Predis扩展:
composer require predis/predis
第三步、封装微信获取AccessToken接口