更新记录

1.0.0(2026-06-10) 下载此版本

111


平台兼容性

微信快捷登录绑定手机号联调开发文档

版本:v1.0
日期:2026-06-09
范围:微信小程序快捷登录后,校验是否绑定手机号;未绑定则只允许进入绑定手机号流程。

目标

微信快捷登录成功后,用户必须完成手机号绑定后才能使用账号功能。前端当前会在微信登录拿到 token 后立即调用安全手机查询接口进行校验:

  1. POST /user/login/wechat 获取 token。
  2. GET /user/secure-phone 校验当前账号是否已有有效手机号。
  3. 若未绑定,提示用户去 /pages/login/bind-phone
  4. 未绑定期间,前端只放行查询安全手机、发送绑定验证码、提交绑定手机号这三个接口。
  5. 用户在强制绑定页退出且未绑定成功,前端会清空登录态。

数据表依据

手机号不要放在 user 表中判断。当前账号体系中,相关表职责如下:

表名 用途 关键字段
user 用户主体 id, nickname, avatar_url, status
user_wechat_identity 微信小程序登录凭证 user_id, identity_type, identifier, status, last_login_at
user_auth_identity 通用登录身份,手机号身份使用 mobile user_id, identity_type, identifier, status
user_secure_phone 安全手机号/绑定手机号 user_id, phone, is_valid

绑定完成后建议同时满足:

条件 说明
user_auth_identity 存在 identity_type = mobile 用户可通过手机号登录或被家庭成员按手机号查找
user_secure_phone 存在 is_valid = 1 安全手机查询接口可返回手机号

前端当前契约

1. 微信快捷登录

POST /user/login/wechat

请求:

{
  "code": "wx.login 返回的一次性 code"
}

成功响应:

{
  "code": 200,
  "message": "操作成功",
  "data": {
    "token": "jwt-token",
    "user": {
      "id": 10001,
      "nickname": "微信用户_123456",
      "avatarUrl": ""
    },
    "isNewUser": false,
    "needBindPhone": true,
    "loginType": "wechat_mp"
  }
}

字段要求:

字段 类型 必填 说明
token string 后续接口使用 Authorization: Bearer <token>
user.id number 用户主键
user.nickname string 昵称
user.avatarUrl string 头像
isNewUser boolean 建议 是否本次自动创建用户
needBindPhone boolean 建议 后端判断是否需要绑定手机号
loginType string 建议 固定建议为 wechat_mp

前端说明:

  • 前端会保存 token。
  • 前端不会只依赖 needBindPhone,会继续调用 GET /user/secure-phone 做最终校验。
  • 如果 GET /user/secure-phone 返回空手机号、非 11 位手机号或接口失败,前端都会进入强制绑定流程。

2. 查询安全手机号

GET /user/secure-phone

请求头:

Authorization: Bearer <token>

已绑定响应:

{
  "code": 200,
  "message": "操作成功",
  "data": {
    "phone": "***"
  }
}

未绑定响应:

{
  "code": 200,
  "message": "操作成功",
  "data": {
    "phone": ""
  }
}

前端判断:

/^1\d{10}$/.test(data.phone)

只有命中 11 位手机号格式才视为已绑定。

3. 发送绑定手机号验证码

POST /user/sms/send

请求头:

Authorization: Bearer <token>

请求:

{
  "phone": "***",
  "scene": "bind_phone_after_wechat"
}

要求:

  • scene = bind_phone_after_wechat 时必须校验登录态。
  • 该接口要允许“微信已登录但未绑定手机号”的临时用户调用。
  • 验证码建议 5 分钟有效。

4. 绑定手机号

POST /user/phone/bind

请求头:

Authorization: Bearer <token>

请求:

{
  "phone": "***",
  "code": "123456"
}

成功响应:

{
  "code": 200,
  "message": "操作成功",
  "data": {
    "phone": "***"
  }
}

绑定成功后后端应写入或确认:

处理
user_auth_identity 若当前用户没有 mobile 身份,则新增;手机号被其他用户占用时拒绝
user_secure_phone 若当前用户没有有效安全手机,则新增 is_valid = 1;手机号被其他用户占用时拒绝

推荐错误码:

场景 code message
验证码过期 1005 验证码已过期
验证码错误 1006 验证码错误
手机号被其他账号绑定 1007 手机号已绑定
当前账号已绑定手机号 1007 或业务自定义码 当前账号已绑定手机号

后端推荐权限规则

前端已经做了未绑定状态拦截,但后端如果要严格保证“未绑定手机号没有使用权限”,建议在鉴权通过后增加一层手机号绑定校验。

放行接口

未绑定手机号的已登录用户必须能调用:

路径 原因
GET /user/secure-phone 前端进入前校验绑定状态
POST /user/sms/sendscene = bind_phone_after_wechat 获取绑定验证码
POST /user/phone/bind 提交绑定手机号

登录注册、忘记密码等未登录接口继续按现有白名单处理。

拦截逻辑建议

1. AuthenticationInterceptor 校验 JWT,解析 userId。
2. 若请求路径属于绑定手机号放行列表,直接放行。
3. 查询 user_secure_phone 是否存在 user_id = 当前用户 且 is_valid = 1。
4. 若不存在,返回 PHONE_NOT_BOUND:
   code = 1004
   message = 手机号未绑定
   solution = 请先完成手机号绑定
5. 若存在,放行后续业务接口。

注意:

  • 不建议通过 user.phone 判断,因为 user 表没有手机号字段。
  • 如果要同时要求手机号登录身份存在,可再检查 user_auth_identity 是否存在 identity_type = mobile
  • 为避免每个请求都查库,可以后续考虑 JWT claim 或短期缓存;第一版联调建议先查 user_secure_phone,逻辑更直观。

前端已完成的配合点

文件 行为
common/session.js 新增 pending_bind_phone 状态、手机号缓存、强制跳转工具
common/request.js 未绑定状态下只放行 secure-phonesms/sendphone/bind
pages/login/login.vue 微信登录后调用 GET /user/secure-phone 做最终校验
pages/login/bind-phone.vue 强制绑定状态下,未绑定退出会清空登录态
pages/home/home.vue 主入口发现待绑定状态时跳绑定页
pages/control/control.vue 主入口发现待绑定状态时跳绑定页
pages/mine/mine.vue 主入口发现待绑定状态时跳绑定页
pages/addDevice/addDevice.vue 添加设备入口发现待绑定状态时跳绑定页

联调测试用例

用例 准备数据 预期结果
微信首次登录,无手机号 user_wechat_identity 可创建,user_secure_phone 无记录 登录后弹窗提示绑定手机号,确认后进入绑定页
未绑定用户点击首页/控制/我的 本地存在 token 和 pending_bind_phone 自动跳绑定页
未绑定用户请求设备/家庭接口 本地存在 pending_bind_phone 前端拦截并提示先绑定手机号
未绑定用户发送绑定验证码 有 token,scene = bind_phone_after_wechat 后端发送验证码成功
绑定手机号成功 验证码正确,手机号未被占用 写入手机号身份和安全手机号,前端进入首页
绑定页未绑定直接返回 强制绑定状态 前端清空登录态并回登录页
已绑定用户微信登录 user_secure_phone.is_valid = 1 登录后直接进入首页
手机号被其他账号占用 目标手机号已在其他用户绑定 后端返回手机号已绑定,前端展示错误

和现有文档的差异

docs/wechat-login-api.md 更偏向微信登录基础接口;本文档补充的是“微信登录后手机号绑定权限”的联调契约。后续如果后端完成强权限拦截,建议把本文档作为验收标准。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。