> ## Documentation Index
> Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 我的订单被拒了——是我的问题、我的配置问题，还是支付方式的问题？

> 针对商户最常提出的拒绝情形的决策树：A0018 支付方式/合同不匹配及产生它的每个维度、密钥轮换后的 A0001、C0005 渠道拒绝及随之返回的失败原因、退款时的 A0017，以及如何区分尚未开通的支付方式与错误的参数。

三种拒绝占了大多数上线工单：`A0018`、`A0001` 和 `C0005`。它们看起来很像——
一个错误码、一句简短消息、没有细节——但需要完全不同的应对。本页就是
决策树。逐错误码的参考是已发布的
[错误码列表](/docs/zh/developer-docs/tools-and-references/developer-tools/error-codes)；每个错误码的
机制在
[常见错误排障](/docs/zh/support/errors-troubleshooting-guide)和
[限额、币种与配置错误](/docs/zh/support/error-codes-and-limits-supplement)中。

## 我看到的是哪一种？

| 错误码 | 一句话解读 | 谁的问题 |
| - | - | - |
| `A0001` | API key 未被接受 | 你的凭据或你的环境 |
| `A0002` | 签名未通过验证 | 你的签名 |
| `A0003` | 请求本身格式错误 | 你的载荷 |
| `A0018` | 你没有任何协议与整个请求匹配 | 你的配置——或者某个参数收窄过度 |
| `A0008` / `A0020` / `A0021` | 金额或每日总额超出限额 | 你的请求相对于你的限额 |
| `A0035` / `A0036` | 手动 capture 不可用，或当前不可用 | 你的配置或订单的状态 |
| `C0005` | 支付方式拒绝了支付 | 支付方式——请读取失败原因 |
| `C0007` | 支付方式当前不可用 | 临时性的；重试或提供另一种方式 |
| `E0001` | 结果尚未可知 | 目前还不是任何人的问题——继续查询 |

第一个字母是最快的分流依据：`A` 由你修复，`C` 在 Waffo 或
支付方式一侧，`E` 表示未确定。绝不要把 `E` 当作失败——规则和
重试模式在已发布的
[错误处理](/docs/zh/developer-docs/core-concepts/error-handling)中。

## `A0018` 是"尚未开通"，还是我传错了什么？

两者都有可能，这正是问题的关键。`A0018` 不是指"你指定的支付方式
没有签约"。它的意思是**你签约的内容中没有任何一项在整个请求下存活**，
而请求会同时在多个维度上收窄候选项。其中任何一个都可能把集合
清空，而它们全部返回同一个错误码和同一条消息。

按以下顺序逐一排查——你找到的第一个不匹配就是答案：

| # | 维度 | 检查 |
| - | - | - |
| 1 | **商户 ID** | 请求体中的商户 ID 是否属于你用来签名的 API key？这里不匹配会让下面的一切都失去意义 |
| 2 | **支付方式和类型** | `payMethodName` / `payMethodType` 是否与 Service → Payin 上显示的完全一致——或者完全省略？ |
| 3 | **订单币种** | 该方式是否有一行带有这个 `orderCurrency`？需精确匹配 |
| 4 | **用户币种** | 如果你固定了 `userCurrency`，该币种对是否在某一行上？省略它会移除此维度 |
| 5 | **协议状态和有效期窗口** | 该行是否为 `Active`，今天是否在其有效日期内？已结束的行在查询响应中根本不会出现 |
| 6 | **国家** | 如果你固定了 `payMethodCountry`，它是否与该行的支付方式国家匹配？全球可用的方式不属于任何国家——不要为它们固定国家 |
| 7 | **终端** | 你发送的 `userTerminal` 是否是该方式支持的？ |
| 8 | **条件必填字段** | 某些方式需要额外字段；缺少一个会清空集合而不是产生字段错误——参见[条件与必填字段](/docs/zh/support/conditional-required-fields-faq) |
| 9 | **卡或 token 数据** | 发送原始卡数据或已保存的 token 会把候选项限制为卡类协议，而 token 仍必须解析到你已签约的方式 |
| 10 | **跨币种定价** | 无法定价的跨币种订单也会在这里被拒绝 |
| 11 | **实时可用性** | 该方式可能已签约但在那一刻不可用 |

所以：**未开通和传错是通过排除法而不是错误码来区分的。** 最快的
区分方法：

1. 调用 `/api/v1/paymethodconfig/inquiry`。如果方式、国家和币种的组合不在
   响应中，那就是配置问题——你在载荷中改任何东西都没用。
2. 如果它*在*响应中且可用性为"available"，则该组合已签约，
   拒绝来自请求本身添加的某些内容——上面第 1、6、7、8、9 行之一。
   逐个移除可选的收窄参数并重试。

有两个错误码与 `A0018` 相邻，含义与缺少合同相反——它们表示你有
**不止一个**匹配，必须指定明确：`A0022`（指明产品）和 `A0033`（指明
支付方式国家）。

## 为什么不支持的币种没有自己的错误码？

因为币种是上述维度之一，不是单独的检查。你未签约的订单币种或
币种对会以 `A0018` 返回，带支付方式的措辞。不要
等待一个币种专属的错误码——参见
[使用某个币种前我必须先开通它吗？](/docs/zh/support/currency-and-method-enablement-faq)。

## 同一个错误码出现在订阅上，含义一样吗？

错误码共用但解读不同。在收单侧它是上述合同不匹配。
在**订阅**侧它表示没有可用的支付方式来向该
订阅者扣款——例如已保存的方式被移除了。已发布的错误码列表按
第二种方式解释；而你收到的消息文本是合同措辞。请结合你调用的 API
一起解读。

值得为之构建的一个后果：在首个周期之后的续订上，此错误码被视为
**不可重试**——调度不会继续尝试。请修复支付方式，而不是等待
重试。参见
[订阅重试与支付方式](/docs/zh/support/subscription-retry-and-payment-methods-faq)。

## 我轮换了密钥，现在收到 `A0001`。新密钥坏了吗？

通常不是。按顺序排除三件事：

| 检查 | 详情 |
| - | - |
| **环境** | 沙箱和生产有各自独立的密钥**和**独立的域名。沙箱密钥发到生产域名会得到 `A0001`，反之亦然 |
| **激活状态** | 已提交的密钥在激活之前不可用。仍在审核中或已被拒绝的提交，表现得像一个不存在的密钥 |
| **传播** | 刚激活的密钥不会在同一瞬间在所有地方被接受。请把轮换做成重叠——添加新密钥，等待，保留旧密钥直到新密钥已验证真实流量——而不是一刀切换 |

该窗口有多长、密钥、其范围、签名和你的 IP
白名单的精确检查顺序，以及 `A0001` 与 `A0002` 和范围拒绝的区别，在
[API 凭据范围与鉴权错误分流](/docs/zh/support/api-credential-scope-and-triage-faq)中。
提交和轮换流程，以及在哪里查看提交被拒绝的原因，在
[生产 API 密钥与公钥](/docs/zh/support/production-api-key-and-public-key-faq)中。

如果密钥被接受但调用仍被拒绝，原因通常是该密钥
被允许做什么——那是另一种拒绝，不是 `A0001`。

## `C0005` 到底告诉我什么，原因在哪里？

`C0005`——*Payment channel rejection*——表示支付方式拒绝了支付。就其本身而言
它几乎什么都没告诉你，因为它是大量底层拒绝所映射到的错误码，
包括每一次卡被拒绝。

细节在**随订单返回的失败原因**中，它有两部分：

| 字段 | 用途 |
| - | - |
| `orderFailedCode` | 一个稳定的值，供你在自己的代码中做分支判断 |
| `orderFailedDescription` | 供支持对话和日志使用的人类可读文本 |

它们作为 `orderFailedReason` 一起出现在
[订单查询](/docs/api-reference/introduction)中，Portal 在交易
记录上以 *Order Failure Code* 和 *Order Failure Description* 显示同一对字段——参见
[交易字段参考](/docs/zh/support/transaction-field-reference-faq)。

所以常规做法是：**绝不要基于 `C0005` 分支；基于其中的失败码分支。** 诸如
无法启动的认证步骤、或发卡行因欺诈或法律原因拒绝的卡，
正是通过这种方式到达的信息，它们需要
截然不同的处理。

## 哪些 `C0005` 失败值得重试？

可重试性属于底层原因，而不是 `C0005`。分类以及每一类
该怎么做——包括哪些拒绝绝不能重试、哪些需要顾客
重新输入凭据——在
[卡被拒绝了，我应该重试吗？](/docs/zh/support/order-amount-precision-and-decline-faq)中。

在此之上的两条规则：

* **向顾客显示可用的消息并提供另一种支付方式。** Waffo 在集成验收时
  会针对渠道拒绝和系统不可用响应精确检查这一行为——
  参见已发布的
  [验收标准](/docs/zh/developer-docs/tools-and-references/references/acceptance-criteria)。
* 在沙箱中，若干保留金额会故意返回 `C0005`，以便你构建该路径。如果
  你在一个你没预料到有特殊含义的金额上收到 `C0005`，请在下结论前先检查保留列表——参见
  [沙箱模拟器](/docs/zh/developer-docs/tools-and-references/developer-tools/sandbox-simulator)。

## 退款返回了 `A0017`。那笔订单还能通过 API 退款吗？

`A0017`——*订单无法退款，因为支付渠道不支持*——来自
支付方式本身，并且**不可重试**。原样再发一次会得到
同样的答案。

在把它视为最终结果之前，先把它与其他退款拒绝区分开：

| 情形 | 去哪里看 |
| - | - |
| 该方式完全不允许退款，或只允许你没有请求的形式 | 你协议上的退款政策——查询响应中的 `refundAllowed`，Service → Payin 上的 `Refundable` |
| 退款窗口已关闭 | 同一行上的退款期限 |
| 订单不在可退款状态，或已全额退款 | 订单本身 |
| 该方式无法通过 API 处理退款 | `A0017` |

这四种情形及各自的处理办法，在
[支付方式退款与限额](/docs/zh/support/payment-method-refund-limits-faq)和
[退款 FAQ](/docs/zh/support/refund-faq)中。

## 接下来我该看哪里？

| 问题 | 页面 |
| - | - |
| 我的限额是多少，我撞到了哪个限额？ | [Payin 协议与交易限额](/docs/zh/support/payin-agreements-and-limits-faq) |
| 通过代码查我签约了什么？ | [支付方式配置与限额](/docs/zh/support/payment-method-config-and-limits-faq) |
| 这是币种问题吗？ | [币种与支付方式开通](/docs/zh/support/currency-and-method-enablement-faq) |
| 这到底是不是我能修的？ | [我自己能改什么？](/docs/zh/support/self-service-boundaries-faq) |
| 签名、幂等和未知状态处理 | [常见错误排障](/docs/zh/support/errors-troubleshooting-guide) |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.