我们在做微信开发的时候有时候需要确认用户身份来完成登录注册、消息推送、用户关联、快捷登录等功能,但是小程序或H5应该在何时获取openid或unionid,如何才能设计出更加顺滑的操作,让产品经理们倍感头疼,今天就来简单讲讲H5和小程序获取用户信息的机制。
什么是openid、unionid和用户基本信息?
WechatIMG506.png这张图的意思是说,同一个微信用户在不同的应用中存在不同的唯一ID,就是openid,但是当两个应用绑定在同一个微信开发者平台账号下的时候,可以判断出两个openid关联的是同一个unionid,这样,开发者就知道两个应用中的两个用户其实是同一个用户。需要注意,假如两个应用没有绑定在同一个开发者账号下,那意味着无法获取到unionid。
用户基本信息包括:openid、unionid、昵称、头像、所在城市等众多信息,我们不需要明确太多,完全可以查看接口,这里要注意的是用户基本信息是包括unionid的,但是如果没有申请开发者平台账号并进行应用的绑定,那么用户基本信息是无法返回unionid的。
H5如何获取用户的openid和unionid
明确H5:
这里说的H5,是指网页应用,也就是说用户在微信客户端访问网页应用,可以通过授权机制获取到用户的信息,进而实现业务逻辑。
网页授权回调域名的说明:
(翻译一下,就是H5网页在微信公众号的配置,这个不难,也不是重点,就直接复制微信开发者文档里面的内容看看就行了)
(1) 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
(2) 授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com 无法进行OAuth2.0鉴权;
(3) 如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可。
参考文档链接
网页授权的两种形式
官方文档
方式1-静默授权获取openid
以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
方式2-非静默授权获取openid
以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
(翻译:就是说,用户可以通过授权框确认授权,获取用户的基本信息,这里的基本信息是包含unionid的,但是前提是应用已经绑定了微信开放平台的开发者账号)
到这里两种方式并没有完,微信官方文档中又增加了一条奇怪的限制:
“用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。”
这是因为聪明的开发者想到了规避用户授权就能获取到包括unionid在内的用户基本信息的方法,所以在后续的迭代中,微信屏蔽了这个接口。什么方法呢,就是用静默的方式获取到用户的openid,然后在“用户管理的接口中用openid去查用户信息”,如图:
WechatIMG508.png
那么微信为了规避这种情况的发生,所以给出了限制,使用用户管理类接口中的获取用户基本信息的接口时,必须要先关注公众号,否则返回的信息只有openid,也就是说,你只能用openid换回来openid,等于啥都没有~~~
看看用户管理类接口中的内容:
{
"user_info_list": [
{
"subscribe": 1,
"openid": "otvxTs4dckWG7imySrJd6jSi0CWE",
"nickname": "iWithery",
"sex": 1,
"language": "zh_CN",
"city": "揭阳",
"province": "广东",
"country": "中国",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/xbIQx1GRqdvyqkMMhEaGOX802l1CyqMJNgUzKP8MeAeHFicRDSnZH7FY4XB7p8XHXIf6uJA2SCunTPicGKezDC4saKISzRj3nz/0",
"subscribe_time": 1434093047,
"unionid": "oR5GjjgEhCMJFyzaVZdrxZ2zRRF4",
"remark": "",
"groupid": 0,
"tagid_list":[128,2],
"subscribe_scene": "ADD_SCENE_QR_CODE",
"qr_scene": 98765,
"qr_scene_str": ""
},
{
"subscribe": 0,
"openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg"
}
]}
其中subscribe代表是否关注了公众号,1为关注,0为未关注,在0的情况下,只返回了openid,1的情况下返回了很多信息。
综上所述
网页应用可以静默获取openid,可以授权获取用户基本信息(包括unionid)。
微信小程序如何获取用户的openid和unionid
小程序的登录时序图
api-login.2fcc9f35.jpg整个过程中,其实是静默获取到用户的openid的,这一点和早期的小程序不一样,早期的小程序是通过用户授权才能获取到openid的。
小程序获取unionid
方式1-直接调用接口(需要授权):
调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
方式2-存在同主体公众号且已经关注了该公众号(无需授权):
如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
方式3-存在同主体的公众号或移动应用且已经授权登录过该公众号或移动应用(无需授权):
如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。
方式4-五分钟内在小程序中完成过支付(无需授权):
用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。
其他方式,与云函数有关:
1、小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。
2、小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。
综上所述
小程序可以通过静默的方式获取到openid,但是需要获取unionid需要使用用户授权的方式。
总结
我们可以通过静默的方式获取h5和小程序的openid,通过授权的方式获取用户信息和unionid,其中小程序的用户信息需要考虑加密解密的机制,这里不做陈述,那么产品经理们需要注意在什么时候去获取用户信息,在什么时候去使用openid,这样才能打造出更加流畅的用户体验。
作者:王得宇AIPM
微信公众号:他们已经在路上了
他们已经在路上了
网友评论