# personal-customer Specification

## ADDED Requirements

### Requirement: 个人客户登录主流程改为微信授权

系统 SHALL 将个人客户登录主流程从“手机号 + 验证码登录”调整为“资产验证 + 微信授权登录”。

- 新登录入口：
  - `POST /api/c/v1/auth/verify-asset`（A1，无认证）
  - `POST /api/c/v1/auth/wechat-login`（A2，无认证）
  - `POST /api/c/v1/auth/miniapp-login`（A3，无认证）
- 请求与响应要点：
  - A2/A3 请求体 MUST 包含 `code` 与 `asset_token`
  - A2/A3 响应体 MUST 包含 `token`、`need_bind_phone`、`is_new_user`
- 错误码：
  - `1006` 参数错误
  - `1002` token 无效或过期
  - `1040` 微信授权失败

#### Scenario: 通过微信授权完成登录
- **WHEN** 用户先完成 A1，再提交 A2 或 A3
- **THEN** 系统 SHALL 完成客户识别/创建、资产绑定并返回登录 token

#### Scenario: 不再支持旧手机号直登入口
- **WHEN** 客户端调用旧手机号登录路径（如 `/api/c/v1/login`）
- **THEN** 系统 MUST 按新路由规范拒绝或迁移提示，不再作为主登录路径

### Requirement: 手机号从“登录凭据”调整为“登录后补充资料”

系统 MUST 将手机号能力调整为登录后绑定/换绑，而非登录入口。

- 相关接口：
  - `POST /api/c/v1/auth/send-code`（A4，无认证）
  - `POST /api/c/v1/auth/bind-phone`（A5，需认证）
  - `POST /api/c/v1/auth/change-phone`（A6，需认证）
- 响应字段：
  - A5/A6 MUST 返回绑定后的 `phone`

#### Scenario: 首次登录后要求绑定手机号
- **WHEN** `client.require_phone_binding=true` 且用户未绑定手机号
- **THEN** 登录响应 MUST 返回 `need_bind_phone=true`
- **THEN** 用户通过 A4+A5 完成绑定后进入业务页面

### Requirement: 微信身份字段迁移到 OpenID 关联能力

系统 SHALL 保留 `PersonalCustomer.wx_open_id` 与 `wx_union_id` 字段的兼容性，但新登录链路 MUST 以 `PersonalCustomerOpenID` 为主。

#### Scenario: 读取用户微信身份
- **WHEN** 登录流程需要按微信身份识别客户
- **THEN** 系统 MUST 优先查询 `PersonalCustomerOpenID`
- **THEN** 不再依赖 `PersonalCustomer` 单字段承载多 AppID 场景
