支付宝沙箱环境提示“系统太忙”导致无法支付是什么原因?
结论
如果同一套代码和配置昨天还能完成支付,今天二维码页面和沙箱账号登录页面却同时提示”系统太忙”,问题通常不在二维码生成代码本身。常见原因包括:
- 支付宝沙箱服务暂时异常或访问拥堵。
- 沙箱买家账号、测试数据或登录状态失效。
- 使用了已经过期、关闭或状态异常的二维码。
- 请求已被网关拒绝,但程序只展示二维码,没有检查接口返回的错误信息。
- 本地时间、沙箱网关或应用密钥等配置发生了变化。
如果连支付宝提供的沙箱登录页面也无法正常进入,应先排查沙箱平台或测试账号。
先检查接口的真实返回结果
不要只凭收银台页面上的”系统太忙”判断原因。生成二维码时,需要完整记录支付宝网关返回的 code、sub_code、sub_msg 和 out_trade_no。
以 Java SDK 的 alipay.trade.precreate 为例:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "TEST_" + System.currentTimeMillis());
bizContent.put("total_amount", "0.01");
bizContent.put("subject", "沙箱支付测试");
request.setBizContent(bizContent.toJSONString());
try {
AlipayTradePrecreateResponse response = alipayClient.execute(request);
System.out.println("code=" + response.getCode());
System.out.println("msg=" + response.getMsg());
System.out.println("sub_code=" + response.getSubCode());
System.out.println("sub_msg=" + response.getSubMsg());
System.out.println("out_trade_no=" + response.getOutTradeNo());
System.out.println("qr_code=" + response.getQrCode());
System.out.println("body=" + response.getBody());
if (!response.isSuccess()) {
throw new IllegalStateException(
"支付宝预下单失败:" + response.getSubCode() + " - " + response.getSubMsg()
);
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
只有当 response.isSuccess() 为 true,且接口返回了有效的 qr_code 时,程序才应生成二维码图片。错误响应、空地址或旧地址都不应继续展示给用户。
错误原因应以接口实际返回的 sub_code 和 sub_msg 为准。类似 SYSTEM_ERROR 的结果通常只能说明当前请求处理失败,不能仅凭错误名称判断是业务参数有误还是平台发生故障。
排查步骤
1. 重新生成交易和二维码
不要继续使用昨天生成的二维码。每次测试都要创建新的 out_trade_no,并重新调用预下单接口。
String outTradeNo = "SANDBOX_" + System.currentTimeMillis();
不要让同一个 out_trade_no 对应不同的金额或商品信息,否则可能引发重复交易或参数冲突。
2. 确认使用的是完整沙箱配置
检查以下配置是否全部来自同一个沙箱应用:
网关:https://openapi-sandbox.dl.alipaydev.com/gateway.do
app_id:沙箱应用 APPID
应用私钥:与沙箱应用公钥匹配的私钥
支付宝公钥:沙箱环境提供的支付宝公钥
sign_type:通常为 RSA2
charset:UTF-8
不要混用正式环境和沙箱环境的 APPID、密钥、支付宝公钥或网关地址。混用配置通常会触发验签或权限错误。如果程序没有正确展示接口错误,也可能让人误以为二维码本身有问题。
3. 重置登录状态
Cookie、会话过期或测试账号异常,都可能导致沙箱登录状态失效。可以依次尝试:
- 退出当前支付宝沙箱账号。
- 清除相关站点的 Cookie 和缓存。
- 使用浏览器无痕窗口重新登录。
- 确认使用的是沙箱买家账号,而不是正式支付宝账号。
- 在沙箱后台重新查看买家账号、登录密码和支付密码。
如果换成无痕窗口或其他浏览器后仍出现相同提示,浏览器缓存引发问题的可能性较低。
4. 查询交易状态
二维码支付失败后,不要马上反复创建同一笔订单。先调用 alipay.trade.query,确认交易是否已经创建:
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", outTradeNo);
request.setBizContent(bizContent.toJSONString());
AlipayTradeQueryResponse response = alipayClient.execute(request);
System.out.println("code=" + response.getCode());
System.out.println("sub_code=" + response.getSubCode());
System.out.println("sub_msg=" + response.getSubMsg());
System.out.println("trade_status=" + response.getTradeStatus());
System.out.println("body=" + response.getBody());
常见交易状态如下:
WAIT_BUYER_PAY:订单已创建,正在等待付款。TRADE_SUCCESS:支付成功。TRADE_CLOSED:交易已关闭。- 查询不到交易:预下单可能没有成功,或者查询参数不一致。
5. 检查本机时间
签名请求通常包含 timestamp。服务器时间偏差过大时,支付宝可能会拒绝请求。
在 Linux 环境中可以执行:
date
timedatectl status
检查时区和系统时间是否正确,并启用可靠的时间同步服务。
6. 判断是否为沙箱服务异常
可以结合以下现象判断:
- 代码和密钥近期没有改动。
- 预下单、登录或支付页面同时出现异常。
- 新订单、新二维码和无痕浏览器都无法解决问题。
- 多个沙箱账号或设备出现同样的问题。
- 过一段时间后,没有修改代码也能恢复。
同时出现这些情况时,更可能是沙箱服务暂时不稳定。沙箱环境主要用于联调,其稳定性通常无法按生产环境的标准衡量。请保存请求时间、接口名称、APPID、out_trade_no、错误码和响应体,稍后重试,或提交给支付宝开放平台支持渠道核查。
建议增加的日志
日志需要保留排障所需的信息,但不要输出应用私钥、支付密码和完整授权令牌等敏感数据。
log.info(
"alipay precreate: appId={}, outTradeNo={}, code={}, subCode={}, subMsg={}",
appId,
outTradeNo,
response.getCode(),
response.getSubCode(),
response.getSubMsg()
);
建议同时记录:
- 请求发生时间。
- 当前使用的网关环境。
- 支付接口名称。
- 支付宝返回的
trade_no。 - 经过脱敏处理的完整响应体。
- 回调通知的接收时间和验签结果。
注意事项
“二维码太忙了”只是页面层面的通用提示,无法直接对应某个确定的接口错误。需要结合预下单响应、交易查询结果和沙箱登录状态判断具体原因。
如果接口明确返回签名失败、参数错误、权限不足或订单重复,应先修复相应的配置或业务参数。如果接口已经成功生成二维码,但沙箱收银台和登录页面仍持续提示”系统太忙”,则应先排查沙箱服务或测试账号状态,保留日志并间隔一段时间后再次测试。
备注:内容仅供参考。
