1 引言
本文介绍:
- 公众号接入的流程;
- 公众号与小程序联动;
- 公众号消息通知;
- 附带一个小彩蛋,其实也是一个吐槽,百度 vs 谷歌
2 公众号接入
接入有满足以下几个条件就可以了:
- 实名认证
- 要是想打通小程序,还需要申请并实名一个开放平台用户,并将小程序和公众号都添加
- 公众号需要配一个接入接口,两个作用:GET方式验证域名 + POST方式接收微信消息
3 公众号与小程序联动
简单说就是用户在不同的程序有不同的ID(即open id),公众号和小程序分属不同的程序,而它们又都隶属于一个主体之下, 因此还有另一个统一ID(即union id),就是通过这个统一ID来实现公众号和小程序的联动的。
联动有什么作用?
举个例子,用户在小程序上下单了,在公众号上发消息通知用户,为什么不用小程序消息通知?小程序消息通知也可以, 但是由于它是一个公共频道,有严格的调用限制,每次调用都需要用户在小程序界面上有响应,才能赋能。
为了拿到union id,有什么办法呢?微信的指导思想在这里, 以下几个相关做法:
- 前提条件:前文已经提到过,将两个程序都要加到开放平台账号名下
如果没有加到开放平台,小程序jcode2session接口 返回的将只有open id:
{"session_key":"ZhXVspjocbU6ZDGvCikOXA==","openid":"oUwwN5OlVJwH4yXVpzxxxIeAs"}
, 反之则是含有union id的:{"session_key":"UNGzlEu6mWadO3Gt2Nn+HQ==","openid":"opq1H4z4TRenAwxxxLK3oK3aY","unionid":"oZgMowNYzXpi0vxxx8abTGFKE"}
- 方法1:直接让用户在微信上打开授权链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx650d3xxx4dca328&redirect_uri=https://yidu.xxx.com/v1/wx/mp/authorize/recall&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect, 这个需要用户点击授权按钮的(只需要一次),则可拿到类似以下信息:
{
"access_token": "27_vnMRvezIXd4kAys1XLKZ6Sug5eL5OXBnJwYPmlQceayyOlqzw0lG4gedpEUquzGifchHgLFtRxpmkIDv5tiCL3949Uq4uVq_4r6YPjlPzpA",
"expires_in": 7200,
"refresh_token": "27_8UM_0EJL-Rn93bMJLZ0deZ90Gu16SwOlNostzX8QFkeZKXh9VVlX4AtvSe6zYs88yLSO96QFmAJKsYW6u0y9s1b5RADPGUDqFeLl5ZFjrlk",
"openid": "oikJZ1inJeMkSVEqV2uGQHK9XovA",
"scope": "snsapi_userinfo",
"unionid": "oZgMowNYzXpi0vcqcOzY8abTGFKE"
}
注意:
(1)scope=snsapi_userinfo
表示的获得用户信息,如果用scope=snsapi_base
则少unionid这项
(2)这个授权只是拿数据,能在后端与小程序用户关联上,与关注公众号、公众号发消息无关!
- 方法2(推荐):直接拿openid去查用户信息,后端请求链接:https://api.weixin.qq.com/cgi-bin/user/info?openid=oikJZ1lho-IYxxUXdw&lang=zh_CN&access_token=x-OC4ChjIwY8GAXgAFAXRO ,就可以拿到如以下信息:
{
"subscribe": 1, // 这个表示是否已经关注公众号
"openid": "oikJZ1lho-IYRxxxcTPznGMUXdw",
"nickname": "•Mr",
"sex": 1,
"language": "zh_CN",
"city": "深圳",
"province": "广东",
"country": "中国",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/xx/132",
"subscribe_time": 1575016243,
"unionid": "oZgMowMxsxxKBSjwdL_Fw",
"remark": "",
"groupid": 0,
"tagid_list": [],
"subscribe_scene": "ADD_SCENE_SEARCH",
"qr_scene": 0,
"qr_scene_str": ""
}
openid怎么来?用户关注公众号,微信就会给消息到用户后台,就是前文提到的POST接收消息的接口。
简单汇总一下这些接口:
-
小程序登录,由code拿到union id:https://api.weixin.qq.com/sns/
jscode2session
?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code -
前端给微信授权,微信把用户信息给后端:https://open.weixin.qq.com/connect/oauth2/
authorize
?appid=wx650d3xxx4dca328&redirect_uri=https://yidu.xxx.com/v1/wx/mp/authorize/recall&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect -
后端去微信拿授权码:https://api.weixin.qq.com/sns/oauth2/
access_token
?appid=%s&secret=%s&code=%s&grant_type=authorization_code -
后端去微信请求用户信息:https://api.weixin.qq.com/cgi-bin/user/info?openid=oikJZ1lho-IYxxUXdw&lang=zh_CN&access_token=27_4KIEf26fiFK8cQcxxgAFAXRO
4 公众号消息通知
只要用户关注了公众号,就能给用户发消息了。请求链接:https://api.weixin.qq.com/cgi-bin/message/template/send
?access_token=27_4KIEf26fiFK8xxxjIwY8GAXgAFAXRO,BODY里的内容是:
{
"touser": "oikJZ1inJeMxxuGQHK9XovA", // 这个公众号用户的编号
"template_id": "oMqhnL3hz4xxKMgO2Ofx08RtOMplVLWI",
"url": "",
"topcolor": "#FF0000",
"data": {
"first": {
"value": "亲爱的读者,您已经归还《最后的慈悲》,共1本书",
"color": "#000000"
},
"keyword1": {
"value": "湖洲图书馆",
"color": "#173177"
},
"keyword4": {
"value": "2019-11-20 14:30:00",
"color": "#173177"
},
"remark": {
"value": "欢迎下次光临",
"color": "#000000"
}
}
}
5 彩蛋
小程序端能加一个条幅,引导用户去关注,没关注出来可以,但是要是用户已经关注过,如何不出来这个条幅?一般情况,用户关注和取关都能收到微信的消息,
但是这个可不一定靠谱,直接去微信查应该比较稳妥,于是百度一下,关键字:微信接口 查用户是否关注了公众号
,返回的结果是:
打开第一个页面,看到的内容不太想要:
其实它里面有隐藏关键信息:“subscribe”: 1, //这就是我们想要的值哈,解释如下表格
谷歌同样的关键字,返回的结果是:
打开第一个页面,看到的内容是:
谷歌对语义的解析更独道,即便百度声称中文搜索很专业。英文那就更没得比了,百度的结果是不着边,谷歌一般都是第一条解决需要。 这种可以体现搜索价值的产品被墙,某些角度来讲实在是阻碍人类进度。