fix(payment): 原交易已终态的预支付单不再交回客户端,关单上限按尝试而非状态收尾
真机反馈的三件事是同一串缺陷:「取消支付后待支付页每秒闪一次」「卡在支付处理中、刷新没反应」
「同一商品再下单时收银台报『订单状态异常,支付请求无效』」。开发库只读核对确认:
订单 P202609171613326977 的尝试 P202609171613329469 停在 CANCEL_UNCONFIRMED、
close_attempts=3、通道回执 23000000「原订单已为终态」,而订单一直是待支付。
- closePayment 补上第四支之外的第五支:汇付 23000000/10000016 说的是「原交易已终结」
(订单已完成或已关单),不是「现在不让关」。旧实现把它并入「其余拒绝」,于是那张已不可能
被支付的预支付单被记成「关不掉=可能还能付」并继续被 reusablePrepay 交给客户端。
现在落成 CLOSED 并结掉 PAYMENT_CLOSE_UNCONFIRMED。
- retryClose 到上限改为先 watchOnly(钱真来了先落成已支付)再 giveUpClosing;
giveUpClosing 不再按「流水当前是不是 CLOSING」决定要不要结束订单——第一次关单就被拒的
流水直接落在 CANCEL_UNCONFIRMED,旧写法让它永远结束不了(既付不了,也不被到期清理收掉,
同一商品再也下不了单)。订单收尾加一道「已有 SUCCEEDED 支付就不取消」的护栏。
- 人才端待支付页把「读到尝试已结束」收敛成 onPaymentAttemptClosed:只收掉等待状态、
最多重读一次订单,用户动一次手重置一次预算,切断 loadOrder ↔ checkPaymentStatus 环路
(那就是「每秒闪一次」和「刷新没反应」)。
回归:PendingPaymentConfirmationTests 新增四条(已终态落成已关闭、死凭证不再复用、
上限结束未经过 CLOSING 的订单、已收款订单不被上限取消)。全量 366 项,仅 testing.md
记录的 3 项基线失败。诊断与证据见 .scratch/pending-order-payment-flow/issues/09。