微信小程序登录与账号关联流程
场景一:用户已关联,静默登录
- 小程序 → 小程序:用户打开小程序,自动调用
wx.login()获取临时code。 - 小程序 → 后端:发送
POST /sys/login,请求体{ "grantType": "wxMa", "code": "xxx" }。 - 后端 → 微信:用
code调用微信接口换取openid。 - 微信 → 后端:返回
openid。 - 后端 → 后端:查询数据库,检查
openid是否已关联用户账号。- 如果已关联:
- 生成 Token 和用户信息。
- 后端 → 小程序:返回登录成功响应(包含 Token、userInfo)。
- 小程序 → 小程序:跳转至首页。
- 如果未关联:
- 后端 → 小程序:返回登录失败(提示“需关联账号”,并返回openid和unionid)。
- 小程序 → 小程序:跳转到登录页面(一般为手机号授权页)。
- 如果已关联:
场景二:用户未关联,在登录页操作
此时用户已在登录页,有两种方式完成登录和关联。
方式一:手机号一键授权(推荐)
- 小程序 → 小程序:用户点击“手机号登录”按钮,调用
wx.getPhoneNumber()获取加密数据和新的code。 - 小程序 → 后端:发送
POST /sys/login,请求体{ "grantType": "wxMaPhone", "code": "yyy", "wx_openid": "xxx","wx_unionid": "zzz" }。 - 后端 → 后端:解密数据,获取用户手机号。
- 后端 → 后端:查询该手机号是否已注册:
- 如果未注册:
- 创建新用户账号。
- 将
openid和手机号绑定到该账号。
- 如果已注册:
- 将当前
openid关联到该已有账号。
- 将当前
- 如果未注册:
- 后端 → 后端:生成 Token 和用户信息。
- 后端 → 小程序:返回登录成功响应。
- 小程序 → 小程序:跳转至首页。
方式二:传统登录 + 手动关联
- 小程序 → 后端:用户输入用户名/密码 或 手机号+验证码,完成登录。
- 后端 → 后端:验证凭据正确。
- 后端 → 小程序:返回登录成功(Token)。
- 小程序 → 后端:立即调用
POST /sys/relThirdAccountByCode,请求体{ "relType": "WxMa", "code": "zzz" }。 - 后端 → 微信:用
code换取openid。 - 微信 → 后端:返回
openid。 - 后端 → 后端:将当前登录的用户账号与
openid关联。 - 后端 → 小程序:返回关联成功。
- 小程序 → 小程序:跳转至首页。
流程关键点总结
| 步骤 | 说明 |
|---|---|
/sys/login?wxMa | 静默登录入口,决定用户是否已关联。 |
/sys/login?wxMaPhone | 一键登录+注册+关联,用户体验最佳。 |
/sys/relThirdAccountByCode | 传统登录后必须调用,否则下次仍需手动登录。 |
code 一次性 | 每个 code 只能使用一次,获取后立即传给后端。 |
| 关联是关键 | 只有 openid 与账号关联后,才能实现下次“静默登录”。 |
时序图

