# 微信生态内的账户体系

本文可以理解为参考文章的学习笔记。

原文:《搞定微信生态内的账户体系,看这篇文章就够了》

用户体系是每个互联网公司都需要考虑的一个点。最好是把账户体系做成服务。这样公司如果发展了,做了多个 App,也能实现帐号的打通。

目前我司的账户体系就是一个非常混乱的状态,有 4 个业务线,每个业务线都有自己的账户体系。然后各个业务线之间还有业务关联。

目前后端是把应用 A 的手机号去应用 B 中,默认生成一个新用户。

# 一、基础概念

# 1.1、授权类型

用户授权分为两种, 静默授权,弹窗授权

  1. 静默授权

    1. 只能获取到用户的 openid
    2. 不需要弹窗,用户无感知
  2. 弹窗授权

    1. 可以获取用户的头像,昵称,unionid
    2. 会弹出,要求授权

# 1.2、openid 和 unionid

openid 的唯一性 = 用户微信号 + 应用的 appid(不同的公众号,小程序,appid 都是不同的)

unionid 的唯一性 = 用户微信号 + 开发者主体(一般是公司)

同一个微信用户在 不同的 订阅号,服务号都有不一样的 openid

同一个微信用户在 同一个主体下的 订阅号和服务号,unionid 是唯一的。

比如,公司 A 主体下有一个订阅号,一个服务号,用户 B , 在订阅号 有一个 openid ,在服务号有一个 openid,这两个不一样

但是,微信提供了 openid 换 unionid 的一个功能,利用用户在订阅号的 openid 和 服务号的 openid 可以换到同一个 unionid。

# 1.3、帐号体系有什么用?

对用户做身份的识别权限的控制,是所有公司都需要用到的。

微信提供了以下几个功能接口

  1. 微信授权弹窗
  2. 获取用户列表(针对已经关注公众号的用户)
  3. 小程序获取用户信息接口
  4. 移动应用微信登录接口

除了第二个接口,其他接口都需要用户授权。需要授权,因此就有可能用户拒绝了授权。业务上需要设计用户拒绝授权的处理。

微信文档写着,开发者需要妥善处理拒绝授权,但是并没有说应该这么妥善处理。

由于拒绝授权并没有回调事件,因此这个处理起来就比较麻烦

授权后,往 cookie 写入一个标识,如果没有标识,则认为用户拒绝了授权。

# 1.4、appid

在微信体系中,每个微信公众号,小程序,App 都是不同的应用,并且每个应用都会有一个单独的 appid。

# 二、单 appid 场景的微信账户体系建设

业务系统中,生成一个标识用户的 userid,在微信中,引导用户弹窗授权拿到 unionid , 把这两个关联起来。

# 2.1、实现步骤

  1. 将 unionid 和 userid 绑定实现限权
  2. 利用 openid 进行快速身份识别 (主要用来处理用户换手机,或者清理掉了 cookie 内的登录信息)
  3. 交互层面需要处理用户拒绝授权

# 利用 openid 进行快速身份识别

在微信内网页可以直接识别用户的 openid(静默授权),所以把 openid 和 onionid 关联在一起,当用户授权过一次,后面就不用一直授权了。

用户取消关注公众号,在关注,openid 和 onionid 不会变。

# 处理用户拒绝授权

比较常用的做法是设定一个拦截机制。 可以把强制要求授权弹窗的界面和强制要求登录的流程坐在一起。因为这两个性质比较相近。

大部分 App 端中的微信登录

  1. 点击微信登录
  2. 跳转到微信客户端,授权登录
    1. 拒绝授权,等同未登录
    2. 同意授权,返回客户端
      1. 新用户,要求注册该 App 的账户
      2. 老用户,直接登录成功
  3. 注册完,把微信的 unionid 和 userid 关联在一起

# 实践牢记事件

在数据存储方面,其实可以选择先存储 openid-unionid 的关联信息,再根据用户后续登录的情况,存储 unionid-userid 的关联信息,具体的逻辑顺序会在下一小节的流程图之中描述中展现。

# 为什么不 openid 直接和 userid 关联来标识用户?

保留扩展性,否则后期填坑火葬场。

当然有同学会问,为什么不可以通过“snsapi_base 为 scope 发起的网页授权”(静默授权)直接获取 openid,然后和 userid 关联,为什么要因为获取不到 unionid 就做拦截呢?原因很简单,因为公司会发展,迟早会做小程序,做更多地业务,到时候回过头来再填这个坑,得不偿失。

# 三、多 appid 场景的微信账户体系建设

核心还是 : unionid 关联 userid。

# 3.1、多 appid 应用如何关联

img

# 3.2、多个 appid 场景的流程图

img

# 四、其他

img

我觉得用户体系这个东西发展了这么多年,看上去很简单,但是其实里面深究起来学问也不少,但是总的来说在实际工作的时候,还是要牢牢把握住底层的核心思想,好的用户体系主要就是做两个事情,身份识别和限权。所有的工作都应该围绕身份之别和限权这两个底层需要去做的,其实我们所做的一切,万变不离其宗,就是如何让用户把身份识别的成本降到最低,如何让系统限权做的最准确。

不妨回想一下,以前的用户体系还会区分“注册”和“登录”,现在基本上就是手机短信验证码登录,没注册默认注册,这个变化其实就是上面所提到的核心思想的一个实践方案,而且经过业界各个大厂的实践,基本上可以认为是一种最佳实践方案了。

# 终、参考文章

  1. 《搞定微信生态内的账户体系,看这篇文章就够了》
Last Updated: 2/8/2020, 10:56:28 AM