登录和授权
登录和授权的说明
- 在微信小程序中,登录和授权是完全两个独立的事情。登录只是通过 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
以及其他业务关联的信息,因此我们常说的静默授权其实就是不主动调用用户信息授权。