# 微信生态内的账户体系
本文可以理解为参考文章的学习笔记。
用户体系是每个互联网公司都需要考虑的一个点。最好是把账户体系做成服务。这样公司如果发展了,做了多个 App,也能实现帐号的打通。
目前我司的账户体系就是一个非常混乱的状态,有 4 个业务线,每个业务线都有自己的账户体系。然后各个业务线之间还有业务关联。
目前后端是把应用 A 的手机号去应用 B 中,默认生成一个新用户。
# 一、基础概念
# 1.1、授权类型
用户授权分为两种, 静默授权,弹窗授权
静默授权
- 只能获取到用户的 openid
- 不需要弹窗,用户无感知
弹窗授权
- 可以获取用户的头像,昵称,unionid
- 会弹出,要求授权
# 1.2、openid 和 unionid
openid 的唯一性 = 用户微信号 + 应用的 appid(不同的公众号,小程序,appid 都是不同的)
unionid 的唯一性 = 用户微信号 + 开发者主体(一般是公司)
同一个微信用户在 不同的 订阅号,服务号都有不一样的 openid
同一个微信用户在 同一个主体下的 订阅号和服务号,unionid 是唯一的。
比如,公司 A 主体下有一个订阅号,一个服务号,用户 B , 在订阅号 有一个 openid ,在服务号有一个 openid,这两个不一样
但是,微信提供了 openid 换 unionid 的一个功能,利用用户在订阅号的 openid 和 服务号的 openid 可以换到同一个 unionid。
# 1.3、帐号体系有什么用?
对用户做身份的识别和权限的控制,是所有公司都需要用到的。
微信提供了以下几个功能接口
除了第二个接口,其他接口都需要用户授权。需要授权,因此就有可能用户拒绝了授权。业务上需要设计用户拒绝授权的处理。
微信文档写着,开发者需要妥善处理拒绝授权,但是并没有说应该这么妥善处理。
由于拒绝授权并没有回调事件,因此这个处理起来就比较麻烦
授权后,往 cookie 写入一个标识,如果没有标识,则认为用户拒绝了授权。
# 1.4、appid
在微信体系中,每个微信公众号,小程序,App 都是不同的应用,并且每个应用都会有一个单独的 appid。
# 二、单 appid 场景的微信账户体系建设
业务系统中,生成一个标识用户的 userid,在微信中,引导用户弹窗授权拿到 unionid , 把这两个关联起来。
# 2.1、实现步骤
- 将 unionid 和 userid 绑定实现限权
- 利用 openid 进行快速身份识别 (主要用来处理用户换手机,或者清理掉了 cookie 内的登录信息)
- 交互层面需要处理用户拒绝授权
# 利用 openid 进行快速身份识别
在微信内网页可以直接识别用户的 openid(静默授权),所以把 openid 和 onionid 关联在一起,当用户授权过一次,后面就不用一直授权了。
用户取消关注公众号,在关注,openid 和 onionid 不会变。
# 处理用户拒绝授权
比较常用的做法是设定一个拦截机制。 可以把强制要求授权弹窗的界面和强制要求登录的流程坐在一起。因为这两个性质比较相近。
大部分 App 端中的微信登录
- 点击微信登录
- 跳转到微信客户端,授权登录
- 拒绝授权,等同未登录
- 同意授权,返回客户端
- 新用户,要求注册该 App 的账户
- 老用户,直接登录成功
- 注册完,把微信的 unionid 和 userid 关联在一起
# 实践牢记事件
在数据存储方面,其实可以选择先存储 openid-unionid 的关联信息,再根据用户后续登录的情况,存储 unionid-userid 的关联信息,具体的逻辑顺序会在下一小节的流程图之中描述中展现。
# 为什么不 openid 直接和 userid 关联来标识用户?
保留扩展性,否则后期填坑火葬场。
当然有同学会问,为什么不可以通过“snsapi_base 为 scope 发起的网页授权”(静默授权)直接获取 openid,然后和 userid 关联,为什么要因为获取不到 unionid 就做拦截呢?原因很简单,因为公司会发展,迟早会做小程序,做更多地业务,到时候回过头来再填这个坑,得不偿失。
# 三、多 appid 场景的微信账户体系建设
核心还是 : unionid 关联 userid。
# 3.1、多 appid 应用如何关联
# 3.2、多个 appid 场景的流程图
# 四、其他
我觉得用户体系这个东西发展了这么多年,看上去很简单,但是其实里面深究起来学问也不少,但是总的来说在实际工作的时候,还是要牢牢把握住底层的核心思想,好的用户体系主要就是做两个事情,身份识别和限权。所有的工作都应该围绕身份之别和限权这两个底层需要去做的,其实我们所做的一切,万变不离其宗,就是如何让用户把身份识别的成本降到最低,如何让系统限权做的最准确。
不妨回想一下,以前的用户体系还会区分“注册”和“登录”,现在基本上就是手机短信验证码登录,没注册默认注册,这个变化其实就是上面所提到的核心思想的一个实践方案,而且经过业界各个大厂的实践,基本上可以认为是一种最佳实践方案了。