PC端调用生成支付URL返回ACQ.ACCESS_FORBIDDEN
结论
调用 alipay.trade.precreate 时返回 ACQ.ACCESS_FORBIDDEN,通常是应用尚未开通、未正确签约“当面付”,或当前应用没有对应权限。
其他可能原因包括应用与商户账号不匹配、签约尚未生效,以及沙箱与正式环境的配置混用。
原因分析
PC 端生成支付二维码时,如果调用的是:
alipay.trade.precreate
这个接口属于支付宝当面付产品。商户需要先完成产品签约,应用也要取得相应权限,接口才能正常返回二维码内容。
错误信息如下:
{
"alipay_trade_precreate_response": {
"msg": "Business Failed",
"code": "40004",
"sub_msg": "ACCESS_FORBIDDEN",
"sub_code": "ACQ.ACCESS_FORBIDDEN"
}
}
各字段的含义是:
code: 40004表示业务处理失败;sub_code: ACQ.ACCESS_FORBIDDEN表示当前调用方无权使用该业务能力;- 这类错误通常与产品签约、应用授权或调用环境有关,而不是签名格式或请求参数有误。
解决步骤
1. 确认使用的支付接口
先检查代码是否调用了 alipay.trade.precreate。该接口通常用于扫码支付,商户必须具备当面付权限。
如果实际需求是让用户在 PC 网站跳转到支付宝收银台,可以确认是否应改用电脑网站支付接口,例如:
alipay.trade.page.pay
不同接口属于不同的支付产品。不能只替换 API 名称,还要签约对应产品,并按照该产品的接入流程完成配置。
2. 检查产品签约状态
登录支付宝开放平台或商家平台,查看当前商户是否已开通当面付,并确认签约已经生效。
主要检查以下内容:
- 当面付是否已经签约;
- 签约是否审核通过并生效;
- 当前应用是否绑定在已完成签约的商户账号下;
- 应用是否已经上线,或是否满足正式环境的调用条件。
如果尚未开通,需要先申请当面付。具体能否开通及审核要求,以商户主体和平台当前页面显示的信息为准。
3. 核对应用与商户关系
确认请求中的 app_id 属于已签约当面付的商户应用。常见问题有:
- 应用由另一个支付宝账号创建;
- 商户已经签约,但调用接口的应用不属于该商户;
- 配置文件中仍使用旧的
app_id; - 服务商代商户调用时,没有正确传递授权信息。
如果使用服务商模式,还要确认商户授权仍然有效,并检查请求是否按照对应模式设置了授权参数。
4. 检查调用环境
沙箱与正式环境的账号、网关、应用 ID 和密钥不能混用。
正式环境通常使用:
https://openapi.alipay.com/gateway.do
确认以下配置都来自同一个环境:
app_id
gateway
private_key
alipay_public_key
使用沙箱时,应全部采用沙箱提供的应用和账号配置。如果只修改网关地址,却继续使用正式环境的 app_id 或密钥,调用也可能失败。
5. 等待权限生效后重新测试
如果刚刚完成签约、应用上线或权限调整,权限同步可能需要一些时间。可以稍后重新调用。若仍然返回相同错误,请准备 app_id、接口名称、请求时间和支付宝返回的请求标识,交由平台技术支持核查权限。
提交排查信息时,不要公开应用私钥、商户敏感信息或完整支付凭证。
调用示例
下面的示例使用 Java SDK 调用 alipay.trade.precreate。代码仅用于说明正常的调用结构,无法绕过产品权限检查。
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("ORDER_202609130001");
model.setTotalAmount("0.01");
model.setSubject("测试订单");
request.setBizModel(model);
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
String qrCode = response.getQrCode();
System.out.println("二维码内容:" + qrCode);
} else {
System.out.println("code:" + response.getCode());
System.out.println("subCode:" + response.getSubCode());
System.out.println("subMsg:" + response.getSubMsg());
}
接口正常返回时,支付二维码内容位于 qr_code 字段。该字段不一定是可以在浏览器中直接打开的普通网页 URL,而是用于生成支付二维码的内容。
注意事项
- 遇到
ACQ.ACCESS_FORBIDDEN时,应先检查产品签约和应用权限,不要反复修改签名代码。 - 当面付适用于扫码支付。PC 网站跳转支付通常需要评估是否使用电脑网站支付产品。
- 商户开通某项产品后,其名下所有应用不一定会自动获得对应权限,仍要核对实际使用的应用配置。
- 不要混用沙箱与正式环境的网关、
app_id和密钥。 - 前端展示二维码前,应先确认接口调用成功,并检查
qr_code是否为空。 - 支付结果应以服务端异步通知或主动查询结果为准,不能只依赖用户端的页面状态。
备注:内容仅供参考。
