首先明确两个概念:
openid : 小程序用户唯一标识openid
UnionID : 微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的
所以,如果我们只是小程序登录,我们需要获取“openid”作为用户的唯一标识,即普通登录,如果我们需要小程序用户既是公众号授权用户,
公众号用户也是小程序用户,即账号数据互通,我们就需要获取用户的“UnionID ”作为用户的唯一标识了
普通登录流程图:
- 通过小程序开放接口wx.login获取code
- wx.request发起后台(我们自己的后台登录接口)登录请求,传入code
- 后台开发人员在我们的服务器端调用微信api,使用code换取openid和session_key
- 后台返回登录状态,登录成功
通用用户登录过程:
这时我们需要使用UnionID 作为用户的唯一标识,UnionID 在wx.getUserInfo的返回参数encryptedData中,而且encryptedData因包含敏感信息,所以是加密数据。想要wx.getUserInfo返回encryptedData需要withCredentials 设置为 true 才行 ,而withCredentials 为 true需要先调用wx.login接口获取sessionkey,以用于encryptedData的解密。
所以登录流程如下所示。
- 通过小程序开放接口wx.login获取code
- 获取code后,将code通过服务器接口传入后台换取sessionkey与code
- 将sessionkey传入getUserInfo方法
- 在getUserInfo方法中调用小程序开放接口 wx.getUserInfo获取用户授权
- wx.getUserInfo方法设置参数withCredentials 为 true
- 若用户同意授权并授权成功,将encryptedData,sessionkey,iv通过开发者服务器接口传入后台,后台通过encryptedData的解密或取UnionID 和用户信息,然后做用户数据处理并返回信息
- 将服务器返回信息通过 wx.setStorage存入本地缓存
- 若用户拒绝授权,调用showOpenSetting方法,弹出提示框提示用户接受授权,并点击确定时调用openSetting方法进入用户授权设置页
- 用户设置授权成功后重新调用login方法,若用户依然未设置授权继续弹出提示用户授权弹出框