getStableAccessToken

我记得以前做微信小程序的时候,是什么场景来着,也获取过access_token。

这次,是做微信公众号,发送模板消息。模板消息也需要使用到access_token。所以我们来获取一下。

官方文档地址:

获取稳定版接口调用凭据 | 微信开放文档微信开发者平台文档icon-default.png?t=N7T8https://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_typestring填写 client_credential
appidstring账号唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
secretstring帐号唯一凭证密钥,即 AppSecret,获取方式同 appid
force_refreshboolean默认使用 false。1. force_refresh = false 时为普通调用模式,access_token 有效期内重复调用该接口不会更新 access_token;2. 当force_refresh = true 时为强制刷新模式,会导致上次获取的 access_token 失效,并返回新的 access_token

返回参数

属性类型说明
access_tokenstring获取到的凭证
expires_innumber凭证有效时间,单位:秒。目前是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
//最后返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸享龙枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值