在线调试 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、数据库数值字段等类型保存。
解决步骤
- 确认当前使用的是沙箱应用的
app_id。 - 确认签名所用的应用私钥属于该沙箱应用。
- 将网关设置为
https://openapi.alipaydev.com/gateway.do。 - 从沙箱支付宝客户端重新获取最新付款码。
- 将完整的付款码作为字符串传入
auth_code。 - 将
scene设置为bar_code。 - 使用新的
out_trade_no发起测试,避免与之前的订单重复。 - 如果在线调试页面无法明确选择沙箱环境,请改用本地 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 和请求时间,以便排查。日志中的付款码需要脱敏,避免泄露完整的支付凭证。
备注:内容仅供参考。
