java支付宝沙箱测试扫码支付提示商户合作协议已到期
结论
“商户合作协议已到期”通常说明支付宝沙箱中的商户身份或相关产品签约已经失效,与 Java 代码、订单金额或二维码生成逻辑无关。
仅凭 AppID 2021000121607770 无法确定具体是哪项协议过期。需要登录该 AppID 所属的支付宝开放平台账号,进入沙箱应用,检查商家账号和产品签约状态。如果控制台没有续签或恢复入口,可以重置沙箱环境、重新创建沙箱应用,或联系支付宝开放平台技术支持处理。
常见原因
常见原因有:
- 沙箱商家账号长期未使用,测试协议或产品权限已经失效。
- 沙箱应用的“当面付”等产品未处于可用状态。
- 使用了旧沙箱应用的 AppID,却搭配了另一套商户账号、应用私钥或支付宝公钥。
- 请求被发送到生产网关,但使用的是沙箱参数,或者请求发往沙箱网关,却加载了生产配置。
- 代码传入了旧的
seller_id。没有特殊需求时,一般不必手动传入该参数。 - 沙箱环境的数据经过调整或重置,原来的商户关系已失效。
这类错误出现在支付宝校验商户权限的阶段。单纯重新生成二维码、修改订单号或更换 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. 重置或重新创建沙箱环境
如果应用配置没有问题,但控制台仍显示协议失效,而且没有续签入口,可以按以下步骤处理:
- 备份当前 AppID、密钥模式和测试账号信息。
- 使用控制台提供的重置功能,重新初始化沙箱数据。
- 重新生成并配置应用密钥。
- 获取新的沙箱买家和商家账号。
- 使用新配置重新发起订单。
重置后,原来的测试账号、密钥或商户 PID 可能不再有效,应以控制台最新显示的信息为准。
如果控制台没有重置功能,或重新创建应用后仍出现相同错误,请向支付宝开放平台技术支持提交问题,并提供:
- AppID:
2021000121607770 - 调用接口名称
- 请求时间
- 支付宝返回的
code sub_codesub_msgrequest_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 的后台核查结果为准。
备注:内容仅供参考。
