合并最新 master 到作品管理分支
Project CI / Backend tests (pull_request) Failing after 39s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m44s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 3m43s
Project CI / Repository checks (pull_request) Failing after 40s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m52s
Project CI / Frontend tests (pull_request) Successful in 3m17s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m12s
Project CI / Native shell tests (pull_request) Successful in 6m41s
Project CI / Backend tests (pull_request) Failing after 39s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m44s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 3m43s
Project CI / Repository checks (pull_request) Failing after 40s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m52s
Project CI / Frontend tests (pull_request) Successful in 3m17s
Project CI / AI game creator shell web tests (pull_request) Successful in 3m12s
Project CI / Native shell tests (pull_request) Successful in 6m41s
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# 【实施计划】支付应用与订单收银台
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】支付应用与订单收银台-2026-10-03.md` |
|
||||
| Status | completed |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
允许修改:
|
||||
|
||||
- 主规范、shared-contracts、OpenAPI、支付领域 module、spacetime-module / migration / bindings、spacetime-client facade、api-server payment module、platform-wechat provider。
|
||||
- `src` 的 profile 支付入口、收银台页面、支付客户端和页面样式。
|
||||
- `apps/admin-web` 的支付 API 类型、路由、页面和后台样式。
|
||||
- 与本里程碑直接相关的测试和文档索引。
|
||||
|
||||
明确不修改:
|
||||
|
||||
- 现有个人钱包充值、微信虚拟支付和退款状态机的行为。
|
||||
- 生产商户密钥、环境文件、个人配置和构建产物。
|
||||
- 支付宝 provider、分账、提现、手续费和自动结算。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 从现有充值订单、微信 Native provider、外部 API Key、profile 路由和后台列表组件提取可复用边界,确认没有重复的公开订单模型。
|
||||
2. 冻结支付 DTO、状态枚举、错误码、幂等语义和 OpenAPI,然后补契约测试。
|
||||
3. 增加支付领域表、migration、procedure / facade 和 schema 绑定,先完成订单创建、查询、关闭与幂等。
|
||||
4. 在 `platform-wechat` 增加支付服务需要的 Native 请求 / 响应和通知确认复用,保持商户配置只在服务端。
|
||||
5. 在 `api-server` 接入外部 API、收银台 read model、微信通知、查单和外部回调 outbox;所有到账入口复用统一确认事务。
|
||||
6. 增加个人中心支付应用 / Key / 订单页面和公共收银台,按截图参考实现桌面双栏与移动端纵向布局。
|
||||
7. 增加后台支付概览、应用、订单、通知和回调投递页面,复用 `packages/shared` 后台公共组件。
|
||||
8. 运行定向测试、schema / OpenAPI / 编码检查,启动 api-server 做 healthz 和 mock provider smoke;条件具备时执行真实沙箱二维码 smoke。
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `npm run check:encoding`
|
||||
2. `git diff --check`
|
||||
3. `npm run check:spacetime-schema`
|
||||
4. `npm run typecheck`
|
||||
5. `npm run admin-web:typecheck`
|
||||
6. 支付领域和 api-server 定向 `cargo test`
|
||||
7. 外部 API、profile、收银台和 admin 页面定向 Vitest
|
||||
8. `npm run dev:api-server` 后检查 `/healthz`
|
||||
9. mock provider + Playwright 收银台 smoke;真实商户沙箱可用时再补动态二维码验证
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 商户 API 证书或通知地址不可用时,保留 provider mock 证据,不把 mock 结果标成真实支付通过。
|
||||
- schema 变更失败时停止在绑定生成前,保留主规范和计划,不能通过删除数据绕过迁移。
|
||||
- 订单确认事务或回调 outbox 未完成时,关闭新支付渠道开关,不影响现有充值渠道。
|
||||
- 发现需要余额、提现、分账或支付宝真实接入时,先更新主规范和后续里程碑,再扩展实现。
|
||||
@@ -0,0 +1,59 @@
|
||||
# 【里程碑】支付应用与订单收银台
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | completed |
|
||||
| Date | 2026-10-03 |
|
||||
| Parent Spec | `docs/【技术方案】外部产品支付服务接入-2026-10-03.md` |
|
||||
|
||||
## 目标
|
||||
|
||||
建立首个可运行的支付服务闭环:账号创建支付应用并管理 API Key,客户端或外部产品创建订单,用户进入 Web 收银台,平台通过微信 Native provider 生成动态二维码,通知 / 查单确认订单,之后通过签名回调通知接入方,后台可查询应用和订单。
|
||||
|
||||
## 范围
|
||||
|
||||
- 支付应用、API Key 元数据和账号归属。
|
||||
- 外部支付订单、商品快照、支付尝试和状态机。
|
||||
- 微信 Native 动态二维码 provider 适配;支付宝只保留渠道扩展结构,不纳入本里程碑的可用渠道。
|
||||
- 公共收银台和移动端纵向布局。
|
||||
- 支付平台通知、主动查单、确认幂等和接入方回调 outbox。
|
||||
- 个人中心支付服务入口、应用配置页和订单列表。
|
||||
- 后台支付总览、应用列表、订单列表、通知 / 回调失败列表。
|
||||
- `/api/external/v1/payment/*` OpenAPI、共享 DTO、契约测试和支付领域 schema。
|
||||
|
||||
## 不在范围内
|
||||
|
||||
- 支付宝真实下单、退款、分账和沙箱联调。
|
||||
- 外部产品余额、手续费、提现、自动结算和自动分账。
|
||||
- 用户钱包充值商品的迁移或现有微信虚拟支付协议改造。
|
||||
- 自动履约发货、数字权益回收和支付争议处理。
|
||||
|
||||
## 依赖与前置条件
|
||||
|
||||
- 平台微信 Native 商户号、API 证书 / 密钥和正式或沙箱通知地址可由部署环境注入。
|
||||
- 当前微信支付 Native provider、充值订单状态与验签测试可复用。
|
||||
- 外部回调域名必须通过应用配置的 HTTPS 和白名单校验。
|
||||
- SpacetimeDB schema、migration、生成绑定和 API OpenAPI 可以在同一里程碑同步更新。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] 账号能创建、停用支付应用,API Key 仅在创建响应中展示一次,撤销后立即拒绝请求。
|
||||
- [x] 外部 API 使用 `Idempotency-Key` 创建订单,重放返回原订单,字段冲突返回业务错误。
|
||||
- [x] 订单金额以整数分保存,商品和金额快照创建后不可被应用配置改写。
|
||||
- [x] 收银台使用不可猜测 token,桌面端双栏、移动端纵向显示商品、金额、二维码、过期和状态。
|
||||
- [x] 微信 Native 下单返回的二维码对应当前本地平台订单号和金额。
|
||||
- [x] 支付平台通知 / 查单确认前,客户端轮询或伪造回调不能把订单改为 `paid`。
|
||||
- [x] 重复、乱序、错误金额、错误签名、错误应用归属的通知不会重复确认或改变订单。
|
||||
- [x] 接入方回调异步投递、签名、重试和失败状态可查询。
|
||||
- [x] 个人中心和后台均能按归属和权限查看应用、订单及失败记录。
|
||||
- [x] `shared-contracts`、OpenAPI、schema 绑定和契约测试同步通过。
|
||||
|
||||
## 证据要求
|
||||
|
||||
2026-10-03 验收复核:支付专用 schema、typed facade、API、应用管理、provider-attempt claim、通知确认、签名回调 outbox、后台投递状态、profile/payment 路由和前端 build 已完成。项目 dev stack 发布后 `GET /healthz` 返回 HTTP 200,live schema 包含 `payment_order` / `payment_webhook_delivery`;真实商户沙箱二维码和真实微信通知因环境未注入商户凭据未验证,按“有可用沙箱时补充”处理。
|
||||
|
||||
- 自动化:Rust 领域 / API / provider 测试、前端页面与契约测试、schema 检查、OpenAPI 检查、编码和 diff 检查。
|
||||
- 运行时:项目 dev stack 发布当前 schema 后,api-server 使用正确端口和 bootstrap 配置,`GET /healthz` 返回 HTTP 200;live schema 已包含 `payment_order` 与 `payment_webhook_delivery`;微信 provider mock 由现有 provider 测试覆盖。
|
||||
- 未验证:真实商户沙箱动态二维码和真实微信通知,当前环境没有可安全使用的商户凭据;代码保留 provider 配置失败和支付状态失败关闭语义。
|
||||
- 边界:权限、幂等、重放、金额不一致、回调失败、过期、未知通知和敏感日志检查。
|
||||
Reference in New Issue
Block a user