前言最近写微信相关的功能,要求用户必须关注公众号才能使用功能,所以我们要有一个办法去判断是否关注了公众号,查了下,网上好多乱七八糟的教程,全都没说到点子上,当然也有可能是历史原因,微信的api年年改。...
前言
最近写微信相关的功能,要求用户必须关注公众号才能使用功能,所以我们要有一个办法去判断是否关注了公众号,查了下,网上好多乱七八糟的教程,全都没说到点子上,当然也有可能是历史原因,微信的api年年改。
教程
获取用户信息判断是否关注
实际上现在用于用户是否判断关注公众号,微信官方有提供一个接口,接口会返回一个subscribe字段,用于告知该用户是否关注。
官方文档:获取用户基本信息(UnionID机制)
GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
可以看到它有要求三个参数:
参数是否必须说明access_token是调用接口凭证openid是普通用户的标识,对当前公众号唯一lang否返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
其中openid就是用户的openid,而access_token就不一样了,它不是用户的access_token而是公众号的access_token。
获取微信公众号Access token
如何获取这个token,需要使用这个接口:
官方文档:获取 Access token
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数是否必须说明grant_type是获取access_token填写client_credentialappid是第三方用户唯一凭证secret是第三方用户唯一凭证密钥,即appsecret
这个接口需要用到公众号的appid和secret,而且官方不建议频繁请求,因为这个接口返回的token过期时间还挺久,所以建议自己做个缓存处理,如果token在有效期内就不用再请求该接口。
那么现在接口都凑齐了,流畅就是:
用户先通过接口获取到微信登录的code,code传到后端接口,后端拿到接口通过code取得用户的openid,然后后端存储的access_token是否过期,如果过期了就重新请求获取到,然后通过openid和token请求获取用户基本信息接口,然后通过这个接口返回的subscribe字段是否关注公众号,从而做一个特殊处理。
多环境下token接口的问题
当我们的环境出现多个的时候,获取token的接口就会有问题,比如我们现在有三个环境,本地开发、测试环境、生产环境,一般情况,测试环境除了域名不同,其他的配置会和生产相同,这样测试环境测试没问题就会直接推动到生产,但是问题也在这。
当我们在测试环境也通过https://api.weixin.qq.com/cgi-bin/token接口来获取Access token时,它会给你返回一个新的token,同时会使得上次返的token失效,哪怕它还在有效时间,这就导致了一个问题,如果你做了token缓存处理,测试端请求了新token,你生产环境的token就会失效,但是你又根据了过期时间做了缓存,导致一直用的过期token发请求。
这个设计就贼***,然后官方会在token过期失效的message中给你返回如下内容:
bash复制代码invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r
我打开这个链接发现官方新提供了一个新接口,估计是在论坛给人喷的受不了了,终于给了个接口,这个接口美名其曰# 获取稳定版接口调用凭据,说白了就是一个接口功能修复版,通过这个接口获取的token在有效期内得到的是同一个,不管你请求了多少次,然后它的expires_in过期时间也是动态的,如果你这个token有效期还有一个半小时,那么它就是返的一个半小时的秒数。
这样就保证了,我们在测试环境和生产环境,得到的都是同一个token,而且还不会使得另一边的token失效,非常省事。