PAYATHON 2026

沙箱环境电脑网站支付报错 ACCESS_FORBIDDEN

支付小周

结论

ACCESS_FORBIDDEN 表示支付宝网关拒绝当前应用访问该接口。对于沙箱 APPID 9021000140688476,常见原因有:

  • 调用了 alipay.trade.page.pay,但沙箱应用没有“电脑网站支付”能力;
  • 请求发往正式环境网关,或使用了其他应用的密钥;
  • 请求中的 app_id、应用私钥和支付宝公钥不属于同一套沙箱配置;
  • 应用状态或接口权限异常。

这个错误通常与订单金额、商品标题等业务参数无关。排查时应先检查接口权限和环境配置,反复修改支付参数一般解决不了问题。

排查与解决步骤

1. 确认接口是否正确

电脑网站支付应调用:

alipay.trade.page.pay

如果业务场景是手机网站支付,则应使用:

alipay.trade.wap.pay

这两个接口对应不同的产品能力,不能只修改页面样式就相互替代。

2. 检查沙箱应用的产品权限

登录支付宝开放平台,进入对应的沙箱应用,先确认 APPID 是:

9021000140688476

再检查该应用是否具备“电脑网站支付”能力,或是否拥有 alipay.trade.page.pay 接口权限。

如果后台没有这项能力,或能力状态不可用,需要在沙箱应用中开通、添加或重新配置相应产品。开放平台可能会调整控制台入口名称,请以当前后台显示为准。

3. 确认使用沙箱网关

沙箱环境必须请求以下网关:

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

不能使用正式环境网关:

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

还要检查 SDK 是否设置了环境开关。有时配置文件中虽然填写了沙箱 APPID,请求实际仍被发送到正式网关。

4. 核对 APPID 和密钥

以下配置必须来自同一个沙箱应用:

  • app_id
  • 应用私钥
  • 支付宝公钥,或支付宝公钥证书
  • 签名模式
  • 网关地址

常见的配置错误包括:

  • APPID 使用 9021000140688476,加载的却是另一个应用的私钥;
  • 将“应用公钥”误填到“支付宝公钥”的位置;
  • 后台采用密钥模式,代码却按证书模式初始化;
  • 重新生成密钥后,服务端仍在使用旧私钥;
  • sign_type 与实际签名方式不一致。

密钥有误时,更常见的是签名验证失败。但如果环境和应用配置混用,请求也可能在权限校验阶段被拒绝,所以仍需逐项核对。

5. 查看完整错误信息

只看 ACCESS_FORBIDDEN 无法判断唯一原因。请记录支付宝返回的完整内容,尤其是以下字段:

code
msg
sub_code
sub_msg

例如:

{
  "code": "40004",
  "msg": "Business Failed",
  "sub_code": "ACCESS_FORBIDDEN",
  "sub_msg": "..."
}

其中,sub_msg 通常包含进一步定位问题所需的信息。如果内容提示产品未签约、接口无权限或应用不可用,就应按提示处理相应权限,而不是修改订单号或金额。

Java 调用示例

下面的示例使用普通公钥模式。请将变量值替换为该沙箱应用的真实配置:

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.request.AlipayTradePagePayRequest;

public class AlipaySandboxPagePay {

    private static final String GATEWAY =
            "https://openapi.alipaydev.com/gateway.do";

    private static final String APP_ID =
            "9021000140688476";

    private static final String APP_PRIVATE_KEY =
            "YOUR_APP_PRIVATE_KEY";

    private static final String ALIPAY_PUBLIC_KEY =
            "YOUR_ALIPAY_PUBLIC_KEY";

    public static String createPayPage() throws AlipayApiException {
        AlipayClient client = new DefaultAlipayClient(
                GATEWAY,
                APP_ID,
                APP_PRIVATE_KEY,
                "json",
                "UTF-8",
                ALIPAY_PUBLIC_KEY,
                "RSA2"
        );

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl("https://example.com/alipay/return");
        request.setNotifyUrl("https://example.com/alipay/notify");

        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo("TEST_" + System.currentTimeMillis());
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        model.setSubject("沙箱电脑网站支付测试");
        model.setTotalAmount("0.01");

        request.setBizModel(model);

        // 返回的是用于跳转到支付宝收银台的 HTML。
        return client.pageExecute(request).getBody();
    }
}

电脑网站支付的 product_code 通常是:

FAST_INSTANT_TRADE_PAY

不过,正确设置该参数并不能代替接口授权。即使所有业务参数都没有问题,只要应用缺少 alipay.trade.page.pay 权限,网关仍会拒绝访问。

建议的最小化验证

排查时,可以先将请求精简到只保留必需参数:

{
  "out_trade_no": "TEST_唯一订单号",
  "product_code": "FAST_INSTANT_TRADE_PAY",
  "total_amount": "0.01",
  "subject": "沙箱支付测试"
}

并确认以下配置:

app_id = 9021000140688476
method = alipay.trade.page.pay
gateway = https://openapi.alipaydev.com/gateway.do
sign_type = RSA2

如果这组最小请求仍然返回 ACCESS_FORBIDDEN,应重点检查应用权限、应用状态和沙箱配置。

注意事项

  • 沙箱买家账号和正式支付宝账号彼此独立,测试时要使用沙箱提供的买家账号。
  • notify_url 通常需要允许支付宝服务器通过公网访问,本机 localhost 地址无法直接接收异步通知。不过,这一般不会导致创建支付页面时出现 ACCESS_FORBIDDEN。
  • out_trade_no 必须唯一。订单号重复通常会触发其他业务错误,不是造成该错误的主要原因。
  • 不要在公开页面粘贴私钥、完整签名串或沙箱账号密码。
  • 如果后台已确认具备电脑网站支付权限,网关和密钥也完全匹配,但错误仍然存在,请保存完整响应、请求时间、APPID 和支付宝返回的 trace_id(如有),再提交给支付宝开放平台技术支持确认应用状态。

备注:内容仅供参考。