我记得以前做微信小程序的时候,是什么场景来着,也获取过access_token。
这次,是做微信公众号,发送模板消息。模板消息也需要使用到access_token。所以我们来获取一下。
官方文档地址:
获取稳定版接口调用凭据 | 微信开放文档微信开发者平台文档https://mmbizurl.cn/s/JtxxFh33r我们还是可以先去看一下官方手册,毕竟用人家的嘛。不寒碜
功能描述
- 获取小程序全局后台接口调用凭据,有效期最长为7200s,开发者需要进行妥善保存;
- 有两种调用模式: 1. 普通模式,
access_token
有效期内重复调用该接口不会更新access_token
,绝大部分场景下使用该模式;2. 强制刷新模式,会导致上次获取的access_token
失效,并返回新的access_token
; - 该接口调用频率限制为 1万次 每分钟,每天限制调用 50万 次;
- 与getAccessToken获取的调用凭证完全隔离,互不影响。该接口仅支持
POST JSON
形式的调用; - 如使用云开发,可通过云调用免维护
access_token
调用; - 如使用云托管,也可以通过微信令牌/开放接口服务免维护
access_token
调用;
调用方式
HTTPS 调用
POST https://api.weixin.qq.com/cgi-bin/stable_token
请求参数
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
grant_type | string | 是 | 填写 client_credential |
appid | string | 是 | 账号唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态) |
secret | string | 是 | 帐号唯一凭证密钥,即 AppSecret,获取方式同 appid |
force_refresh | boolean | 否 | 默认使用 false。1. force_refresh = false 时为普通调用模式,access_token 有效期内重复调用该接口不会更新 access_token;2. 当force_refresh = true 时为强制刷新模式,会导致上次获取的 access_token 失效,并返回新的 access_token |
返回参数
属性 | 类型 | 说明 |
---|---|---|
access_token | string | 获取到的凭证 |
expires_in | number | 凭证有效时间,单位:秒。目前是7200秒之内的值。 |
以上,官方文档上直接copy的。仔细看一下其实就能发现,其实还好,没那么困难的。
考虑到很多同学可能是初次接触,所以我们还是展示一下。
首先,我们要先思考一下,想好了,再敲代码。上面有说"该接口调用频率限制为 1万次 每分钟,每天限制调用 50万 次"。 或许我们单日确实也用不到50万次,单一分钟,或许一万次也用不到,可我们要考虑到一些情况,比如,咦!我们做的项目,还真就日活用户上亿不是,再咦!有人搞我们,一分钟就请求我们接口一万次。
综上考虑,我们就得做好很多防护措施。
官方还说,access_token的有效时间,有效期最长为7200s,转换过来就是两个小时
那么就是说,我们7200秒,请求一次,获取一次即可,就不要每次都请求获取新的了。
那么我们就可以,将此存入我们的数据库,mysql可以,redis也是可以的哈。以前我用过mysql,这次我用redis做示例吧。
对了,还要补充一点,我们不能真就存储7200秒,而是在这个基础上,减去300秒,就是5分钟。
官方也说了,建议这样做,因为我们正好卡在7200秒的话,那正好在这个时候我们请求过去,有网络波动,也有其他任何的原因,这时候微信那边检测,就说我们的access_token的过期的了。所以我们需要提前结束有效期,获取新的一个,这样就能避免这样的情况。综合情况以及官方给出的,我们减少300秒即可。
我们来实战一下:
$url = 'https://api.weixin.qq.com/cgi-bin/stable_token';
$paramData = [
'grant_type' => 'client_credential',
'appid' => $appInfo->_value, //这是我查询mysql中获取的
'secret' => $secretInfo->_value, //这是我查询mysql中获取的
'force_refresh' => false,
];
$response = Http::post($url,$paramData);
$resData = $response->json();
dump($resData);
结果却是这样的:
[
"errcode" => 40164
"errmsg" => "invalid ip 000.000.000.000 ipv6 ::ffff:000.000.000.000, not in whitelist rid: "
]
上面中的"000.000.000.000" 是我改过的哈。意思就是说,我的这个IP,没有写进白名单,给我截胡了。
文档有说解决方案哈:将ip添加到ip白名单列表即可。
在哪里设置呢,请看下图。登录公众号后台,先找到左侧的导航栏,然后再查看白名单,进行设置
将我们的IP地址添加之后,然后我们再请求一次试试:
可以看到,正常返回了
access_token 就是我们需要使用的
expires_in 是7200,就是告诉我们这个access_token 有7200秒的有效期
我们可以将access_token的值,单独的存到redis,也可以将返回的整个数据都存入,因为存入redis时,我们可以自己设置有效期,这样当这条数据有效期到了,没有了的时候,我们再获取新的即可。
其实我个人推荐,存入对方返回的所有数据是最佳的,这样如果对方的数据变化了,我们能清晰的看到,无论是本次对接微信,还是对接其他第三方时,这样总是最好的。
这里呢,只是做展示,所以我就存入单个的 access_token 吧
这里,我们就存到了redis,有效期呢,我们就设置在 7200减去300。 这样当这条数据失效了,我们就重新获取一条新的
方法就可以这样写:
//获取redis
//存在直接返回
//不存在,请求
//失败,看什么原因然后记录处理
//成功,存入redis
//最后返回