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, //这就是我们想要的值哈,解释如下表格

谷歌同样的关键字,返回的结果是:

谷歌搜索结果

打开第一个页面,看到的内容是:

内容2

谷歌对语义的解析更独道,即便百度声称中文搜索很专业。英文那就更没得比了,百度的结果是不着边,谷歌一般都是第一条解决需要。 这种可以体现搜索价值的产品被墙,某些角度来讲实在是阻碍人类进度。