feat: add authenticated phone binding

This commit is contained in:
Codex
2026-06-29 09:53:44 +08:00
parent 6f0083bd13
commit 64d58d895e
12 changed files with 441 additions and 105 deletions

View File

@@ -1055,6 +1055,27 @@ Authorization: Bearer <session.token>
x-tenant-id: <tenantId>
```
### 绑定或更换手机号
微信/QQ 登录后强制绑定手机号、个人中心更换手机号,都走同一个后端命令。前端先发送 `bind_phone` 用途验证码,再提交绑定:
```text
POST /api/auth/sms/send
body: { "phone": "13800000000", "purpose": "bind_phone" }
POST /api/auth/phone/bind
Authorization: Bearer <session.token>
body: { "phone": "13800000000", "code": "123456" }
```
前端规则:
- 绑定接口必须带当前登录态,不能用 `x-user-id` 伪造用户。
- 绑定接口只接受 `bind_phone` 验证码,不接受 `login` 验证码。
- 新手机号如果已属于其它账号,后端返回 `PHONE_ALREADY_BOUND`
- 换绑成功后旧手机号登录身份会被移除;迁移期 `tk_` 其它设备 session 会被撤销,当前 session 继续可用。
- 微信手机号授权后也应由后端 adapter 换取手机号,再复用同一类绑定命令;不要在页面里持久化明文手机号授权中间数据。
### 微信小程序登录
微信小程序端调用 `Taro.login()` 获取 code然后交给后端
@@ -1087,7 +1108,7 @@ identity.unionId
- 前端不接触 `appSecret`
- 前端不会拿到微信 `session_key`
- 如果登录前已经解析到推广码,登录成功后再调用 `/api/referral/bind` 完成首绑保护。
- 手机号授权后续应走独立的“绑定手机号”接口,不要把微信手机号解密逻辑写在页面里
- 如果用户没有手机号,跳转到上面的“绑定或更换手机号”流程
## 支付对接