H5支付提示沙箱模式商户合作协议已到期怎么办?
结论
这个提示与订单号无关,原因是当前沙箱商户的 H5 支付合作协议或产品权限已经失效,更换 out_trade_no 不能解决问题。
PC 网站支付正常,并不代表 H5 支付协议仍然有效,因为两者属于不同的产品能力:
- H5 支付通常调用
alipay.trade.wap.pay,product_code为QUICK_WAP_WAY - PC 网站支付通常调用
alipay.trade.page.pay,product_code为FAST_INSTANT_TRADE_PAY
原因分析
商户号 2088621987647163 和 APPID 2021000121616576 所属的沙箱环境可能存在以下情况:
- H5 支付产品的沙箱协议已经到期;
- 沙箱账号或应用曾被重置,导致原有产品授权失效;
- 沙箱规则更新后,需要重新确认协议或开通手机网站支付能力;
- 请求调用了 H5 支付接口,但当前应用只有 PC 网站支付权限;
- 应用、商户账号和签约产品不属于同一套沙箱配置。
这类错误通常出现在支付请求到达支付宝后,是商户协议或产品权限校验未通过,不是订单重复、金额格式错误或签名失败。
解决步骤
1. 检查沙箱应用与账号
登录支付宝开放平台,在沙箱环境中逐项确认:
- 当前应用的 APPID 是否为
2021000121616576; - 沙箱商家账号是否对应商户号
2088621987647163; - 应用是否仍然存在,状态是否正常;
- 手机网站支付能力是否已经开通;
- 页面上是否有重新签署、确认协议或续期的入口。
开放平台的页面可能会调整。如果找不到明确的续期入口,请以当前控制台显示的产品状态和操作提示为准。
2. 重新开通 H5 支付能力
进入该沙箱应用的产品或能力管理页面,找到”手机网站支付”或对应的 H5 支付产品,然后根据页面状态处理:
- 显示未开通时,重新添加并开通;
- 显示协议到期时,按提示重新确认协议;
- 显示异常但无法操作时,可以尝试重置沙箱环境或重新创建沙箱应用。
重置或重建后,APPID、沙箱商户号和支付宝公钥等配置可能发生变化,需要同步更新项目配置。
3. 核对接口和产品代码
H5 支付应调用:
alipay.trade.wap.pay
业务参数应使用:
{
"product_code": "QUICK_WAP_WAY"
}
不能用 PC 网站支付的 FAST_INSTANT_TRADE_PAY 代替 H5 产品代码。
4. 核对沙箱网关
沙箱请求应发送到:
https://openapi-sandbox.dl.alipaydev.com/gateway.do
正式环境网关为:
https://openapi.alipay.com/gateway.do
应用、商户账号、密钥和网关必须属于同一环境,沙箱与正式环境的配置不能混用。
Java 调用示例
以下代码只展示 H5 支付的核心调用结构。私钥、公钥和回调地址等内容需要替换成实际配置:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
"2021000121616576",
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://example.com/pay/return");
request.setNotifyUrl("https://example.com/pay/notify");
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setTotalAmount("0.01");
model.setSubject("H5支付测试");
model.setProductCode("QUICK_WAP_WAY");
model.setQuitUrl("https://example.com/order");
request.setBizModel(model);
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String form = response.getBody();
// 将 form 返回给浏览器,由浏览器自动提交或直接渲染
} else {
System.out.println("code=" + response.getCode());
System.out.println("subCode=" + response.getSubCode());
System.out.println("subMsg=" + response.getSubMsg());
}
如果使用通用请求方式,业务参数至少应包含:
{
"out_trade_no": "TEST_202609130001",
"total_amount": "0.01",
"subject": "H5支付测试",
"product_code": "QUICK_WAP_WAY",
"quit_url": "https://example.com/order"
}
注意事项
- 不要反复更换订单号来排查这个错误。协议到期后,无论订单号怎么变化,请求都会被拒绝。
out_trade_no在同一商户下仍需保持唯一,以免协议恢复后发生订单重复。- PC 网站支付和手机网站支付的签约状态需要分别检查。
- 重置沙箱环境前,请保存现有配置。重置后需要重新核对 APPID、商户号、应用私钥、支付宝公钥和沙箱买家账号。
- 支付结果应以异步通知和主动查询为准,不能只看同步跳转页面。
- 如果控制台显示 H5 产品状态正常,但接口仍提示协议到期,请保存完整的
code、sub_code、sub_msg和请求时间,并通过支付宝开放平台的技术支持渠道核查对应沙箱商户的状态。不要公开应用私钥、支付签名或完整的敏感请求内容。
备注:内容仅供参考。