Files
huang b9733c4913
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m12s
fix: 修正零售价架构错误 + 清理旧微信配置 + 归档提案 + 前端接口文档
1. 修正 retail_price 架构:
   - 删除 batch-pricing 接口的 pricing_target 字段和 retail_price 分支
     (上级只能改下级成本价,不能改零售价)
   - 新增 PATCH /api/admin/packages/:id/retail-price 接口
     (代理自己改自己的零售价,校验 retail_price >= cost_price)

2. 清理旧微信 YAML 配置(已全部迁移到数据库 tb_wechat_config):
   - 删除 config.yaml 中 wechat.official_account 配置节
   - 删除 NewOfficialAccountApp() 旧工厂函数
   - 清理 personal_customer service 中的死代码(旧登录/绑定微信方法)
   - 清理 docker-compose.prod.yml 中旧微信环境变量和证书挂载注释

3. 归档四个已完成提案到 openspec/changes/archive/

4. 新增前端接口变更说明文档(docs/前端接口变更说明.md)

5. 修正归档提案和 specs 中关于 pricing_target 的错误描述
2026-03-19 17:39:43 +08:00

3.3 KiB
Raw Blame History

client-phone-binding Specification

ADDED Requirements

Requirement: A4 发送验证码接口

系统 MUST 提供无认证验证码接口 POST /api/c/v1/auth/send-code,并复用现有验证码服务。

  • HTTP Method + Path: POST /api/c/v1/auth/send-code
  • 请求体字段:
    • phone stringMUST手机号
    • scene stringMUST业务场景bind_phone / change_phone_old / change_phone_new
  • 响应体字段:
    • cooldown_seconds intMUST本次发送后的冷却秒数
  • 错误码:
    • 1006 参数错误
    • 1003 请求过于频繁(触发任一限流)
    • 1050 短信发送失败

Scenario: 发送成功

  • WHEN 手机号格式合法且未触发限流
  • THEN 系统 SHALL 发送验证码并返回冷却时间

Requirement: A4 限频规则

系统 SHALL 对 A4 实施三层限频:手机号 60 秒冷却、同 IP 每小时 20 次、同手机号每日 10 次。

Scenario: 60 秒内重复发送

  • WHEN 同一手机号在 60 秒冷却内再次请求
  • THEN 系统 MUST 返回 1003

Scenario: 同 IP 超过小时阈值

  • WHEN 同一 IP 在 1 小时内发送次数超过 20
  • THEN 系统 MUST 返回 1003

Scenario: 同手机号超过日阈值

  • WHEN 同一手机号在当日发送次数超过 10
  • THEN 系统 MUST 返回 1003

Requirement: A5 首次绑定手机号接口

系统 MUST 提供需认证接口 POST /api/c/v1/auth/bind-phone,仅允许首次绑定。

  • HTTP Method + Path: POST /api/c/v1/auth/bind-phone
  • 请求体字段:
    • phone stringMUST新手机号
    • code stringMUST验证码
  • 响应体字段:
    • phone stringMUST已绑定手机号
    • bound_at stringMUST绑定时间
  • 错误码:
    • 1001 缺失认证令牌
    • 1002 认证令牌无效
    • 1006 参数错误
    • 1035 验证码错误或过期
    • 1037 手机号已被绑定
    • 1038 已绑定手机号不可重复绑定

Scenario: 首次绑定成功

  • WHEN 客户已登录、验证码正确且手机号未被占用
  • THEN 系统 SHALL 完成手机号首次绑定并返回绑定信息

Scenario: 已绑定用户再次调用绑定

  • WHEN 当前客户已存在绑定手机号
  • THEN 系统 MUST 返回 1038

Requirement: A6 换绑手机号接口

系统 MUST 提供需认证接口 POST /api/c/v1/auth/change-phone,并执行旧手机号与新手机号双验证码校验。

  • HTTP Method + Path: POST /api/c/v1/auth/change-phone
  • 请求体字段:
    • old_phone stringMUST旧手机号
    • old_code stringMUST旧手机号验证码
    • new_phone stringMUST新手机号
    • new_code stringMUST新手机号验证码
  • 响应体字段:
    • phone stringMUST换绑后的手机号
    • changed_at stringMUST换绑时间
  • 错误码:
    • 1001 缺失认证令牌
    • 1002 认证令牌无效
    • 1006 参数错误
    • 1035 验证码错误或过期
    • 1037 新手机号已被绑定
    • 1039 旧手机号不匹配

Scenario: 换绑成功

  • WHEN 登录客户提交正确旧/新验证码且新手机号未占用
  • THEN 系统 SHALL 更新绑定手机号为新手机号

Scenario: 旧手机号校验失败

  • WHEN old_phone 与当前客户绑定手机号不一致或 old_code 错误
  • THEN 系统 MUST 拒绝换绑并返回对应错误码