沙箱环境电脑网站支付报错 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(如有),再提交给支付宝开放平台技术支持确认应用状态。
备注:内容仅供参考。
