支付宝沙箱输入支付密码后提示网络系统繁忙怎么办?
结论
支付宝沙箱在输入支付密码后提示“抱歉,网络系统繁忙,请稍后再试”,并不一定说明本地网络有问题。常见原因有:
- 沙箱网关、沙箱应用或沙箱买家账号混入了正式环境配置;
app_id、应用私钥和支付宝公钥不匹配;- 订单号重复,原订单已经支付、关闭或状态异常;
- 金额、商品名称等请求参数不符合要求;
- 沙箱买家账号状态异常、余额不足或支付密码已经变化;
- 支付完成后的同步跳转地址无法访问;
- 支付宝沙箱服务暂时不稳定。
排查时应先查询订单状态和接口响应,再检查运行环境与密钥配置。不要只根据收银台的通用错误页面判断支付失败,也不要马上用相同订单号再次提交。
首先确认订单是否已经支付
收银台报错不代表交易一定失败。订单可能已经创建,甚至已经支付成功。可以调用 alipay.trade.query 查询订单状态。
需要关注以下状态:
TRADE_SUCCESS:支付成功;WAIT_BUYER_PAY:订单已经创建,正在等待付款;TRADE_CLOSED:订单已经关闭;- 查询不到交易:支付请求可能没有成功创建订单。
Java 示例:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi-sandbox.dl.alipaydev.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2"
);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo("ORDER_202609090001");
request.setBizModel(model);
AlipayTradeQueryResponse response = alipayClient.execute(request);
System.out.println("code=" + response.getCode());
System.out.println("subCode=" + response.getSubCode());
System.out.println("subMsg=" + response.getSubMsg());
System.out.println("tradeStatus=" + response.getTradeStatus());
System.out.println("body=" + response.getBody());
实际项目应以服务端查询结果或异步通知为准,不能只看浏览器跳转页面。
检查是否混用了正式环境与沙箱环境
进行沙箱支付时,整套配置必须来自同一个沙箱应用,包括:
- 沙箱
app_id; - 沙箱应用私钥;
- 与该应用对应的支付宝公钥;
- 沙箱网关;
- 沙箱买家账号。
常用的沙箱网关是:
https://openapi-sandbox.dl.alipaydev.com/gateway.do
正式环境网关通常是:
https://openapi.alipay.com/gateway.do
如果用沙箱 app_id 请求正式网关,或者用正式应用的密钥请求沙箱网关,交易可能无法正常完成。
还要分清“支付宝公钥”和“应用公钥”:
- 应用私钥:商户系统用它生成签名;
- 应用公钥:需要上传到支付宝开放平台;
- 支付宝公钥:商户系统用它验证支付宝返回的结果。
SDK 配置中的 ALIPAY_PUBLIC_KEY 应填写支付宝公钥,不能填写应用公钥。
检查支付请求参数
以电脑网站支付 alipay.trade.page.pay 为例,请求中的参数应合法并保持一致:
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("https://example.com/alipay/return");
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("0.01");
model.setSubject("沙箱支付测试");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
request.setBizModel(model);
AlipayTradePagePayResponse response =
alipayClient.pageExecute(request, "POST");
if (!response.isSuccess()) {
System.out.println("code=" + response.getCode());
System.out.println("msg=" + response.getMsg());
System.out.println("subCode=" + response.getSubCode());
System.out.println("subMsg=" + response.getSubMsg());
}
排查时主要检查以下内容:
-
out_trade_no是否唯一
不要把同一个商户订单号用于多次不同的测试。重新发起交易时,应生成新的订单号。 -
total_amount是否合法
金额应使用字符串表示,例如"0.01",以免浮点计算产生精度误差。 -
subject是否为空
商品标题不能是空字符串,也不要包含无法正常编码的内容。 -
product_code是否与支付产品一致
电脑网站支付通常使用FAST_INSTANT_TRADE_PAY。使用其他支付产品时,应按照相应接口的要求配置。 -
字符编码是否一致
请求、签名和服务端处理建议统一使用UTF-8。
核对沙箱买家账号
沙箱支付必须使用开放平台提供的沙箱买家账号,不能直接使用真实支付宝账号。
需要检查:
- 当前登录的是沙箱买家账号,而不是沙箱商家账号;
- 支付密码是否与沙箱页面当前显示或设置的密码一致;
- 账号余额是否足够;
- 账号是否被冻结或处于异常状态;
- 开放平台重置沙箱数据后,账号或密码是否发生了变化。
如果怀疑账号异常,可以换一个新订单号测试。在平台允许的情况下,也可以重置沙箱账号或重新获取沙箱测试信息。相关入口和操作方式可能随开放平台页面调整,应以当前控制台显示为准。
检查订单号重复和交易状态冲突
开发过程中很容易反复使用固定订单号,例如:
model.setOutTradeNo("test001");
第一次请求后,该订单可能已经处于 WAIT_BUYER_PAY、TRADE_SUCCESS 或 TRADE_CLOSED 状态。如果修改金额或商品信息后仍使用同一个订单号,可能引发交易冲突。
测试时可以生成带时间或随机值的订单号:
String outTradeNo =
"TEST_" + System.currentTimeMillis();
这种写法只适合演示。生产环境应由订单系统生成稳定、唯一、可追踪的商户订单号,并建立防重复提交机制。
检查同步跳转和异步通知地址
return_url 和 notify_url 配置错误通常不会让支付接口本身签名失败,但可能导致支付后跳转异常,或者让业务系统误判支付结果。
需要分别确认:
return_url可以通过浏览器正常访问;notify_url可以被支付宝服务器通过公网访问;- 地址不是
localhost、127.0.0.1或只能从内网访问的域名; - 服务端没有把支付宝的
POST通知错误限制为GET; - HTTPS 证书完整有效;
- 防火墙、网关或登录验证没有拦截通知;
- 异步通知验签成功后,服务端会返回纯文本
success。
异步通知处理示意:
Map<String, String> params = new HashMap<>();
for (Map.Entry<String, String[]> entry :
request.getParameterMap().entrySet()) {
params.put(entry.getKey(), String.join(",", entry.getValue()));
}
boolean verified = AlipaySignature.rsaCheckV1(
params,
ALIPAY_PUBLIC_KEY,
"UTF-8",
"RSA2"
);
if (verified) {
// 还应核对 app_id、out_trade_no、total_amount、seller_id 等业务字段
response.getWriter().write("success");
} else {
response.getWriter().write("failure");
}
验签通过后不能直接更新订单。还要核对通知中的应用、商户、订单号和金额是否与本地订单一致,并确保重复通知不会造成重复入账。
保留完整接口响应和日志
排查时不要只记录“支付失败”,至少要保存以下信息:
code
msg
sub_code
sub_msg
out_trade_no
trade_no
trade_status
HTTP 状态码
SDK 返回的原始 body
请求时间
日志中不能输出应用私钥、支付密码、完整身份证号或其他敏感信息。
如果接口返回了明确的 sub_code 和 sub_msg,应优先根据这些信息排查。收银台上的“网络系统繁忙”是通用提示,通常没有服务端接口响应具体。
建议的排查顺序
- 调用
alipay.trade.query查询当前订单状态; - 换一个全新的
out_trade_no再次测试; - 确认网关、
app_id、私钥和支付宝公钥都属于同一个沙箱应用; - 确认使用的是沙箱买家账号,并检查余额和支付密码;
- 检查金额、商品标题、
product_code和字符编码; - 查看 SDK 完整响应中的
sub_code、sub_msg和原始报文; - 检查
return_url与notify_url是否能通过公网访问; - 确认配置无误后,间隔一段时间重新测试,排除沙箱服务暂时异常的可能。
如果使用多个新订单和不同沙箱买家账号时都遇到相同问题,而且请求签名与交易参数已经确认无误,更可能是沙箱环境出现了临时故障。此时应保存请求时间、app_id、商户订单号、接口响应和错误截图,再通过支付宝开放平台当前提供的技术支持渠道反馈。反馈时不要提交应用私钥或支付密码。
备注:内容仅供参考。
