全球账户 › 指南
15 档状态、哪些是终局、每一档钱在哪 —— 认不出的一律告警,绝不 fallback。
订单生命周期
pending ─► reviewing ─┬─► dispatching ─► submitting ─► processing ─┬─► completed
│ │ │ ├─► failed
│ │ └─► dispatch_failed └─► refunded
│ ├─► supplementing ┐
│ ├─► needs_reconfirm ├─► 回到主线
│ └─► rejected │
└─► canceled pending_docs ─► docs_submitted ┘
全部取值
在途 —— 还会动,继续跟:
| 值 | 含义 | 会员的钱在哪 |
|---|---|---|
pending | 已受理,排队中 | 一分没动 |
platform_reviewing | 我方平台风控审核 | 锁定中 |
reviewing | 审核中 | 锁定中 |
supplementing | 我方审核期要求补资料 | 锁定中 |
needs_reconfirm | 价格变动超出滑点,等会员重新确认 | 锁定中 |
dispatching | 正在分发给上游 | 锁定中 |
dispatch_failed | 分发失败,等我方人工处置 | 锁定中 |
submitting | 已提交上游 | 锁定中 |
processing | 上游处理中 | 锁定中 |
pending_docs | 上游 RFI —— 钱已在合作银行,要补资料 | 锁定中 |
docs_submitted | 资料已交,等上游复核 | 锁定中 |
终局 —— 不会再变:
| 值 | 含义 | 会员的钱在哪 |
|---|---|---|
completed | 已付给收款人 | 已付出 |
failed | 失败 | 已退回可用余额 |
refunded | 已退款 | 已退回可用余额 |
rejected | 被拒 | 已退回可用余额 |
canceled | 已取消 | 已退回可用余额 |
⚠
pending是唯一一档「钱一分没动」的在途状态。 它是冻结之前的排队态。别在界面上对它说「已冻结」——
其余每一档在途状态,会员的钱都锁着。
⚠
dispatch_failed不是失败终局。 钱还锁着,等我方人工处置。把它当
failed显示的表现是用户以为钱退了,然后来问为什么余额没变。
三条必须守住的
一、completed 不等于「上游说完成了」
我方在收到上游的完成信号之后还要做一次结算过账。事件与订单状态在结算之后才变成 completed。
二、认不出的状态一律告警,不要 fallback
switch (status) {
case "completed": …
case "failed": …
…
default: alert(status); // ← 不是 fallthrough 到「处理中」
}
fallback 成「处理中」的表现是:一个我方新增的终局状态在你这边永远停在处理中,用户永远看不到结果,而你的监控一声不响。
我方自己也守这一条 —— 除 pending 那一档映射外,认不出的状态原样回显,绝不 default。新增枚举前会在变更日志登记。
三、按 status_version 合并
事件与轮询会同时到达,顺序不保证。只许向前更新:
if (incoming.status_version > local.status_version) apply(incoming)
判「还要不要继续跟」
用终局的那 5 个做判据,别列举在途档:
const DONE = new Set(["completed", "failed", "refunded", "rejected", "canceled"]);
if (!DONE.has(order.status)) keepPolling(order);
在途档我方会加(platform_reviewing 与 pending 就是后加的)。列举在途的写法漏了新档,那张单会从你的跟进队列里静默消失。