在实际的项目开发过程中,总会遇到多套程序使用一个公众号的情况。而共用一个公众号,首先会遇到的应该是access_token
问题了,两个程序互相的去获取access_token
,导致被“挤下线”。
这次我遇到的情况比较简单,两套程序都是自己负责开发的,所以比较好处理,只需要修改代码,让它们共用access_token
即可。
什么是access_token?
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。
为什么会被“挤下线”呢?
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效
怎么解决被“挤下线”呢?
建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务
详细想法
微信那边建议的是,使用中控服务器统一获取和刷新access_token,但要去搞一套中控程序,那就太麻烦了,还是用现有的实在点。
这里想到的是用redis
来储存access_token
,然后A程序从redis
获取access_token
。
如果access_token
不存在或已过期,则A程序就从微信服务器获取access_token
,然后更新到redis
里去。
这样,B程序去resis
获取到的access_token
就是最新的了,不用再去微信哪里获取,导致A程序获取到的access_token
失效。
当然A跟B的顺序不是固定的,谁先发现access_token
过期,就谁去更新。然后,如果刚好并发,也有极有可能会出问题(出问题再说)。
ThinkPHP配置
因为要用TP的缓存,所以要在缓存配置里增加redis
配置,这样才能用redis
来储存缓存内容。
首先,按照手册配置缓存配置,增加Redis的配置。
<?php
use thinkfacadeEnv;
// ----------------------------------------------------------------------
// | 缓存设置
// ----------------------------------------------------------------------
return [
// 默认缓存驱动
'default' => Env::get('cache.driver', 'file'),
// 缓存连接方式配置
'stores' => [
'file' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => '',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
// 缓存标签前缀
'tag_prefix' => 'tag:',
// 序列化机制 例如 ['serialize', 'unserialize']
'serialize' => [],
],
/*** 下面这些是新加的 ***/
// Redis缓存驱动
'redis' => [
// 驱动方式
'type' => 'redis',
// 服务器地址
'host' => '127.0.0.1',
],
/*** 上面这些是新加的 ***/
],
];
EasyWeChat使用示例
虽然详细想法
里写了很多,但其中很多工作都EasyWeChat
和ThinkPHP
完成了,所以代码很简单。
下面是简单的使用示例:
// 初始化EasyWeChat,app_id和secret经过脱敏,不要zhao'chao
$wechat = EasyWeChatFactory::officialAccount([
'app_id' => 'wx4202f388888',
'secret' => 'b06e645090bb1bd0aefc6588888',
]);
// 就这么简单的一句,就可以使用Redis储存AccessToken了
$wechat->access_token->setCache(thinkfacadeCache::store('redis'));
// 发模板消息
$wechat->template_message->send([
'touser' => 'dsadasdasdas',
'template_id' => 'vN_nAl6UiLbCnCT_-lwPoGgaMZUXvY0G72Rr3C-5k6o',
'url' => 'https://blog.ll00.cn',
'data' => [
// 头部
'first' => '您有新的待审批通行证,请尽快处理!',
// 申请内容
'keyword1' => '钞票',
// 预约时间
'keyword2' => '2020年6月6日',
// 申请人
'keyword3' => '西虹市首富',
// 申请时间
'keyword4' => '2020年5月20日 13时14分',
// 底部
'remark' => '王多鱼爱夏竹冠名代码',
],
]);