Files
platforms/docs/操作日志_用户端APP_支付密码_20260908.md
czl231 3ef33b531d 已完成用户APP首期功能开发
交付用户端首期页面、配套接口、后台资源及测试文档。用户APP构建、静态分析和三个管理后台构建通过;完整测试仍有2项失败,后端模型注释检查未通过,详见交付记录。
2026-09-13 00:57:32 +08:00

39 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 支付密码开发与验证记录
操作时间2026-09-08
操作类型:扩展、修复
影响模块:用户设置、钱包密码、各业务端共用验证码与支付密码校验。
## 操作前后
设置中的支付密码原为未开放入口。现接通`/settings/payment-password`,读取当前钱包的`payment_password_set`,区分首次设置、旧密码修改、验证码找回;状态缺失进入错误重试,不能推断为未设置。密码限定六位数字、二次确认、请求中禁止重复提交,错误保留表单,仅收到`changed=true`才提示成功。
后端更新增加旧散列条件防止并发覆盖密码散列不进入SQL日志。输错计数与十五分钟锁定改为Redis原子脚本五次失败后拒绝正确密码缓存不可用也拒绝验证。验证码绑定客户端、手机号及用途并在同一原子操作中校验和消费防止并发重复使用。成功重置后清除本人锁定若清锁失败响应独立返回`lock_cleared=false`,页面明确区分密码已更新与锁仍可能生效。
## 短信限制
仓库仅有Mock验证码写入Redis没有真实短信供应商。用户确认不知道现成配置路径不重复索要密钥也未擅自接入付费服务。接口保留原字段并新增`delivery_mode=mock``delivery_status=not_sent``retry_after`关闭Mock时返回2410“短信验证服务尚未配置”。支付密码和注册页面不再把请求建立描述为短信已发送。首次设置与找回已通过隔离Mock联调但真实手机收码仍未完成不能计为生产可用短信流程。
## 代码与接口
- `apps/user_app/lib/ui/features/settings/payment_password_page.dart`:新增页面;`_load`状态读取、`_sendCode`用途及冷却、`_save`明确响应确认。
- `apps/user_app/lib/data/repositories/client_repository.dart``wallet``requestPaymentPasswordCode``setPaymentPassword`增加会话保护,验证码手机号来自当前资料;不会接受页面传入钱包归属。
- `apps/user_app/lib/domain/models/client_models.dart`:可空密码状态及验证码请求结果模型,保持旧构造调用兼容。
- `apps/user_app/lib/app/router.dart``ui/features/settings/settings_page.dart`:受保护路由及设置入口;`register_page.dart`修正Mock提示。
- `backend/api/internal/logic/common/client_wallet.go``SetPaymentPassword`严格数字、锁感知验证、条件更新及清锁结果;原接口字段兼容。
- `backend/api/internal/logic/common/payment_password_guard.go`:抽出原共用校验并增加原子计数。
- `backend/api/internal/logic/common/client_auth.go`:短信未配置拒绝、交付元数据及验证码原子消费。
- 新增`payment_password_test.go``payment_password_remote_test.go``verification_availability_test.go`Flutter新增`test/data/payment_password_test.dart``test/ui/payment_password_page_test.dart`。视觉工具增加`31-payment`,沿用明确测试数据,不从真实账户生成密码截图。
## 验证与风险
Flutter analyze及全量117项测试通过页面8组320/360/390/430宽度、1.0/1.3文本缩放检查通过已查看320放大截图无溢出。后端全量go test、go vet、API构建通过新增短信不可用拒绝测试通过。
Web使用`--pwa-strategy=none`构建成功Android调试包构建成功。浏览器加载新包后支付密码深链跳转登录并在登录后回到原页面读取真实已设置状态空表单出现三处六位数字提示找回模式正确切换为手机验证码控制台无error/warn。未在真实用户钱包提交改密或发送验证码成功变更由上述独立远程回滚测试覆盖。API进程39900监听12426健康检查20018571继续提供新Web产物。Android构建仍有既有插件Kotlin迁移提示本轮未升级依赖真机键盘及输入尚待验证。
显式开启`HEQI_REMOTE_PAYMENT_PASSWORD_TEST=1`的远程测试通过独立临时用户与零余额钱包、首次设置、旧密码修改、验证码重置、错误格式、用途不匹配、16并发验证码仅一次成功、8并发错误密码触发五次锁定、重置解锁。数据库整体回滚后确认账户和钱包均不存在仅清理本轮独立Redis键。没有修改真实账户支付密码、余额、数据库结构或远程缓存配置。
原子校验为共用逻辑会影响所有调用支付密码或验证码的业务端因此运行后端全量回归。Redis故障时相关验证不可用属于预期拒绝行为。网络中断后密码更新结果仍可能不确定现有接口没有操作号查询页面不把未知结果表述为密码未变更。
该子页没有独立一比一原稿不把通用表单截图算作图31全量视觉验收。图31及全量App仍未完成严格1:1与全部功能验收当前计数仍为16张部分实现、42张未完成对应完整页面、0张严格验收通过。