PAYATHON 2026

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 是否为空。
  • 支付结果应以服务端异步通知或主动查询结果为准,不能只依赖用户端的页面状态。

备注:内容仅供参考。