概述
当支付尝试失败时,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
软拒绝与硬拒绝
每个失败代码都属于软拒绝或硬拒绝。该类型用于说明:之后使用相同支付信息的尝试是否可能成功,或者客户是否必须先采取措施。
对于订阅续费,Dodo Payments 会自动应用此分类。Subscription Payment Retries 会重新尝试软拒绝。硬拒绝会立即终止重试链;请通过 Subscription Dunning 进行挽回。
交易失败原因
下表列出了所有失败代码及其拒绝类型、客户是否可以解决、描述和建议操作。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 参考文档。