refs
用户 yeg <1347747024@qq.com>
星期四, 九月 17, 2026 16:34 +0800
提交者 yeg <1347747024@qq.com>
星期四, 九月 17, 2026 16:35 +0800
提交3fd8f1e15d654d917949a501134dd3f033e8589e
目录 ce6d4f526508a0229337e6239c422d34128fe858 目录 | zip | gz
parent 02df6417d400aabb559d095e5f7cd63c63b86fb1 查看 | 对比
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。
1个文件已添加
4个文件已修改
234 ■■■■■ 已修改文件
.scratch/pending-order-payment-flow/issues/04-payment-converges-per-attempt.md 1 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
.scratch/pending-order-payment-flow/issues/09-terminal-prepay-zombie-order.md 70 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
rencaika/pages/pending-payment/pending-payment.uvue 23 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
talent-card-server/src/main/java/com/talentcard/server/business/payment/PaymentReconciliationService.java 54 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
talent-card-server/src/test/java/com/talentcard/server/business/payment/PendingPaymentConfirmationTests.java 86 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史