PAYWISE
zh
← 全部文章

开发者

如何处理过期付款和长时间待付款的付款

QRIS 和 USDT 付款的有效时长、过期后该怎么做、为什么重试需要新的 merchant_reference,以及如何处理延迟到账的付款。

发布于 11 十月 2026 阅读约 3 分钟

其他语言版本: English, Indonesia

如何处理过期付款和长时间待付款的付款

每笔 PAYWISE 付款都以待付款(pending)开始,并以一个最终状态结束:已付款(paid)、已过期(expired)或失败(failed)。大多数情况下这个过程很快。但顾客可能分心、手机没电、网络缓慢。本指南说明付款过期或看起来待付款时间过长时该怎么做。

每笔付款都从待付款开始,最终变为已付款、已过期或失败,各自对应一个 Webhook

付款的有效时长

方式 可付款时长 设置方式
QRIS 默认 20 分钟 expires_in:60 至 1,200 秒
USDT(BEP20) 60 分钟 固定

具体时间见 API 响应中的 expires_at。请在页面上显示倒计时(托管支付页面会自动显示),让顾客知道还剩多少时间。

时间到后,PAYWISE 会最后检查一次付款,并将其标记为已过期。如果您订阅了 payment.expired 事件,就会收到该 Webhook。

长时间"待付款":什么情况算正常?

  • QRIS:顾客说已付款几分钟后仍显示待付款,这并不常见。请在仪表盘中打开该付款并点击立即查询状态:PAYWISE 会直接向支付服务商查询。
  • USDT:区块链付款需要确认,因此从发送到已付款之间相隔几分钟是正常的。

如果从服务器轮询,请使用 GET /api/v1/transactions/{reference},但不要每秒轮询:API 限制每个密钥每分钟 60 次请求。等待 Webhook 是更好的方式。参见 Webhook 与重定向。

付款过期时

  1. **不要发货。**没有收到任何款项。
  2. 保留订单,将其标记为"付款已过期",而不是删除。
  3. 提供新的付款,例如一个清晰的"重新付款"按钮。

重试需要新的 merchant_reference

merchant_reference 同时也是您的幂等键。如果用相同的参考号和相同的金额再次创建付款,PAYWISE 会返回原来那笔已过期的付款。新的尝试请使用新的参考号:

$attempt = $order->payment_attempts + 1;

$payment = $paywise->createTransaction([
    'merchant_reference' => 'ORDER-' . $order->id . '-' . $attempt, // ORDER-1042-2
    'amount'             => $order->total,
    'payment_method'     => 'QRIS',
    'customer_id'        => (string) $order->user_id,
]);

请保存该订单每一次尝试的 PAYWISE reference,这样任何一次尝试的 Webhook 都能找到正确的订单。详见 幂等性。

延迟付款:当"已过期"变成"已付款"

有时顾客在最后一秒才付款,或者支付网络的确认来得较晚。当服务商确认顾客确实已付款时,即使该付款已被标记为过期,PAYWISE 也会将其标记为已付款并发送 payment.paid。对于 USDT,60 分钟后到账的充值仍会被确认。

因此,您的店铺必须能处理"已视为过期的订单收到 payment.paid"的情况:

  • 如果订单仍可履约,就正常履约。
  • 如果无法履约(例如顾客已通过新的尝试再次付款,或商品已售罄),请标记为退款,由您自行退款。参见 退款与顾客投诉。

少于精确金额的 USDT 付款不会被标记为已付款。如果顾客说已发送 USDT 但付款已过期,请在支持中提交工单并附上 PAYWISE 参考号。

检查清单

  • 显示倒计时,过期后显示"重新付款"按钮。
  • 每次新的尝试都使用新的 merchant_reference。
  • 除了 payment.paid,也要处理 payment.expired 和 payment.failed。
  • 接受过期后才到达的 payment.paid,并决定:履约还是退款。
  • 对于长时间待付款的付款,先使用立即查询状态,再联系顾客。
  • 在 沙盒 中测试三种结果。

更多文章

今天就从沙盒密钥开始。

创建账户、生成沙盒密钥,几分钟内即可在调试台发送第一笔交易。