Skip to main content

概述

当支付尝试失败时,Dodo Payments 会返回一个标准化失败代码,说明失败原因。这些代码在不同支付方式和支付处理商之间保持一致,因此一套处理规则即可覆盖所有失败支付。 webhook 和 payment object 会为失败支付公开以下字段:
  • error_code:下表中的标准化失败代码。
  • error_message:专门为您(商户)编写的说明。当 error_code 是下方的标准化代码之一时,此字段包含标题和建议操作,而不是支付处理商返回的原始文本。
  • retry_attempt:原始扣款为 0,每次计划内订阅续费重试为 1 或更高值。非订阅续费支付的值保持为 0。
使用这些代码向客户提供清晰的反馈,判断重试是否可能成功,并挽回更多收入。

商户文案与客户文案

每个标准化失败代码都对应两条消息,一条面向您,另一条面向您的客户:
Customer Portal 在 error_message 中返回面向客户的措辞,而 merchant API 针对同一笔支付返回面向商户的措辞。两者中的 error_code 相同。

Handle Payment Failures

一份分步开发者指南,介绍如何从 webhook 和 API 中读取这些代码、将其展示给客户,以及判断何时重试。

软拒绝与硬拒绝

每个失败代码都属于软拒绝或硬拒绝。该类型用于说明:之后使用相同支付信息的尝试是否可能成功,或者客户是否必须先采取措施。 对于订阅续费,Dodo Payments 会自动应用此分类。Subscription Payment Retries 会重新尝试软拒绝。硬拒绝会立即终止重试链;请通过 Subscription Dunning 进行挽回。
绝不要向客户透露 STOLEN_CARD、LOST_CARD、PICKUP_CARD 或 FRAUDULENT 的真实原因。 透露这些原因可能会向欺诈行为人发出警示。请向客户显示通用的拒绝消息(例如,“您的卡片已被拒绝。请联系您的银行或使用其他卡片。”),并且只在内部记录具体代码。Dodo Payments 会在其控制的界面上应用此规则。对于这四个代码,checkout、Customer Portal 和 dunning 邮件会显示通用的拒绝消息,而面向商户的文案会保留真实原因。在任何将 merchant API 返回的 error_message 展示给客户的地方,都应应用相同规则。

交易失败原因

下表列出了所有失败代码及其拒绝类型、客户是否可以解决、描述和建议操作。
User Error 表示客户是否可以解决此次拒绝。Yes 表示客户可以修复问题,例如输入正确的卡片信息。No 表示拒绝由系统级问题或银行限制导致,客户无法直接解决。
发卡银行也可能因为其自身的风险引擎将持卡人标记为高风险而拒绝该卡,与商户或交易详情无关。这类拒付通常会显示为通用代码,例如 DO_NOT_HONOR、GENERIC_DECLINE、CARD_DECLINED、TRANSACTION_NOT_APPROVED 或 FRAUDULENT。银行不会提供具体原因,Dodo Payments 和商户也都无法撤销这一决定。请让客户联系其银行解决该风险标记,或改用其他银行卡或支付方式。

以编程方式处理失败

从 payment.failed webhook 或 payment object 中读取 error_code,将其映射到表中的建议操作,并决定是否重试。对于订阅续费,Dodo Payments 会代您重试软拒绝。请参阅 Subscription Payment Retries。 对于不是卡片拒绝的 API 和业务逻辑错误,例如 PAYMENT_NOT_SUCCEEDED 或 REFUND_WINDOW_EXPIRED,请参阅 Error Codes 参考文档。

相关内容

Handle Payment Failures

检测、展示和重试失败付款的端到端指南。

Error Codes

适用于非拒绝类失败的 API 和业务逻辑错误代码。

Subscription Payment Retries

在订阅续费时自动重试并恢复软拒绝的机制。

Subscription Dunning

通过提示更新支付方式来恢复硬拒绝的邮件序列。

支持

如果需要更多有关交易失败或集成问题的帮助,请通过 support@dodopayments.com 联系支持团队。
最后修改于 2026年9月28日