实现多个小程序和公众号的用户关联
1、微信公众平台官方文档
为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的在这里插入代码片OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID,可以在用户管理-获取用户基本信息(UnionID机制)文档了解详情。
如果你已是按照微信官方文档实现, 恭喜你, 不用再往下看了,我们不折腾。
上面描述得非常清楚, 每个微信用户进入公众号和小程序都会分别产生不同的OpenID, 如想获得用户唯一标识UnionID, 则必须同时绑定到同一个开放平台账号下
本文就是为差300元去开放平台认证的码友
2、准备工作
- 必须得别拥微信小程序和公众号的AppID和AppSecret
- 具备简单的微信小程序和后端开发能力
3、应用场景说明
当你拥有一个创意点子, 半柱香的时间开发了一个逆天微信小程序。
但痛苦的事也随之而来,小程序是用完即走,根本沉淀不了用户, 这时就该公众号登场了,公众号与小程序相辅相成在于,公众号能为小程序留存粉丝并与粉丝互动,引导粉丝进入小程序,实现公众号的变现。同时,小程序配合公众号,也能大大的提升用户黏性,增加复购。
这里给各位看官介绍一种轻松实现两个OpenID建立关联的方法,用户只需进入一次小程序即可建立关联,接着往下看
4、实现步骤
上硬菜了
a、获取微信小程序openId (用户唯一标识)
获取用户code:
wx.login({
success: res => {
// res.code 得到微信小程序用户一次性code
wx.request({
url:'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + res.code + '&grant_type=authorization_code',
data: {
},
header: {
'content-type': 'json'
},
success: function (u) {
var openid = u.data.openid //返回openid
}
})
}
})
注:以上代码为一个非常不规范的示例, 仅为了演示实现思路和步骤。(你在开发时, 请千万不要直接在小程序中留下你的 appid和secret, 必须通过后端服务器中转)
b、借助web-view获取到用户公众号的OpenID
在前一步骤中获取到了wxOpenID, 这时先不着急让用户进入小程序主页面。 可再通过一个后端服务查询当前wxOpenID是否与gzhOpendID建立关联, 如果没有则, 可以将用户跳转到你准备好的web-view页面这个坑里, 逻辑代码如下:
// 检查是否已建立 wxOpenID与gzhOpendID关系
wx.request({
url: 'http://XXXX', //后台URL 略
success(res) {
if(!res.data.exist){
//如果不存在则直接跳走
wx.navigateTo({
url: '/pages/home/webview?wxid=wxOpenid'
})
}
}
});
// 空壳啥也没干的 web-view “/pages/home/webview”
wxml:
<web-view id="viewopen" src="{
{src}}" bindload="onbindLoad">
</web-view>
JS
Page({
data: {
src: ""
},
onLoad: function (options) {
//
let redirect_url = 'https//XXX/api_XXX?wxopenid=' + options.wxid;
this.data.src = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=公众号的appid&redirect_uri=' + eascape(redircturl) + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';
this.setData({
src: this.data.src
})
}
})
c、在redirect_ur后端API服务中获取gzhOpenID
以上URL为获取公众号用户的Code, 获取成功后会跳转到你指定的返回URL中, 这时你就可以在你的“https//XXX/api_XXX”中拿到用户的code, 因为已将用户的wxOpenID做为参数传递到了你的后台API页面, 这时只需要通过 刚拿到的公众号code换取用户的gzhOpendID即可, 最后就是提醒你, 直接将得来不易的两个关系保存到你的数据表中, 以供下次使用。
获取公众号的OpenID接口URL:string.Format(“https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code”, gzh_appid, gzh_secret, code)
4、进坑容易出坑也 so easy
这一步很关键, 用户掉进坑不出来, 那么你这小程序也算白折腾了。
在第二步 B 中留的后端URL如果只干了, 获取gzhOpenID也太对不起它超高的颜值了。 微信平台都喜欢给我们留一个redirect_url, 这里我们也给 ‘https//XXX/api_XXX’ 留一个返回URL, 加上第二步的URL则拼接完整后’https//XXX/api_XXX?wxopenid=XXXX&returnurl=https://XXX/newurl.html’,你没看错, 就是html。 这时估计就明白我的用心良苦了。
在第三步获取到用户的gzhOpendID,建立关系后, 通过重定向地址(Response.Redirect(url)),将以上不起眼的newurl.html返回给web-view,这时才总算发辉它的价值了, 转载html并执行
我们打开newurl.html神秘面纱, 发现也不过如此:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
</HEAD>
<BODY>
</BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function fan()
{
wx.miniProgram.navigateBack({
delta: 0,
})
}
//-->
</SCRIPT>
</HTML>
看到没也真的是空空如也, 就告诉了web-view怎么掉坑的就怎么出坑(返回一上页), 是不是真 so easy 请在评论区你说了算
5、开启你的互动应用场景
各位码友们应用场景交给你们的留言
— 欢迎拍砖 —