支付报错 ACQ.NO_PAYMENT_INSTRUMENTS_AVAILABLE 如何处理?
结论
ACQ.NO_PAYMENT_INSTRUMENTS_AVAILABLE 表示当前交易没有可用的付款工具。支付请求可能已正常受理,但付款方账户中没有符合本次交易条件的余额、银行卡或其他支付方式。
遇到这个错误时,应先引导用户添加或更换付款方式,再检查交易币种、金额、支付场景和商户已开通的支付能力。反复调用支付接口通常解决不了问题。
常见原因
常见原因有:
- 付款方未绑定银行卡,也没有其他可用的付款方式。
- 账户余额不足,绑定的银行卡也不可用。
- 现有付款工具不支持本次交易的币种、金额或业务场景。
- 银行卡已过期、被冻结、超过限额,或尚未完成必要的身份验证。
- 商户未开通对应的支付产品,限制了用户可选择的付款工具。
- 交易所在的国家或地区、终端类型、订单类型超出付款工具的支持范围。
- 支付渠道的风控或合规规则暂时限制了部分付款方式。
支付渠道会根据账户和交易信息判断具体原因及可用工具。仅凭这个错误码,通常无法确定是哪张银行卡或哪项规则导致付款工具不可用。
排查步骤
1. 检查接口返回内容
完整保存支付接口的响应信息,重点检查:
codesub_codemsgsub_msg- 商户订单号
- 支付平台交易号
- 请求时间
- 支付产品或渠道
- 币种和金额
具体字段名称以实际接入接口的响应结构为准。排查日志中不要记录银行卡号、验证码、完整身份信息等敏感数据。
2. 确认付款方是否有可用的付款方式
请用户进入付款账户,确认以下情况:
- 是否已添加银行卡或其他付款方式;
- 银行卡是否过期、冻结或受到银行限制;
- 余额或信用额度是否充足;
- 是否存在单笔限额、单日限额或跨境支付限制;
- 是否需要完成实名认证、3-D Secure 等验证;
- 当前付款工具是否支持订单币种和交易类型。
如果账户中没有可用工具,应引导用户添加新的付款方式。如果已有多个付款工具,可以更换后再试。
3. 核对支付请求
检查请求中的业务参数是否符合商户的签约能力:
- 金额是否正确,最小货币单位是否换算无误;
- 币种是否在商户和支付产品的支持范围内;
- 支付产品、支付场景和终端类型是否匹配;
- 买家所在的国家或地区是否受支持;
- 商户是否已开通对应的银行卡、余额或跨境支付能力;
- 测试环境是否使用了平台规定的测试账户和测试付款工具。
例如,接口要求以”分”为单位时,100 可能表示 1.00 元,而不是 100.00 元。金额单位应以所接入接口的文档为准。
4. 区分用户侧问题和商户配置问题
如果只有个别用户遇到这个错误,原因通常更可能出在用户账户、银行卡状态、额度或风控限制上。
如果大量用户在同一时间、使用同一币种或同一支付产品时均告失败,则需要进一步检查:
- 商户签约状态;
- 支付产品是否启用;
- 渠道路由配置;
- 币种和地区配置;
- 支付渠道是否出现服务异常。
5. 必要时联系支付平台
如果用户确认已经添加有效的付款方式,但错误仍然持续出现,可以向支付平台提交工单,并提供:
- 商户号;
- 商户订单号;
- 支付平台交易号;
- 错误码和错误信息;
- 发生时间及时区;
- 币种和金额;
- 支付场景;
- 已脱敏的请求与响应日志。
不要在工单或普通日志中提交完整银行卡号、CVV、安全验证码、私钥或访问令牌。
代码处理示例
业务系统应将这个错误归类为需要用户操作的支付失败,不要无限自动重试。
String subCode = response.getSubCode();
if ("ACQ.NO_PAYMENT_INSTRUMENTS_AVAILABLE".equals(subCode)) {
paymentOrder.markFailed(subCode);
return PaymentResult.failed(
"当前没有可用的付款方式,请添加或更换付款方式后重试。"
);
}
如果接口把错误码放在 code 字段中,应按照实际响应结构读取:
function handlePaymentResponse(response) {
const errorCode = response.sub_code || response.code;
if (errorCode === "ACQ.NO_PAYMENT_INSTRUMENTS_AVAILABLE") {
return {
success: false,
retryable: false,
action: "CHANGE_PAYMENT_METHOD",
message: "当前没有可用的付款方式,请添加或更换付款方式后重试。"
};
}
return handleOtherPaymentResult(response);
}
前端可以根据业务动作给出明确提示:
if (result.action === "CHANGE_PAYMENT_METHOD") {
showPaymentError("当前付款方式不可用,请添加或更换付款方式。");
showChangePaymentMethodButton();
}
这里的 retryable: false 表示系统不应在条件完全相同的情况下立即自动重试。用户添加付款方式、更换银行卡或调整订单后,可以重新发起支付。
注意事项
- 不要把这个错误直接解释成”接口参数错误”或”系统故障”。它主要表示当前交易没有可用的付款工具。
- 不建议在后台连续重试,以免产生重复请求、触发限流或增加触发风控的概率。
- 用户重新支付时,应继续使用唯一的商户订单号,或按照接口规则创建新的支付请求,避免重复扣款。
- 不要只根据前端跳转页面判断支付结果。最终状态应结合接口响应、异步通知和主动查询来确认。
- 不要向用户展示过多支付渠道的内部信息。提示用户”添加或更换付款方式”通常更容易理解。
- 不同支付产品对这个错误码的处理建议可能不同,最终应以当前接入接口的错误码文档和支付平台的排查结果为准。
备注:内容仅供参考。
