PAYATHON 2026

支付宝沙箱支付一直提示“系统繁忙,请稍后再试”

支付阿杰

结论

支付宝沙箱支付突然提示”系统繁忙,请稍后再试”,并不一定说明业务代码有问题。这个通用错误页面可能由沙箱环境临时异常触发,也可能与应用配置、签名、买家测试账号或支付参数的变化有关。

如果同一套代码之前能正常支付,近期也没有修改密钥、网关地址和请求参数,可以先等一段时间再试,并为每次测试生成新的 out_trade_no。如果问题一直存在,再按下面的顺序检查请求日志、沙箱配置和测试账号。

常见原因

1. 沙箱环境临时异常

支付宝沙箱用于接口联调,稳定性通常不及生产环境。即使业务代码和配置没有变化,支付页面也可能打不开,或者出现登录失败、“系统繁忙”等情况。

排查时可以留意这些现象:

  • 前一天还能正常支付,代码和配置没有改动;
  • 多个测试订单都出现相同提示;
  • 请求已经跳转到支付宝页面,但错误发生在页面内部;
  • 更换其他沙箱买家账号后仍然失败。

这些现象只能表明沙箱环境出现异常的可能性较高,最终还要结合接口响应和支付宝开放平台提供的信息判断。

2. 重复使用订单号

out_trade_no 是商户订单号,在商户应用范围内必须保持唯一。重复提交已经支付、关闭或状态异常的订单号,可能导致交易无法重新创建。

排查时不能只修改支付金额,应直接生成新的订单号:

String outTradeNo = "TEST_" + System.currentTimeMillis();

再次测试前,也可以调用 alipay.trade.query 查询旧订单的状态,以免把订单状态问题当成沙箱故障。

3. 网关地址使用错误

沙箱环境必须使用沙箱网关:

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

正式环境使用:

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

如果沙箱应用配置了正式网关,或者正式应用误用了沙箱网关,请求中的 app_id、密钥和网关环境便无法对应,支付也就不能正常完成。

4. 应用和密钥不匹配

以下配置必须来自同一个沙箱应用:

  • app_id
  • 应用私钥
  • 支付宝公钥
  • 签名方式
  • 网关地址

常见错误有:

  • 重新生成应用密钥后,程序仍在使用旧私钥;
  • 把”支付宝公钥”误填成”应用公钥”;
  • 多套环境共用配置,程序实际加载了生产环境变量;
  • 使用 RSA2 签名,但客户端配置成了其他签名类型;
  • 复制或读取私钥时丢失了换行或头尾字符。

建议明确配置签名类型和字符集:

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi-sandbox.dl.alipaydev.com/gateway.do",
    appId,
    merchantPrivateKey,
    "json",
    "UTF-8",
    alipayPublicKey,
    "RSA2"
);

其中,merchantPrivateKey 是应用私钥,alipayPublicKey 是该沙箱应用对应的支付宝公钥。

5. 沙箱买家账号异常

测试沙箱支付时,应使用支付宝开放平台提供的沙箱买家账号,不能直接使用真实支付宝账号。

如果支付请求可以打开,但在登录或确认付款时出现”系统繁忙”,需要检查:

  • 登录账号是否为沙箱买家账号;
  • 是否混用了登录密码和支付密码;
  • 沙箱账号信息是否被重置;
  • 买家账号余额是否足够;
  • 当前客户端是否适合进行沙箱测试。

如果无法确认账号信息,应以支付宝开放平台沙箱页面当前显示的内容为准,不要继续使用以前保存的账号和密码。

6. 支付参数不合法

部分参数错误会返回明确的 sub_code,但有些支付页面异常只会显示通用提示。排查时应重点检查:

  • product_code 是否符合当前接口场景;
  • total_amount 是否为合法金额;
  • subject 是否为空;
  • out_trade_no 是否唯一;
  • return_url 和 notify_url 的格式是否正确;
  • 请求参数是否在签名后又被修改;
  • 系统时间是否存在明显误差。

电脑网站支付通常使用:

{
  "out_trade_no": "TEST_1757400000000",
  "product_code": "FAST_INSTANT_TRADE_PAY",
  "total_amount": "0.01",
  "subject": "沙箱支付测试"
}

金额不要直接用浮点数计算。业务系统可以使用 BigDecimal:

BigDecimal amount = new BigDecimal("0.01");

建议的排查步骤

第一步:生成新订单后重试

不要反复提交原来的 out_trade_no。生成一个全新的订单号,用简单且固定的测试金额和商品标题重新发起支付。

如果等待一段时间后恢复正常,而且代码和配置没有变化,可以优先考虑沙箱环境临时异常。

第二步:记录支付宝的原始响应

不要只看浏览器最终显示的错误页面,还要记录接口请求阶段返回的原始响应,包括:

  • code
  • msg
  • sub_code
  • sub_msg
  • body
  • 异常堆栈
  • 支付宝返回的请求标识(如果响应中存在)

Java SDK 调用示例:

AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(returnUrl);
request.setNotifyUrl(notifyUrl);

AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setProductCode("FAST_INSTANT_TRADE_PAY");
model.setTotalAmount("0.01");
model.setSubject("沙箱支付测试");

request.setBizModel(model);

try {
    AlipayTradePagePayResponse response = alipayClient.pageExecute(request);

    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());

    if (response.isSuccess()) {
        // pageExecute 返回的 body 通常是表单或跳转内容,需要输出到浏览器。
        String paymentForm = response.getBody();
    }
} catch (AlipayApiException e) {
    e.printStackTrace();
}

日志中不要输出应用私钥、完整签名和用户密码等敏感信息。

第三步:核对程序实际加载的配置

除了检查配置文件,还要确认程序运行时真正读取了哪套配置。多环境部署中,配置文件本身可能没有问题,但运行进程读取的却是另一套环境变量。

以下非敏感信息可以安全记录:

System.out.println("gateway: " + gatewayUrl);
System.out.println("appId: " + appId);
System.out.println("signType: " + signType);
System.out.println("charset: " + charset);

不要记录:

应用私钥
完整请求签名
沙箱账号登录密码
支付密码

第四步:使用最小参数验证

先移除非必要的扩展参数,只保留订单号、金额、标题和 product_code。如果最小请求可以成功,再逐项恢复其他参数,找出导致异常的具体配置。

还要确认请求过程中没有重复编码。例如,SDK 已经完成签名和 URL 编码后,不应再次编码整个支付地址。

第五步:区分接口错误和支付页面错误

如果 SDK 直接返回失败,并带有 sub_code、sub_msg,应先根据具体错误信息修改请求。

如果接口调用成功并生成了支付表单,浏览器进入支付宝页面后才显示”系统繁忙”,则应重点检查:

  • 沙箱买家账号;
  • 当前订单状态;
  • 浏览器缓存和登录状态;
  • 沙箱支付页面本身是否异常。

可以退出当前账号,清理沙箱页面相关的 Cookie,或者改用无痕窗口测试。这些操作只能帮助排除本地会话问题,无法解决沙箱服务端故障。

如何判断是否需要等待沙箱恢复

如果同时符合以下情况,可以暂时停止修改代码:

  • 代码近期没有变更;
  • 已经核对沙箱应用、密钥和网关配置;
  • 每次测试都使用新的订单号;
  • 多个沙箱买家账号都无法支付;
  • 接口没有返回明确的业务参数错误;
  • 故障出现在支付宝托管的支付页面中。

此时频繁修改签名、密钥或支付参数,可能会带来新的问题。可以先保存故障时间、完整错误响应、订单号和页面截图,稍后再用新订单测试。

如果等待较长时间后仍未恢复,应通过支付宝开放平台当前提供的技术支持入口提交问题。建议附上:

  • 沙箱应用的 app_id;
  • 接口名称;
  • 故障发生时间;
  • 商户订单号;
  • 响应中的 code、sub_code 和请求标识;
  • 错误页面截图;
  • 已完成的排查项目。

不要在工单、论坛或聊天记录中提交应用私钥、账号密码和支付密码。

注意事项

沙箱支付恢复后,还需要验证异步通知。浏览器成功跳转到 return_url,并不能证明订单已经可靠地支付成功。业务系统应对 notify_url 收到的异步通知进行验签,并根据 trade_status 更新订单。

沙箱环境测试成功,也不代表生产环境可以直接使用。上线前仍要重新配置正式应用的 app_id、支付宝公钥、应用私钥和正式网关,并在生产环境中完整测试支付、查询、退款和通知验签。

备注:内容仅供参考。