支付宝 App 沙箱支付提示商户合作协议已到期,如何签约?
结论
这条提示说明沙箱商户的支付产品合作协议已经失效,与支付参数、签名或客户端代码无关。开发者通常无法通过接口重新签署沙箱协议。请先在支付宝开放平台检查应用和产品状态。如果控制台没有续签或重新开通入口,需要向支付宝开放平台技术支持提交工单,请平台核查并恢复 appid 2021000121667196 对应的沙箱支付协议。
更换签名算法、重复生成订单或修改回调地址都无法解决协议到期问题。
可能原因
可能的原因有:
- 沙箱应用长期未使用,关联的支付产品协议已经失效。
- 沙箱环境或沙箱商户账号经过调整、重置,但原协议没有同步恢复。
- 调用使用了沙箱 appid,网关、商户账号或密钥却混入了正式环境配置。
- 该沙箱应用未开通
alipay.trade.app.pay对应的支付能力,或能力状态异常。 - 控制台显示能力正常,但支付宝服务端保存的协议状态已经过期。
支付宝需要根据 appid 查询后台协议记录,单凭接口报错无法判断具体属于哪种情况。
处理步骤
1. 确认当前调用使用完整的沙箱配置
服务端配置至少应满足:
appid = 2021000121667196
gateway = https://openapi-sandbox.dl.alipaydev.com/gateway.do
还需要逐项确认:
- 使用的是该沙箱应用对应的应用私钥。
- 支付宝公钥与当前应用的密钥配置匹配。
- 买家账号来自同一套沙箱账号。
- 沙箱配置中没有混入正式环境的 appid、网关、证书或商户账号。
如果存在网关或账号混用,先统一环境,再重新测试。
2. 检查开放平台中的应用和产品状态
登录支付宝开放平台,进入对应的沙箱应用,检查:
- 应用是否仍然存在并且可以使用。
- App 支付能力是否已开通。
- 产品或能力状态是否为“已签约”“已生效”或其他可用状态。
- 控制台是否有“重新签约”“重新开通”等入口。
- 沙箱商户账号是否正常。
开放平台的菜单名称可能会调整,相关页面一般可以从“控制台”“研发服务”或“沙箱应用”进入。
如果页面提供重新开通入口,按提示完成操作。等待状态生效后,创建一笔新的沙箱订单进行测试,不要继续使用此前失败的订单号。
3. 必要时重置沙箱环境
如果控制台提供“重置沙箱账号”或类似功能,可以在确认现有测试数据不再需要后尝试重置。
重置可能会改变:
- 沙箱买家或卖家账号信息。
- 登录密码、支付密码。
- 应用密钥或关联配置。
- 已创建的测试订单和交易数据。
完成重置后,需要重新核对 appid、密钥、支付宝公钥和沙箱账号。如果重置页面没有明确说明会恢复合作协议,就不能把重置视为一定有效的解决办法。
4. 向支付宝开放平台提交工单
如果控制台没有续签入口,或者重新开通后仍然报错,需要联系支付宝开放平台技术支持。工单中建议提供:
环境:支付宝开放平台沙箱环境
调用产品:App 支付
接口:alipay.trade.app.pay
appid:2021000121667196
错误提示:商户合作协议已到期,无法继续使用,请联系商户处理
诉求:请核查该沙箱应用对应的支付产品协议状态,并协助重新签约或恢复
同时附上以下信息,方便技术支持定位:
- 报错页面截图。
- 请求时间。
- 接口返回的
code、sub_code、sub_msg。 - 支付宝返回的
trace_id,如果响应中存在。 - 脱敏后的请求参数。
- 控制台中支付能力状态的截图。
不要在工单中上传私钥、支付密码、完整授权令牌等敏感信息。
App 支付调用示例
下面的 Java 示例可以用来检查标准调用方式,但只能验证接口配置,无法通过代码续签已经到期的合作协议。
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
"2021000121667196",
"YOUR_APP_PRIVATE_KEY",
"json",
"UTF-8",
"YOUR_ALIPAY_PUBLIC_KEY",
"RSA2"
);
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setTotalAmount("0.01");
model.setSubject("沙箱支付测试");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if (response.isSuccess()) {
// 将 response.getBody() 原样返回给 App,由支付宝 SDK 拉起支付
System.out.println(response.getBody());
} else {
System.out.println("code: " + response.getCode());
System.out.println("subCode: " + response.getSubCode());
System.out.println("subMsg: " + response.getSubMsg());
}
配置中不要直接填写真实私钥:
"YOUR_APP_PRIVATE_KEY"
"YOUR_ALIPAY_PUBLIC_KEY"
密钥应从安全的配置中心或环境变量中读取,并确认属于 appid 2021000121667196。
注意事项
- “合作协议已到期”是商户产品权限或协议状态问题,不是 RSA2 验签失败。
- 如果正式环境支付正常,只有沙箱报错,应优先检查沙箱应用的协议状态,不要修改正式应用配置。
- 不建议直接新建应用来绕过错误。更换 appid 后还要修改密钥、回调地址和客户端配置,而且无法修复原应用的协议状态。
- 协议恢复后,使用新的
out_trade_no重新发起支付,避免旧订单状态干扰验证。 - 如果工单确认该沙箱 appid 无法恢复,再按照平台的处理意见重建沙箱应用或重置沙箱账号。原 appid 能否保留,以支付宝开放平台的实际处理结果为准。
备注:内容仅供参考。
