PAYATHON 2026

支付宝沙箱测试扫码支付提示商户合作协议已到期怎么办?

支付阿杰

结论

这个提示一般说明支付宝沙箱中的模拟商户资格或相关产品协议已经失效,通常不是扫码支付代码本身的问题。

修改签名参数或重新生成二维码无法恢复协议状态。先到支付宝开放平台检查沙箱应用和沙箱商户的状态。如果平台提供重置或重新初始化入口,按页面提示操作;如果没有相关入口,需要联系支付宝开放平台技术支持,或者改用一套有效的沙箱应用和账号配置。

常见原因

常见原因有:

  • 沙箱中的模拟商户协议已到期。
  • 平台调整或重置了沙箱数据,但本地仍在使用旧的 app_id、商户账号或密钥。
  • 接口调用混用了沙箱应用和正式环境配置。
  • 二维码来自之前创建的旧订单,而该订单关联的商户状态已经失效。
  • 使用的买家账号、卖家账号或签名配置不属于当前沙箱应用。

这里的”合作协议”通常指支付宝侧维护的商户产品状态。即使请求签名正确,只要商户已经失去对应产品的使用资格,支付接口仍会拒绝交易。

处理步骤

1. 确认调用的是沙箱环境

扫码支付请求应发送到沙箱网关:

https://openapi-sandbox.dl.alipaydev.com/gateway.do

不要混用沙箱 app_id、沙箱密钥和正式网关,也不要用正式支付宝账号进行沙箱付款。

2. 检查沙箱应用和账号状态

登录支付宝开放平台,在沙箱环境中逐项确认:

  • 当前应用是否存在且状态正常。
  • 代码中的 app_id 是否与当前沙箱应用一致。
  • 沙箱卖家账号是否有效。
  • 扫码付款使用的是否为沙箱买家账号。
  • 当面付或扫码支付相关能力是否仍然可用。
  • 应用公钥、支付宝公钥和签名方式是否与后台配置一致。

开放平台页面可能随时间调整。如果页面中有”重置沙箱”、“重新初始化”或类似入口,可以按提示重新生成沙箱数据。

3. 更新本地配置

如果沙箱应用、账号或密钥发生了变化,需要同步修改项目配置。以 Java SDK 为例:

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi-sandbox.dl.alipaydev.com/gateway.do",
    "你的沙箱APP_ID",
    "你的应用私钥",
    "json",
    "UTF-8",
    "当前沙箱应用对应的支付宝公钥",
    "RSA2"
);

需要注意:

  • APP_ID 必须来自同一个沙箱应用。
  • 应用私钥必须与上传到该应用的公钥配对。
  • alipay_public_key 指支付宝公钥,不是应用公钥。
  • 如果使用证书模式,应按证书模式配置,不能与普通公钥模式混用。

4. 重新创建交易和二维码

更新配置后,不要继续扫描原来的二维码。使用新的商户订单号,重新调用预创建接口:

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

request.setBizContent("""
{
  "out_trade_no": "TEST_202609090001",
  "total_amount": "0.01",
  "subject": "沙箱扫码支付测试"
}
""");

AlipayTradePrecreateResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    System.out.println("qr_code=" + response.getQrCode());
} else {
    System.out.println("code=" + response.getCode());
    System.out.println("sub_code=" + response.getSubCode());
    System.out.println("msg=" + response.getMsg());
    System.out.println("sub_msg=" + response.getSubMsg());
}

每次重新测试都要保证 out_trade_no 唯一。旧订单号可能已经关闭或过期,也可能仍然关联旧的商户状态。

5. 无法恢复时联系平台支持

如果沙箱后台没有重置入口,重新配置后仍提示协议到期,可以向支付宝开放平台技术支持提交以下信息:

  • 沙箱应用的 app_id
  • 接口名称,例如 alipay.trade.precreate
  • 返回的 code、sub_code、msg 和 sub_msg
  • 请求时间
  • 支付宝返回的 trace_id,如果响应中存在
  • 脱敏后的请求参数和响应内容

不要提交应用私钥、完整的证书私钥或真实用户的敏感信息。

如何判断是不是代码问题

建议记录支付宝返回的完整业务响应:

System.out.println(response.getBody());

如果响应明确提示”商户合作协议已到期”,通常说明请求已经到达支付宝,并完成了商户资格校验。反复修改二维码生成逻辑、金额格式或异步通知地址,一般解决不了这个问题。

具体原因仍要以实际返回的 code 和 sub_code 为准。不同接口或不同时期的沙箱环境可能返回不同的错误码,不能只根据页面提示判断。

注意事项

  • 沙箱用于联调,平台不保证模拟商户和测试数据长期有效。
  • 重置沙箱后,原有账号、密钥、订单和二维码都可能失效。
  • 不要为了绕过提示切换到正式网关测试,正式环境可能产生真实交易。
  • 修复后应依次验证预创建、扫码付款、交易查询和异步通知,不能只确认二维码可以生成。
  • 如果正式环境也出现相同提示,需要检查真实商户的签约状态,并通过支付宝商家平台或开放平台处理。沙箱重置方式不适用于正式商户。

备注:内容仅供参考。