支付宝沙箱支付一直提示“系统繁忙,请稍后再试”
结论
支付宝沙箱支付突然提示”系统繁忙,请稍后再试”,并不一定说明业务代码有问题。这个通用错误页面可能由沙箱环境临时异常触发,也可能与应用配置、签名、买家测试账号或支付参数的变化有关。
如果同一套代码之前能正常支付,近期也没有修改密钥、网关地址和请求参数,可以先等一段时间再试,并为每次测试生成新的 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。生成一个全新的订单号,用简单且固定的测试金额和商品标题重新发起支付。
如果等待一段时间后恢复正常,而且代码和配置没有变化,可以优先考虑沙箱环境临时异常。
第二步:记录支付宝的原始响应
不要只看浏览器最终显示的错误页面,还要记录接口请求阶段返回的原始响应,包括:
codemsgsub_codesub_msgbody- 异常堆栈
- 支付宝返回的请求标识(如果响应中存在)
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、支付宝公钥、应用私钥和正式网关,并在生产环境中完整测试支付、查询、退款和通知验签。
备注:内容仅供参考。
