Z Zise Developers
全球账户 › 指南

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_reviewingpending 就是后加的)。列举在途的写法漏了新档,那张单会从你的跟进队列里静默消失

相关