Manual Retry 会在您发起请求时,从支付详情页或通过 API 重新尝试失败的订阅续费支付。它会对订阅中已保存的支付方式发起扣款,并独立于自动 Payment Retries 计划运行。
什么是手动重试?
续费支付失败后,订阅会变为on_hold。如果您启用了 Payment Retries,系统会按照退避计划重新尝试扣款。有时您知道现在付款一定会成功:客户已确认他们为账户充值,或者您的支持团队正在与客户通话。Manual Retry 会立即发起一次尝试,而不是等待数小时或数天后的下一次计划尝试。
- 仅限续费支付:Manual Retry 适用于订阅处于
on_hold状态时的订阅续费发票。首次支付、一次性支付、套餐变更费用和按需费用不符合条件。 - 无需客户操作:扣款会发送至订阅中已保存的支付方式。
- 独立于自动重试:手动重试不会消耗自动计划中的一次尝试,不会移动下一次计划重试的时间,即使关闭了 Payment Retries 也可以使用。
- 重试的是发票,而不是支付:失败支付只是入口。Dodo Payments 会找到其对应的未结清续费发票,并对该欠款进行扣款,因此从发票上的哪个失败支付发起重试并不重要。
从控制面板重试
只有 Owner 或 Editor 角色的用户才能发送手动重试。1
Open the failed payment
前往 Transactions → Payments,点击失败的续费支付,打开其 Transaction details 页面。
2
Click Retry Payment Manually
点击右上角的 Retry Payment Manually。该按钮仅在支付符合条件时可用。
3
Check the result
Dodo Payments 会为本次尝试创建新的支付,该支付会显示在 Activity Log 中。如果扣款成功,订阅会恢复为
active,下一次计费日期会移至成功重试后一个计费周期。如果支付处理商尚未结算扣款,支付会显示为进行中,直到 payment.succeeded 或 payment.failed webhook 报告结果。
Retry Payment Manually on the transaction details page of a failed renewal
符合条件
只有此表中的每项检查均通过时,Dodo Payments 才会发送手动重试。Reason code 列显示 API 返回的内容:在GET /payments/{payment_id}/retry 上为 reason,在 POST /payments/{payment_id}/retry 上则作为错误 code 返回。
Manual Retry 在一个方面比自动重试更严格:它要求订阅处于
on_hold 状态。处于宽限期的 past_due 订阅无法通过此项检查。对于其他非 active 状态,自动重试仍会继续运行。请参阅 Subscription Status Transitions。重试限制
每张续费发票允许进行 3 次手动重试,每次重试之间有冷却时间:
这些限制同时适用于测试模式和实时模式。当达到上限而拒绝重试时,API 会返回
MANUAL_RETRY_LIMIT_REACHED(HTTP 429),错误正文只包含 code 和 message。要了解下一次重试何时开放,请检查重试状态,并读取 retry_available_at。当三次重试全部用完后,该字段为 null。
自动重试不会计入此上限,手动重试也不会计入自动计划的 8 次尝试。
手动重试与自动重试
两种重试路径的区别如下:通过 API 重试
先检查是否符合条件,然后发送重试。两个 endpoint 都需要传入失败支付的 ID。检查支付是否可以重试
对于不符合条件的支付,GET /payments/{payment_id}/retry 不会返回错误。它会返回 can_retry: false,并使用 reason 代码,因此您自己的控制面板或支持工具可以显示与 Dodo Payments 控制面板相同的状态。此操作需要 Viewer 角色。
Response
发送手动重试
POST /payments/{payment_id}/retry 会创建新的支付并对已保存的支付方式扣款。此操作需要 Editor 角色。SDK 示例会复用上一个示例中的 client。
Response
错误响应
不允许重试时,POST 会返回以下 HTTP 状态之一:
Error Codes 参考文档介绍了每个代码。
Webhooks
手动重试会创建普通支付,因此会触发与任何续费尝试相同的 webhook:
在这些事件的支付对象中,
retry_attempt 为 1 或更高,并且已设置 subscription_id,这与自动重试相同。支付对象没有用于标记手动尝试的字段,因此如果需要区分手动尝试和计划尝试,请保留重试响应中的 payment_id。
Payment Webhook Payloads
支付事件的完整 payload schema。
相关内容
Subscription Payment Retries
与手动重试并行运行的自动退避计划。
Subscription Dunning
硬拒付后发送电子邮件,要求客户更新其支付方式。
Handle Payment Failures
读取拒付代码,并判断何时值得重试。
Error Codes
每个
MANUAL_RETRY_* 代码、其触发条件及消息。