微信小程序登录与账号关联流程

场景一:用户已关联,静默登录

  1. 小程序小程序:用户打开小程序,自动调用 wx.login() 获取临时 code
  2. 小程序后端:发送 POST /sys/login,请求体 { "grantType": "wxMa", "code": "xxx" }
  3. 后端微信:用 code 调用微信接口换取 openid
  4. 微信后端:返回 openid
  5. 后端后端:查询数据库,检查 openid 是否已关联用户账号。
    • 如果已关联
      1. 生成 Token 和用户信息。
      2. 后端小程序:返回登录成功响应(包含 Token、userInfo)。
      3. 小程序小程序:跳转至首页。
    • 如果未关联
      1. 后端小程序:返回登录失败(提示“需关联账号”,并返回openid和unionid)。
      2. 小程序小程序:跳转到登录页面(一般为手机号授权页)。

场景二:用户未关联,在登录页操作

此时用户已在登录页,有两种方式完成登录和关联。


方式一:手机号一键授权(推荐)

  1. 小程序小程序:用户点击“手机号登录”按钮,调用 wx.getPhoneNumber() 获取加密数据和新的 code
  2. 小程序后端:发送 POST /sys/login,请求体 { "grantType": "wxMaPhone", "code": "yyy", "wx_openid": "xxx","wx_unionid": "zzz" }
  3. 后端后端:解密数据,获取用户手机号。
  4. 后端后端:查询该手机号是否已注册:
    • 如果未注册
      1. 创建新用户账号。
      2. openid 和手机号绑定到该账号。
    • 如果已注册
      1. 将当前 openid 关联到该已有账号。
  5. 后端后端:生成 Token 和用户信息。
  6. 后端小程序:返回登录成功响应。
  7. 小程序小程序:跳转至首页。

方式二:传统登录 + 手动关联

  1. 小程序后端:用户输入用户名/密码 或 手机号+验证码,完成登录。
  2. 后端后端:验证凭据正确。
  3. 后端小程序:返回登录成功(Token)。
  4. 小程序后端立即调用 POST /sys/relThirdAccountByCode,请求体 { "relType": "WxMa", "code": "zzz" }
  5. 后端微信:用 code 换取 openid
  6. 微信后端:返回 openid
  7. 后端后端:将当前登录的用户账号与 openid 关联。
  8. 后端小程序:返回关联成功。
  9. 小程序小程序:跳转至首页。

流程关键点总结

步骤说明
/sys/login?wxMa静默登录入口,决定用户是否已关联。
/sys/login?wxMaPhone一键登录+注册+关联,用户体验最佳。
/sys/relThirdAccountByCode传统登录后必须调用,否则下次仍需手动登录。
code 一次性每个 code 只能使用一次,获取后立即传给后端。
关联是关键只有 openid 与账号关联后,才能实现下次“静默登录”。

时序图

时序图