Skip to main content
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 报告结果。
显示失败支付的错误代码和消息、Activity Log 以及 Retry Payment Manually 按钮的 Transaction details 页面

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。
针对同一张卡重试硬拒付不会成功,反复被拒还会降低您的授权率。当原因是 MANUAL_RETRY_HARD_DECLINE 时,请改为要求客户更新其支付方式。Subscription Dunning 会自动执行此操作。

重试限制

每张续费发票允许进行 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_* 代码、其触发条件及消息。
最后修改于 2026年9月26日