PAYATHON 2026

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

支付阿杰

结论

“商户合作协议已到期”通常说明支付宝沙箱中的商户身份或相关产品签约已经失效,与 Java 代码、订单金额或二维码生成逻辑无关。

仅凭 AppID 2021000121607770 无法确定具体是哪项协议过期。需要登录该 AppID 所属的支付宝开放平台账号,进入沙箱应用,检查商家账号和产品签约状态。如果控制台没有续签或恢复入口,可以重置沙箱环境、重新创建沙箱应用,或联系支付宝开放平台技术支持处理。

常见原因

常见原因有:

  1. 沙箱商家账号长期未使用,测试协议或产品权限已经失效。
  2. 沙箱应用的“当面付”等产品未处于可用状态。
  3. 使用了旧沙箱应用的 AppID,却搭配了另一套商户账号、应用私钥或支付宝公钥。
  4. 请求被发送到生产网关,但使用的是沙箱参数,或者请求发往沙箱网关,却加载了生产配置。
  5. 代码传入了旧的 seller_id。没有特殊需求时,一般不必手动传入该参数。
  6. 沙箱环境的数据经过调整或重置,原来的商户关系已失效。

这类错误出现在支付宝校验商户权限的阶段。单纯重新生成二维码、修改订单号或更换 Java SDK,通常无法解决问题。

解决步骤

1. 检查沙箱应用和产品权限

登录支付宝开放平台并进入沙箱应用,确认当前应用的 AppID 是:

2021000121607770

然后检查扫码支付依赖的产品是否已经开通,并且处于可用状态。常见的扫码支付接口是:

alipay.trade.precreate

该接口通常对应“当面付”能力。如果相关产品显示未签约、已失效或不可用,请通过控制台提供的入口重新开通或恢复。

支付宝可能会调整控制台页面,具体状态和操作入口以当前页面显示为准。

2. 确认使用沙箱网关

沙箱请求地址应为:

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

不要使用生产环境网关:

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

还要检查代码、配置文件和环境变量,确认程序启动时没有误读生产配置。

3. 核对整套应用配置

以下配置必须属于同一个沙箱应用:

  • app_id
  • 应用私钥
  • 支付宝公钥
  • 签名方式
  • 沙箱商家账号
  • 沙箱买家账号

注意区分“支付宝公钥”和“支付宝公钥证书”。普通公钥模式与证书模式的初始化方式不同,不能混用。

如果重新生成过密钥,需要将应用公钥重新配置到开放平台,并同步更新代码中的应用私钥和支付宝公钥。

4. 删除不必要的商户参数

调用 alipay.trade.precreate 时,一般不需要自行填写 seller_id。如果代码中仍保留以前的沙箱商户 PID,订单可能会被提交到已经失效的商户身份下。

可以先删除类似代码:

bizContent.put("seller_id", "旧的商户PID");

由支付宝根据当前 AppID 的签约关系确定收款商户。

5. 重置或重新创建沙箱环境

如果应用配置没有问题,但控制台仍显示协议失效,而且没有续签入口,可以按以下步骤处理:

  1. 备份当前 AppID、密钥模式和测试账号信息。
  2. 使用控制台提供的重置功能,重新初始化沙箱数据。
  3. 重新生成并配置应用密钥。
  4. 获取新的沙箱买家和商家账号。
  5. 使用新配置重新发起订单。

重置后,原来的测试账号、密钥或商户 PID 可能不再有效,应以控制台最新显示的信息为准。

如果控制台没有重置功能,或重新创建应用后仍出现相同错误,请向支付宝开放平台技术支持提交问题,并提供:

  • AppID:2021000121607770
  • 调用接口名称
  • 请求时间
  • 支付宝返回的 code
  • sub_code
  • sub_msg
  • request_id 或支付宝侧请求标识

不要在工单、日志或公开页面中提交应用私钥。

Java 调用示例

下面是普通公钥模式调用 alipay.trade.precreate 的基本结构。密钥和订单参数需要替换为当前沙箱应用的实际配置。

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;

public class AlipaySandboxDemo {

    private static final String GATEWAY_URL =
            "https://openapi-sandbox.dl.alipaydev.com/gateway.do";

    private static final String APP_ID = "2021000121607770";
    private static final String APP_PRIVATE_KEY = "你的应用私钥";
    private static final String ALIPAY_PUBLIC_KEY = "沙箱环境中的支付宝公钥";

    public static void main(String[] args) throws AlipayApiException {
        AlipayClient alipayClient = new DefaultAlipayClient(
                GATEWAY_URL,
                APP_ID,
                APP_PRIVATE_KEY,
                "json",
                "UTF-8",
                ALIPAY_PUBLIC_KEY,
                "RSA2"
        );

        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        model.setOutTradeNo("SANDBOX_" + System.currentTimeMillis());
        model.setTotalAmount("0.01");
        model.setSubject("沙箱扫码支付测试");

        AlipayTradePrecreateRequest request =
                new AlipayTradePrecreateRequest();

        request.setBizModel(model);
        request.setNotifyUrl("https://example.com/alipay/notify");

        AlipayTradePrecreateResponse response =
                alipayClient.execute(request);

        if (response.isSuccess()) {
            System.out.println("二维码内容:" + response.getQrCode());
        } else {
            System.out.println("code=" + response.getCode());
            System.out.println("msg=" + response.getMsg());
            System.out.println("subCode=" + response.getSubCode());
            System.out.println("subMsg=" + response.getSubMsg());
            System.out.println("body=" + response.getBody());
        }
    }
}

如果返回的 sub_msg 仍明确提示“商户合作协议已到期”,说明请求已经到达支付宝,但没有通过商户权限校验。此时应检查沙箱商户或签约状态,无需继续调整业务参数。

注意事项

  • 必须使用支付宝提供的沙箱版客户端登录沙箱买家账号,不能用真实支付宝账号完成沙箱付款。
  • 每次测试都应使用唯一的 out_trade_no,避免与历史订单冲突。
  • 不要将应用私钥、完整签名内容或敏感账号信息发布到公开社区。
  • 收到支付成功通知后,需要验签,并校验 app_id、out_trade_no、total_amount 和 trade_status。
  • HTTP 状态正常不等于支付接口调用成功,还要检查 code、sub_code 和 sub_msg。
  • 如果该 AppID 不属于当前登录的开放平台账号,当前账号无法修复其签约状态,需要由应用所有者操作。
  • 沙箱状态和控制台入口可能发生调整。如果页面显示正常,但接口持续提示协议到期,应以支付宝技术支持对该 AppID 的后台核查结果为准。

备注:内容仅供参考。