如何处理过期付款和长时间待付款的付款
QRIS 和 USDT 付款的有效时长、过期后该怎么做、为什么重试需要新的 merchant_reference,以及如何处理延迟到账的付款。
发布于 11 十月 2026 阅读约 3 分钟
每笔 PAYWISE 付款都以待付款(pending)开始,并以一个最终状态结束:已付款(paid)、已过期(expired)或失败(failed)。大多数情况下这个过程很快。但顾客可能分心、手机没电、网络缓慢。本指南说明付款过期或看起来待付款时间过长时该怎么做。

付款的有效时长
| 方式 | 可付款时长 | 设置方式 |
|---|---|---|
| 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 与重定向。
付款过期时
- **不要发货。**没有收到任何款项。
- 保留订单,将其标记为"付款已过期",而不是删除。
- 提供新的付款,例如一个清晰的"重新付款"按钮。
重试需要新的 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,并决定:履约还是退款。 - 对于长时间待付款的付款,先使用立即查询状态,再联系顾客。
- 在 沙盒 中测试三种结果。

