PAYATHON 2026

在线调试 alipay.trade.pay 报 ACQ.PAYMENT_AUTH_CODE_INVALID

支付老李

结论

ACQ.PAYMENT_AUTH_CODE_INVALID 表示传给 alipay.trade.pay 的 auth_code 无效。使用沙箱付款码时,通常是请求进入了生产环境,或者付款码已经过期或使用过。

沙箱版 authCode 必须与沙箱应用、沙箱密钥和沙箱网关配套使用,不能发送到生产网关。

常见原因

1. 混用了沙箱付款码和生产环境

沙箱付款码必须请求沙箱网关:

https://openapi.alipaydev.com/gateway.do

生产网关是:

https://openapi.alipay.com/gateway.do

如果在线调试工具连接的是生产环境,即使 auth_code 来自沙箱支付宝客户端,也会返回:

ACQ.PAYMENT_AUTH_CODE_INVALID

还需要确认 app_id、应用私钥和对应的支付宝公钥都属于同一个沙箱应用,不能与生产应用的配置混用。

2. 付款码已经过期

付款码会动态更新,通常有效时间很短。复制后停留太久、反复修改请求参数或多次提交,都可能使付款码失效。

请在沙箱支付宝客户端重新打开付款码页面,取得最新的 auth_code 后立即发起请求。

3. 重复使用同一个付款码

付款码具有一次性或短周期动态特征。即使上一次支付请求没有返回预期结果,也可能已经导致当前付款码失效。

再次测试时,不要继续使用请求记录中的旧值,应重新获取付款码。

4. auth_code 传值不完整

检查付款码在复制、日志记录或参数拼装过程中是否出现以下问题:

  • 被截断;
  • 前后包含空格或换行;
  • 转换成数值后丢失精度;
  • 误传了订单号、授权码或其他字段;
  • JSON 字段名写错。

auth_code 应始终按字符串处理,不要使用 JavaScript Number、数据库数值字段等类型保存。

解决步骤

  1. 确认当前使用的是沙箱应用的 app_id。
  2. 确认签名所用的应用私钥属于该沙箱应用。
  3. 将网关设置为 https://openapi.alipaydev.com/gateway.do。
  4. 从沙箱支付宝客户端重新获取最新付款码。
  5. 将完整的付款码作为字符串传入 auth_code。
  6. 将 scene 设置为 bar_code。
  7. 使用新的 out_trade_no 发起测试,避免与之前的订单重复。
  8. 如果在线调试页面无法明确选择沙箱环境,请改用本地 SDK 或 HTTP 请求调用沙箱网关。

Java 示例

下面的示例假设已经准备好沙箱应用 ID、应用私钥和支付宝公钥:

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi.alipaydev.com/gateway.do",
    "沙箱应用APP_ID",
    "沙箱应用私钥",
    "json",
    "UTF-8",
    "沙箱支付宝公钥",
    "RSA2"
);

AlipayTradePayRequest request = new AlipayTradePayRequest();

AlipayTradePayModel model = new AlipayTradePayModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setScene("bar_code");
model.setAuthCode("刚刚从沙箱支付宝获取的付款码");
model.setSubject("沙箱付款码支付测试");
model.setTotalAmount("0.01");

request.setBizModel(model);

AlipayTradePayResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println("支付成功");
    System.out.println(response.getBody());
} else {
    System.out.println("支付失败");
    System.out.println("code: " + response.getCode());
    System.out.println("subCode: " + response.getSubCode());
    System.out.println("subMsg: " + response.getSubMsg());
    System.out.println("body: " + response.getBody());
}

请求参数示例

biz_content 的核心内容如下:

{
  "out_trade_no": "TEST_202609090001",
  "scene": "bar_code",
  "auth_code": "刚刚获取的沙箱付款码",
  "subject": "沙箱付款码支付测试",
  "total_amount": "0.01"
}

其中:

  • scene 必须是 bar_code;
  • auth_code 必须是当前有效的付款码;
  • out_trade_no 应在商户侧保持唯一;
  • total_amount 应以字符串形式传递。

注意事项

不要把沙箱付款码写死在代码中,也不要长期保存在调试请求里。每次测试前都应重新获取付款码,并尽快提交支付请求。

如果已经确认网关、应用 ID、密钥和付款码都属于同一个沙箱环境,但仍然报错,请记录完整的 code、sub_code、sub_msg 和请求时间,以便排查。日志中的付款码需要脱敏,避免泄露完整的支付凭证。

备注:内容仅供参考。