微信开发之小程序登录相关的各类ID
发表时间:2021-1-5
发布人:葵宇科技
浏览次数:75
最近在实际业务中,为了配合产品同事优化小程序的登录流程,同时还想通过微信授权登录 + 手机号授权自动为用户创建一个符合基础用户服务体系的业务账户。从而降低用户使用产品的链路成本。
在沟通过程中,发现很有必要梳理一下关于小程序登录相关的所谓如何实现静默授权
、如何实现主动授权
、如何获取手机号
、什么是小程序的 UnionID
的等等衍生问题概念、获取方式、使用场景。
所以在查阅微信小程序官方文档、以及网络上同行们的文章之后,总结出了本人对微信小程序登录相关的各类ID,以及授权、登录的简单流程做了以下整理。
目录
- UnionID
- AppID
- OpenID
- 原始ID
- 登录和授权
UnionID
- 什么是 UnionID
- 如果开发者拥有多个移动应用、网站应用和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID 是相同的。
-
如何获取 UnionID
- 需要绑定开发者账号的小程序,否则无法获取到 UnionID
- 调用接口
wx.getUserInfo
,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。(通过wx.getUserInfo
,需要业务接口做对应的解密处理,纯小程序前端无法处理) - 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过
wx.login
+code2Session
获取到该用户UnionID
,无须用户再次授权。(code2Session
为服务端调用接口) - 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过
getPaidUnionId
接口获取该用户的UnionID
,无需用户授权。注意:本接口仅在用户支付完成后5分钟内有效,请开发者妥善处理。 - 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过
cloud.getWXContext
获取UnionID
。 - 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过
cloud.getWXContext
获取UnionID
。
-
应用建议
- 通过 UnionID 与开发平台的唯一性关系,可以针对同一个 UnionID 在统一的用户体系关联出唯一用户的相关需求。
- 利用 UnionID 可以准确地帮助品牌筛选出,公众号矩阵中同时关注多个公众号的忠诚粉丝。让品牌更好地了解公众号矩阵中账号之间的联系,进行多个公众号之间的联动和传播。
AppID
-
什么是 AppID
- AppID 是小程序的身份证号码,是微信公众平台上的小程序 ID,有了它,微信客户端才能确定你的小程序“身份”,并使用微信提供的高级接口。
-
如何获取 AppID
- 常规方法:小程序后台查看
- 电脑端,微信公众平台登录小程序账号
- 进入小程序后台 —「开发」—「开发设置」 查看
- 或者进入小程序后台 —「设置」 — 「基本设置」 — 「帐号信息」
- 简单方法:查看小程序资料
- 手机端,在微信小程序里搜该小程序名字
- 如图示例操作即可
- 神秘方法:知道小程序名字
- 电脑端,在微信公众号文章编辑后台,选择插入小程序
- 支持插入任意小程序,适合批量查看小程序的appid,快捷操作 (输入小程序名字后,再次点击小程序名字)
- 如图示例操作即可
- 不管你是小程序开发者,普通用户,还是公众号运营者,以上 3 种方法,都可以使用。
- 常规方法:小程序后台查看
-
AppSecret
- 什么是 AppSecret : 小程序唯一凭证密钥,多配合于 AppID 一起使用
- 获取方式:参考如何获取 AppID 的常规方法,在小程序后台查看
-
应用建议
- 在实现小程序登录流程时,需要通过 AppID + AppSecret 作为入参通过业务方的 Server 服务获取对应的用户信息
- 需要保证 AppSecret 的安全性,避免泄漏
- 在通过业务方的 Server 服务与微信开放平台进行 API 交互时,大多数情况都需要使用 AppID + AppSecret 作为入参进行通信,如推送等业务场景
OpenID
- 什么是 OpenID
- OpenID 是这个用户在这个小程序里的唯一标识。每个用户肯定都有。同一个用户在不同的小程序中的 OpenID 是不一样的。
-
如何获取 OpenID
- 调用 wx.login(),获取临时 code
- 将获取到的 code 发送给后台换取 openid
-
应用建议
- 用 OpenID 作为简单的用户唯一标识,也可以用它与业务用户体系做关联
- 一些需要调用 OpenID 作为入参微信接口需要使用
原始 ID
-
什么是原始 ID
- 申请微信小程序时,微信小程序平台分配的唯一编号
-
如何获取原始 ID
- 参考如何获取 AppID 的常规方法、简单方法
-
应用建议
- 小程序找回、注销等
- 微信开发平台与小程序交互时需要(如 App 打开小程序)
登录和授权
-
登录和授权的说明
- 在微信小程序中,登录和授权是完全两个独立的事情。登录只是通过 wx.login 获取用户在此时使用小程序产生的 code ,需要通过 Server 将 code 通过 auth.code2Session 获取用户唯一标识。
- 授权是通过 wx.getUserInfo 来获取用户的微信信息,同时可以通过返回的 vi 等加密数据传给 Server 端,用于解密后存储或校验业务用户的微信信息。
- 登录和授权完全没有关系
-
登录
- 微信小程序登录:小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
- 登录流程时序
- 说明
- 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
- 之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
- 注意
- 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
- 临时登录凭证 code 只能使用一次
-
用户信息授权
- 微信小程序用户信息授权
- 调用
wx.getUserInfo
- 需要对
button
设置open-type="getUserInfo"
的属性 - 将用于加密的数据传递给服务端,如
rawData
signature
encryptedData
iv
等
- 调用
- 服务端解密用户授权数据
- 将小程序业务端通过
wx.getUserInfo
获取到 加密数据进行解密 - 结合已有的业务用户,创建新的用户或对已有用户补全微信账户相关的信息
- 将小程序业务端通过
- 微信小程序用户信息授权
-
手机号授权
- 获取方式
- 获取微信用户绑定的手机号,需先调用
wx.login
接口。 - 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用
button
组件的点击来触发。 - 需要将
button
组件open-type
的值设置为getPhoneNumber
,当用户点击并同意之后,可以通过bindgetphonenumber
事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合session_key
以及app_id
进行解密获取手机号。
- 获取微信用户绑定的手机号,需先调用
- 注意事项
- 目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。
- 在回调中调用
wx.login
登录,可能会刷新登录态。此时服务器使用code
换取的sessionKey
不是加密时使用的sessionKey
,导致解密失败。建议开发者提前进行login
;或者在回调中先使用checkSession
进行登录态检查,避免login
刷新登录态。
- 获取方式
-
应用建议
- 注意登录与授权没有必然联系
- 登录后的
OpenID
是需要通过服务器调用微信接口获取 - 业务可以根据授权用户信息 + 授权手机号的结合,来创建新的业务用户
杂谈
- 静默授权:我们常说的静默授权其实就是通过调用小程序提供的
wx.login
换取code
后,获取用户OpenID
以及其他业务关联的信息,因此我们常说的静默授权其实就是不主动调用用户信息授权。 - 至此,针对微信小程序登录相关的前端知识点内容,基本梳理完成,也达到了在业务开发中,作为前端开发对小程序登录的基础知识的梳理和总结。
- 本文主要梳理了微信小程序相关的 ID 含义,以及对应的本人在工作中总结出的使用场景。
- 同时根据实际的应用场景,也确定了登录与授权没有必然的联系。
- 以业务为参考,也梳理出在实际应用中可以通过微信用户信息授权+手机号授权来创建一个符合业务用户体系的注册流程。
- 本文随着小程序的发展必然会有一定的时效性,具体实时内容,建议参考微信公众平台小程序官方文档。
作者:hauk0101
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。