首先明确两个概念:

openid : 小程序用户唯一标识openid 

UnionID : 微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的

所以,如果我们只是小程序登录,我们需要获取“openid”作为用户的唯一标识,即普通登录,如果我们需要小程序用户既是公众号授权用户,

公众号用户也是小程序用户,即账号数据互通,我们就需要获取用户的“UnionID ”作为用户的唯一标识了

普通登录流程图:

JAVA公众号通过小程序的openId获取unionId 小程序和公众号的openid_公众号

  1. 通过小程序开放接口wx.login获取code
  2. wx.request发起后台(我们自己的后台登录接口)登录请求,传入code
  3. 后台开发人员在我们的服务器端调用微信api,使用code换取openid和session_key
  4. 后台返回登录状态,登录成功

通用用户登录过程:

    这时我们需要使用UnionID 作为用户的唯一标识,UnionID 在wx.getUserInfo的返回参数encryptedData中,而且encryptedData因包含敏感信息,所以是加密数据。想要wx.getUserInfo返回encryptedData需要withCredentials 设置为 true 才行 ,而withCredentials 为 true需要先调用wx.login接口获取sessionkey,以用于encryptedData的解密。

所以登录流程如下所示。


  1. 通过小程序开放接口wx.login获取code
  2. 获取code后,将code通过服务器接口传入后台换取sessionkey与code
  3. 将sessionkey传入getUserInfo方法
  4. 在getUserInfo方法中调用小程序开放接口 wx.getUserInfo获取用户授权
  5. wx.getUserInfo方法设置参数withCredentials 为 true
  6. 若用户同意授权并授权成功,将encryptedData,sessionkey,iv通过开发者服务器接口传入后台,后台通过encryptedData的解密或取UnionID 和用户信息,然后做用户数据处理并返回信息
  7. 将服务器返回信息通过 wx.setStorage存入本地缓存
  8. 若用户拒绝授权,调用showOpenSetting方法,弹出提示框提示用户接受授权,并点击确定时调用openSetting方法进入用户授权设置页
  9. 用户设置授权成功后重新调用login方法,若用户依然未设置授权继续弹出提示用户授权弹出框