这份 v1 不能作为独立开发者从零交付的“对接全集”。它更像是“业务域索引 + 若干关键约定”,但还缺少能让外部开发者稳定完成开发、联调、验收和上线的四类核心契约:
- 可执行 API 契约不完整:缺少完整请求/响应 schema、枚举、错误体、鉴权矩阵、分页与时间规范。
- 运行时契约缺失:缺少 token 生命周期、刷新、限流、超时、重试、幂等、上传限制、回调和轮询策略。
- 跨端与安全边界不清:三端、BFF、FastAPI、微信、图片域名之间的 CORS、域名、Cookie、CSRF、角色和数据隔离均未闭合。
- 业务闭环存在明显缺口:退款、支付异常、库存/排期、消息触达、商户入驻、财务结算、风控审计等未形成可直接接线的端点和状态契约。
① 外部开发者从零对接还缺什么
P0:不补齐就无法可靠开发或验收
1. 完整 OpenAPI/JSON Schema 不可替代
材料只说有 api-v1.2.md、api-v1.3-matrix.md,但正文没有逐端点的:
- 请求参数类型、是否必填、默认值;
- 响应完整字段;
- 嵌套对象结构;
- 字段 nullable 规则;
- 字符串/数字/布尔的真实类型;
- 详情接口和列表接口的差异;
- POST 成功状态码;
- 删除、取消、拒绝等操作的响应结构。
依据:材料只给了“端点组”和少量示例,例如订单创建请求,但没有覆盖 355+ 端点的可执行 schema。“契约 v1.2 详细 schema 为准”把关键资料外置,不能满足本包作为独立交付包的目标。
要求:v2 至少提供可导入的 openapi.json/yaml,并保证与线上路由、返回体、状态码一致。
2. 鉴权生命周期、刷新和登出协议缺失
已写 Bearer <token>,但没有说明:
- token 类型:JWT、随机 token 还是 opaque token;
- access token 有效期;
- 是否有 refresh token;
- 刷新端点及刷新失败处理;
- 多端是否共用 token;
- token 是否绑定设备、微信 openid 或角色;
- 登出是否使 token 失效;
- 密码登录和微信登录返回体是否一致;
- token 过期是 401 还是特定业务码;
- b 端 staff token 与 a 端 admin token 是否可互换。
依据:认证章节只有登录端点和 Authorization 头,没有生命周期与刷新规则;三端认证主体明显不同,但没有 token audience、scope 或角色隔离定义。
风险:独立开发者无法正确实现登录态、自动续期、401 重试和多账号切换。
3. 鉴权角色矩阵和资源隔离缺失
需要明确每个端点的:
- 游客、登录用户、商户员工、商户管理员、运营、财务、超级管理员权限;
- 是否只允许本人访问;
- 商户是否只能访问自身订单、账单、任务;
- 管理员是否支持跨商户;
system 角色能改哪些订单状态;- 分销员能否查看客户手机号、订单金额和佣金;
- b 端的 staff token 是否区分门店/商户;
- 资源越权时返回 403 还是伪装成 404。
依据:材料出现“本商户 scope”“RBAC”“system 角色”,但没有端点级角色矩阵,也没有对象级数据隔离规则。
4. 错误响应没有统一形状
材料同时规定:
- 历史路由:
{code:0,data,...} - 新路由:
{ok:true,data} - 业务失败“已抛错”
- HTTP 状态码包括 401/403/404/409/422/501
但没有给出失败响应示例,例如:
{
"code": "ORDER_STATUS_INVALID",
"message": "订单当前不可取消",
"details": {},
"request_id": "..."
}
也没有说明:
- 业务错误码是数字还是字符串;
- 错误是否始终 JSON;
- 422 的 FastAPI validation error 是否原样返回;
message 是否可直接展示;- 是否有
request_id; - 错误字段名是
error、detail 还是 message; - 失败时是否仍然带
data; - HTTP 200 + 业务失败是否存在。
依据:当前只列了 HTTP 状态码,没有错误 body 契约;“业务失败已抛错”不是前端可执行规范。
5. 枚举和状态机不完整,且存在互相冲突
材料给出部分状态,但没有形成机器可读枚举和迁移矩阵。
明显问题包括:
- 订单前文写:
created→booked→confirmed... - 支付段写:online 创建后当前是
confirmed,应为 pending_payment - 状态机又写:online
pending_payment→paid→confirmed - 取消、退款只写“cancel 分支”和
refunding→refunded,未说明所有退款状态; - 核销只写
redeem_stage 和 partially_redeemed,未给出字段枚举; - 分销解绑条件“退款/刷单/资格终止”没有端点和状态定义;
- 福钥任务状态、流水状态不完整;
- 商户审核状态、商品状态、支付状态、账单状态均未列全。
依据:材料明确标注 WIP-302、WIP-286、WIP-290,说明部分状态和端点仍在变更;同时正文存在订单状态描述不一致。
要求:给出每个枚举的值、含义、展示文案、允许迁移、触发方、是否终态。
6. 时间、时区和日期格式缺失
订单字段包含 booked_at、confirmed_at、startDate,但没有说明:
- 时间是否 ISO 8601;
- 是否带时区偏移;
- 服务端统一 UTC 还是中国时区;
startDate 是 YYYY-MM-DD 还是带时间;- 订单截止时间、支付超时时间用哪个时区;
- 微信回调时间如何处理;
- 前端展示和筛选的时区规则。
依据:材料只定义了金额单位,没有定义时间格式和时区;而订单、支付、账期、48 小时结算都依赖时间计算。
7. 幂等、并发、重试和超时规则不完整
只明确了订单“60s 幂等判重”和支付回调“验签+幂等”,但没有说明:
- 幂等键由客户端传还是服务端按请求体生成;
- 幂等键字段名;
- 同一幂等键不同请求体如何处理;
- 创建订单、支付、取消、核销、退款、发放、打款是否都支持幂等;
- 网络超时后能否安全重试;
- 并发取消/确认/核销如何处理;
- 409 的具体冲突码;
- BFF 是否可以自动重试 POST;
- 请求超时、连接超时、网关超时分别如何处理。
依据:订单和微信回调是高风险写操作,但仅给出局部幂等说明,未形成全局写接口策略。
8. 限流、并发和配额没有定义
材料未涉及:
- 按 IP、用户、token、商户还是端点限流;
- 登录、验证码、支付、上传、查询分别的阈值;
- 返回 429 的格式;
Retry-After;- 单用户并发请求限制;
- 分页最大
page_size; - 上传并发数和每日配额。
依据:材料完全没有限流和容量契约;355+ 端点由独立开发者接入,必须知道失败和重试边界。
9. CORS、域名和三端平台网络配置缺失
这属于明显缺项。
需要明确:
- FastAPI 是否允许浏览器 H5 直接跨域;
- 允许的 Origin;
- 是否允许
Authorization、Content-Type 等 headers; - 是否允许 OPTIONS;
- 是否暴露
request_id、分页头; - 是否使用 Cookie,是否需要 credentials;
- 小程序 request 合法域名;
- uploadFile 合法域名;
- 图片下载/业务域名备案和 HTTPS 要求;
- staging 的
100.64.1.230 是否只能通过 Tailscale; - 外部开发者如何访问 staging;
- NestJS BFF 是否是唯一浏览器入口。
依据:生产 API、staging 内网地址、图片独立域名均已列出,但没有网络访问和跨域配置说明。小程序不能直接使用任意内网地址,浏览器也不能默认跨域调用。
10. 文件上传协议不完整
只写了:
POST /api/miniapp/upload
但没有定义:
multipart/form-data 字段名;- 单文件还是多文件;
- 支持的 MIME 类型;
- 文件大小上限;
- 图片尺寸、压缩和 EXIF 处理;
- 是否需要鉴权;
- b/a 端是否共用该端点;
- 上传失败和重复上传行为;
- URL 是否永久有效;
- 删除接口;
- 文件存储安全和访问权限。
依据:材料明确说服务器硬盘存储、弃 COS,但没有容量、备份、删除和访问策略;这是生产稳定性与安全风险。
P1:不补齐会造成大量返工
11. 分页规范不完整
虽定义了 page/page_size,但缺少:
- 最大
page_size; - 页码越界行为;
total 是否准确;- 排序字段和默认排序;
- 筛选条件;
- 是否支持游标分页;
- 数据变化时分页一致性;
- 空列表返回格式;
- 管理后台导出能力。
依据:只有分页响应示例,没有边界、排序和筛选协议。
12. 搜索、筛选、排序字段没有列出
商品、订单、商户、账单、分销结算等页面都需要筛选,但材料没有为各端点定义:
- 可筛选字段;
- 日期范围格式;
- 多值筛选;
- 模糊搜索规则;
- 排序字段;
- 默认排序;
- 组合筛选是否支持。
13. API 版本、兼容性和变更机制缺失
材料同时有 api-v1.2、api-v1.3、WIP 修复项,但没有说明:
- URL 是否版本化;
- 文档版本和线上版本如何对应;
- 字段新增、删除、改名策略;
- 废弃周期;
- 生产和 staging 是否同版本;
- WIP 修改如何通知 BFF;
- 是否提供 changelog 和 contract diff。
依据:当前契约版本与实际修复状态并存,存在“文档正确但线上不同”的风险。
14. Webhook、轮询和异步任务策略缺失
支付回调有 /pay/notify,但没有说明:
- 微信回调响应格式;
- 回调重复、乱序、超时处理;
- 支付状态多久可见;
- 前端是否轮询
/pay/orders/{id}/status; - 轮询间隔和最大时长;
- 是否有 SSE/WebSocket;
- 订单、退款、结算、审核是否存在异步任务;
- 任务失败如何查询。
依据:材料给了支付状态查询,但没有定义其调用策略;状态机中大量状态显然可能异步变化。
15. 安全规范缺失
未说明:
- 生产是否强制 HTTPS;
- 密码登录防爆破;
- 手机号、openid、身份证等敏感字段脱敏;
- 日志是否禁止记录 token、支付参数和个人信息;
- 图片 URL 是否可公开访问;
- 微信支付签名和证书配置;
- 管理后台是否需要 MFA;
- CORS 与 CSRF 关系;
- 服务器错误是否泄露堆栈。
依据:用户、手机号、支付、商户财务数据均在业务范围内,但材料没有安全基线。
16. 本地化、展示和文案规则缺失
虽然文案走 site-texts,但没有定义:
- 缺失 key 的 fallback;
- 多语言字段;
- 文案缓存和发布延迟;
- 富文本/HTML 是否允许;
- 金额、日期、手机号的展示规则;
null、空字符串、缺失字段的 UI 处理。
② 架构三原则的漏洞
原则一:FastAPI 唯一真源——方向正确,但边界不够严
漏洞 1:BFF 的“渲染增强”边界模糊
材料说 NestJS 可以做 BFF/SSR/渲染增强,但没有定义哪些逻辑允许放在 BFF:
- 字段聚合是否允许;
- 多接口编排是否允许;
- 权限判断是否允许;
- 参数校验是否允许;
- 状态映射是否允许;
- 缓存是否允许;
- 降级和重试是否允许;
- 是否允许计算展示字段;
- 是否允许改变错误码。
风险:虽然禁止“重写业务逻辑”,但实际项目很容易把价格、库存、订单状态、佣金等业务判断复制到 NestJS,形成隐形双源。
应补充:BFF 允许/禁止清单。BFF 可以做协议转换、聚合、缓存、展示裁剪;不得计算价格、库存、佣金、支付结果、状态迁移、权限结论。
漏洞 2:没有定义 BFF 的 API 版本和契约责任
如果 NestJS 包装 FastAPI,前端到底依赖:
- FastAPI 原始契约;
- NestJS BFF 契约;
- 还是二者都可调用?
风险:出现第三套响应包装、字段别名和错误码,最终“唯一真源”只剩数据库意义,API 契约反而多源。
漏洞 3:没有防止 BFF 缓存造成数据陈旧
订单、支付、核销、库存、佣金均为强时效数据。若 NestJS 做 SSR 或缓存,必须定义:
- 哪些接口可缓存;
- TTL;
- 失效条件;
- 是否允许 stale;
- 支付和订单状态禁止缓存;
- 多实例缓存一致性。
依据:材料允许“渲染增强”,但没有缓存边界。
漏洞 4:未定义事务和跨接口编排边界
例如下单可能涉及:
- 预检;
- 锁价;
- 创建订单;
- 支付;
- 分销归因;
- 福钥抵扣。
如果 BFF 串联这些调用,失败时没有补偿策略。BFF 不应自行补偿业务事务,必须由 FastAPI 提供原子接口或明确 saga/补偿协议。
原则二:鉴权透传——不足以保证安全
仅透传 Authorization 不能解决:
- BFF 自身是否验证 token;
- BFF 是否允许客户端伪造内部 header;
- admin、merchant、miniapp token 是否隔离;
- 服务间调用是否需要独立 service credential;
- token 是否被写入日志;
- BFF 转发时是否保留客户端 IP、trace id;
- SSR 场景如何安全传递 token;
- 文件上传和图片域名如何鉴权。
结论:应从“透传 Authorization”升级为“身份与权限链路契约”,包括 token audience、scope、内部信任边界、header 白名单、日志脱敏和服务间认证。
原则三:文案与配置走 site-texts——仍存在配置漂移风险
漏洞 1:哪些内容算配置没有定义
除了页面文案,还可能包括:
- 佣金比例;
- 福钥抵扣比例;
- 支付方式;
- 取消规则;
- 服务费;
- 核销规则;
- 页面开关;
- 灰度开关;
- 枚举展示文案。
材料只明确“新页面文案走 site-texts”,没有定义业务配置是否也必须由后端返回。
漏洞 2:site-texts 本身的缓存、发布和版本机制缺失
没有说明:
- 更新是否立即生效;
- 前端缓存多久;
- 是否按环境隔离;
- 是否支持草稿/发布;
- 是否审计;
- 是否支持回滚;
- key 冲突如何处理;
- 页面缺文案时 fallback。
漏洞 3:不能把业务规则伪装成文案配置
例如“支付超时时间”“佣金比例”“抵扣比例”不能仅以文本或任意 JSON 下发后由前端解释。业务规则必须由 FastAPI 计算并返回结果,前端只展示。
③ 双响应包装的坑,以及最干净的处理方式
判断:双包装对新页面开发是坑,而且不应让三端各自兼容
当前约定:
{ "code": 0, "data": ... }
和:
{ "ok": true, "data": ... }
这会带来四类问题:
- 成功判断歧义:
code=0、ok=true、HTTP 2xx 三套标准。 - 失败判断不一致:某些接口可能 HTTP 200 但业务失败,某些接口用 4xx。
- 类型推导复杂:统一客户端必须处理联合类型,业务代码容易绕过 util 直接读取。
- BFF 可能再包一层:最终出现
{ok:true,data:{code:0,data:...}}。
依据:材料明确要求客户端“统一处理”,但没有规定统一后的内部类型和失败处理方式;“业务失败已抛错”也没有给出异常模型。
最干净的方案
方案 A:FastAPI 在兼容期统一输出,推荐
新页面只面向一套规范:
{
"success": true,
"data": {},
"request_id": "req_xxx"
}
失败统一为:
{
"success": false,
"error": {
"code": "ORDER_STATUS_INVALID",
"message": "订单当前状态不可取消",
"details": {}
},
"request_id": "req_xxx"
}
HTTP 状态码表达大类,业务错误码表达具体原因。
历史接口在 FastAPI 网关或兼容层转换,不把兼容逻辑暴露给业务页面。
方案 B:短期由 NestJS SDK 统一,不能散落在页面
如果暂时不能改 FastAPI:
- 只允许一个
apiClient; - 所有请求必须经过
unwrapResponse; - 业务层禁止读取
code、ok; - 统一转换为内部类型:
ApiResult<T>ApiError- 对成功和失败分别做严格 schema 校验;
- BFF 不得再包装;
- 增加契约测试,覆盖两种历史响应。
不建议让 c/b/a 三端各自实现一份解包逻辑。
④ 三端业务域是否漏掉
明显缺失或描述不足的业务域
1. 退款/售后域:明显缺失
订单状态有:
refunding → refunded
但没有完整退款端点组:
- 用户申请退款;
- 管理员/商户审核;
- 退款金额计算;
- 原路退款;
- 退款进度查询;
- 退款失败重试;
- 部分退款;
- 退款逆账;
- 退款和分销佣金回滚。
结论:退款状态存在,但退款业务域没有形成可对接契约。
2. 支付域不完整
已有支付下单、微信回调、支付状态查询,但缺少:
- 支付超时关闭;
- 取消未支付订单;
- 支付失败;
- 重复支付;
- 部分支付/尾款;
- offline 转 online;
- 退款关联;
- 支付凭证和支付流水;
- 微信回调原始结果查询。
依据:材料仅覆盖 prepay_id、notify、status,且明确线上订单状态仍有 WIP-302。
3. 库存、排期、可售性域缺失
预检返回 conflicts/pass,但没有说明:
- 资源是什么;
- 库存/名额/日期如何查询;
- 锁定和释放接口;
- 超时释放;
- 并发扣减;
- 订单取消是否恢复库存;
- 商品详情中的可售日期;
- 冲突对象和冲突码结构。
结论:预检和下单存在,但库存/排期闭环未暴露。
4. 商户入驻和资料管理不完整
有民宿申请、商户审核,但缺少:
- 商户资料详情和编辑;
- 联系人、收款账户;
- 资质上传;
- 审核驳回原因;
- staff 用户管理;
- 角色分配;
- 商户状态变更;
- 商户营业时间和服务范围。
依据:merchant-console/merchants 当前部分 404,且商户认证只写“staff token 登录流”。
5. 退款、财务、结算闭环不完整
有商户 bills、分销结算单批量打款,但未说明:
- 结算单详情;
- 账单明细;
- 对账;
- 发票/收款信息;
- 打款失败和重试;
- 佣金与退款的关联;
- 商户账期;
- 结算锁定和撤销;
- 导出。
6. 消息域描述过于笼统
/messages 只有“3-10 端点”,未明确:
- 站内信列表、详情、已读;
- 系统通知;
- 微信订阅消息;
- 短信;
- 模板配置;
- 消息重试;
- 未读数;
- 订单状态变更触达。
7. 核销域缺少完整码生命周期
已有 scan、confirm、revoke、batch,但未说明:
- 核销码生成与展示;
- 码的有效期;
- 单次/多次使用;
- 反作弊;
- 部分核销数量;
- 逆账权限;
- 批量核销原子性;
- 离线核销;
- 核销记录查询和审计。
8. 用户、账户和隐私域缺失
c 端需要:
- 用户资料;
- 手机号绑定/换绑;
- 微信手机号解密;
- 注销;
- 隐私授权;
- 收货/联系人管理;
- 黑名单/风控状态。
材料只列了 user 数据字段,没有用户端业务端点。
9. 审计、操作日志和风控域未形成接口
材料提到“审计留痕”,但没有:
- 审计日志查询;
- 操作人、前后值、原因;
- 登录日志;
- 高风险操作二次确认;
- 风控拦截结果;
- 申诉和人工解封。
10. 搜索、推荐、首页聚合域未说明
新页面通常需要首页、分类、搜索、推荐和运营位,但材料只有商品列表、site-texts、CMS,没有明确:
- 首页聚合接口;
- 商品分类;
- 搜索;
- Banner/专题;
- 推荐位;
- 排序规则;
- 运营配置。
材料未涉及:是否已有这些接口不能据此断言不存在,但当前信息包没有提供。
⑤ 信息包 v2 必须补充清单,按优先级
P0:上线前必须补
A. 一份可执行、可校验的 API 契约
openapi.yaml/json;- 355+ 端点完整请求/响应 schema;
- HTTP 状态码;
- 成功和失败示例;
- nullable、默认值、字段类型;
- deprecated 标记;
- 每个端点对应的前端页面和业务动作;
- 线上版本与文档版本绑定。
B. 统一错误契约
定义:
{
"success": false,
"error": {
"code": "ORDER_STATUS_INVALID",
"message": "订单当前状态不可取消",
"details": {}
},
"request_id": "req_xxx"
}
同时明确:
- HTTP 状态码;
- 业务错误码表;
- FastAPI validation error 转换规则;
- 是否允许展示
message; - 429、501、网关错误;
- BFF 错误映射规则。
C. 鉴权和角色矩阵
必须提供表格:
| 端点/域 | 游客 | C 用户 | 商户员工 | 商户管理员 | 运营 | 财务 | 超管 | 数据范围 |
| 订单详情 | 否/本人 | 本人 | 本商户 | 本商户 | 全部 | 只读/账务 | 全部 | order_id 归属 |
| 退款审核 | 否 | 否/申请 | 可选 | 是 | 是 | 否 | 是 | 商户或全局 |
并补充:
- token 类型;
- access/refresh 有效期;
- 刷新、登出、撤销;
- 401 重试;
- token audience/scope;
- 对象级越权规则;
- 敏感字段脱敏。
D. 网络与环境接入说明
必须写清:
- H5 CORS allowlist;
Authorization、OPTIONS、credentials 配置;- 小程序 request/upload/download 合法域名;
- staging 访问方式和 Tailscale 开通流程;
- staging/production 数据隔离;
- 图片域名配置;
- HTTPS、证书、备案要求;
- BFF 是否为浏览器唯一入口;
- 生产灰度和回滚方式。
E. 完整枚举和状态迁移矩阵
至少覆盖:
- 订单;
- 支付;
- 退款;
- 核销;
- 商品;
- 商户;
- 分销;
- 结算;
- 福钥任务;
- 审核;
- 消息;
- 上传任务。
每个状态需包含:
- 值;
- 含义;
- 展示文案;
- 可迁移到哪些状态;
- 触发角色;
- 是否终态;
- 并发冲突行为。
同时立即解决 confirmed 与 pending_payment 的线上不一致。
F. 时间、金额和数据类型规范
- 时间统一 ISO 8601;
- 明确 UTC/Asia/Shanghai;
startDate 格式;- 时间展示和筛选规则;
- 金额全部
fen 的真实 JSON 类型; - 金额是否允许负数;
- 大整数是否统一字符串;
- 手机号、ID、订单号字段类型;
null 与空字符串约定。
G. 写接口可靠性规范
为所有写接口补充:
- 幂等键字段;
- 幂等有效期;
- 重试安全性;
- 超时与重试策略;
- 409 冲突结构;
- 并发状态迁移;
- 取消、退款、核销、支付、打款的原子性;
- BFF 禁止自动重试的接口清单。
H. 支付和退款闭环
必须补:
- 支付订单创建;
- 支付状态查询;
- 支付超时关闭;
- 支付失败;
- 回调响应;
- 重复回调;
- 退款申请、审核、执行、查询;
- 部分退款;
- 退款失败和重试;
- 支付/退款/佣金/账单关联关系;
- 微信配置、验签和 staging 模拟方案。
I. 文件上传契约
multipart 字段名;- MIME 白名单;
- 文件大小上限;
- 图片尺寸限制;
- 单次/批量上传;
- 鉴权要求;
- URL 过期策略;
- 删除接口;
- 失败码;
- 存储容量、备份和清理策略;
- a/b/c 三端可用范围。
P1:开发阶段必须补
J. 分页、筛选、排序协议
- 最大 page size;
- 页码边界;
- 空列表;
- 默认排序;
- 可排序字段;
- 筛选字段;
- 日期范围;
- 游标分页评估;
- 导出接口。
K. 异步状态和轮询协议
- 支付、退款、审核、结算的异步流程;
- 轮询端点;
- 推荐轮询间隔;
- 最大轮询时长;
- 终止条件;
- 是否支持 Webhook/SSE;
- 前端断网恢复策略。
L. BFF 边界和契约
明确:
允许:
- 聚合多个 FastAPI 接口;
- 字段裁剪和展示适配;
- 协议转换;
- SSR;
- 有边界的缓存;
- trace/request id 透传。
禁止:
- 改价格、库存、佣金;
- 改订单状态;
- 判定支付成功;
- 自行计算退款;
- 自行做权限结论;
- 直连 DB;
- 生成第二套业务端点;
- 把业务状态映射成与 FastAPI 不一致的状态。
M. site-texts 和配置治理
- key 命名规范;
- 页面/端类型;
- fallback;
- 缓存 TTL;
- 发布、回滚和审计;
- 环境隔离;
- 多语言;
- 富文本安全;
- 哪些业务配置不能由前端自行解释。
N. 测试和验收资产
当前提到 curl、L3、golden path,但还应提供:
- Postman/Insomnia collection;
- staging 账号与角色矩阵;
- 每个角色的种子数据;
- 黄金路径完整请求/响应;
- 错误路径剧本;
- 支付回调模拟;
- 并发下单和重复提交测试;
- 退款、逆账、部分核销测试;
- OpenAPI contract test;
- 线上 smoke test;
- 版本变更 diff。
P2:上线运营必须补
O. 可观测性和故障排查
request_id/trace_id;- 日志字段规范;
- 错误追踪;
- 指标:QPS、P95、错误率、429、支付回调失败;
- 慢查询和超时告警;
- 依赖 FastAPI/微信/图片服务的健康检查;
- BFF 与 FastAPI 链路追踪。
P. 限流与容量
- 各端点限流;
- 登录防爆破;
- 上传配额;
- 429 响应;
Retry-After;- 最大并发;
- 超时;
- 熔断;
- 降级;
- 缓存策略。
Q. 安全和合规
- HTTPS 强制;
- CORS 白名单;
- CSRF 策略;
- 敏感数据脱敏;
- token/密码/支付信息禁止入日志;
- 文件访问控制;
- 管理员高风险操作二次确认;
- 审计日志;
- 数据保留和删除策略;
- 备份与灾备。
R. 未完成项清零表
当前至少要将以下 WIP 明确成“已修复版本 + 线上证据 + 回滚方案”:
- WIP-302:online 创建订单状态应为
pending_payment; - WIP-286:商户列表和审核端点当前部分 404;
- WIP-290:service-fee/prepay 冻结为 501;
- 其他材料引用的 060、061、267、275、289、299、303 等版本或任务编号。
在 WIP 未关闭前,不能宣称“全部业务能力就绪”。
最终评审结论
- 架构方向:可接受。FastAPI 作为唯一业务数据源、NestJS 作为 BFF 的原则正确。
- 接口交付成熟度:不足。当前更接近内部研发备忘录,不是外部开发者可独立执行的 API 对接包。
- 最大风险:契约漂移和边界复制。双包装、WIP 状态、BFF 边界、角色矩阵不清,会导致三端分别做出不一致实现。
- 最优先动作:先补 P0 的 OpenAPI、统一错误、鉴权矩阵、枚举状态机、网络接入、时间规范、幂等规则,再让冈子开始大规模页面接线。
- 在 P0 未完成前,不建议以“355+ 端点、全部业务能力就绪”作为交付承诺;至少应改成“核心域可用,若干端点和契约仍在收敛”。