支付宝沙箱支付输入密码后为何提示“网络系统繁忙”?
结论
支付宝沙箱在输入密码后提示”网络系统繁忙”,通常不代表前端网络真的繁忙。这是沙箱收银台处理多种异常时使用的通用提示。常见原因有:
- 使用了生产环境的支付宝账号,而非沙箱买家账号;
- 输入了登录密码,而非沙箱账号的支付密码;
- 沙箱买家账号状态、余额或测试数据异常;
- 网关、
app_id、应用私钥和支付宝公钥并非来自同一套沙箱配置; - 商户订单号重复,或订单参数不符合要求;
- 支付宝沙箱服务暂时不稳定。
如果可以正常进入收银台,下单请求大概率已经通过基础验签。此时应先检查沙箱买家账号、订单状态和环境配置。
排查步骤
1. 确认使用的是沙箱买家账号
支付时必须使用支付宝开放平台沙箱环境提供的买家账号,不能使用真实支付宝账号。
请在沙箱账号页面核对:
- 买家登录账号;
- 登录密码;
- 支付密码;
- 账户余额;
- 账号是否仍然有效。
登录密码和支付密码不是同一个密码。收银台要求输入支付密码,不要直接填写登录密码。具体密码应以当前沙箱后台显示或设置的内容为准,不要假定它是某个固定值。
如果沙箱环境近期重置过,原来的账号、密码或订单数据可能已经失效。重新获取沙箱账号信息后再测试。
2. 检查是否混用了沙箱和生产配置
调用沙箱接口时,所有配置都必须来自沙箱环境:
网关:https://openapi.alipaydev.com/gateway.do
app_id:沙箱应用 APPID
应用私钥:与该沙箱应用公钥配套的私钥
支付宝公钥:沙箱应用页面提供的支付宝公钥
以下几种配置错误比较常见:
- 沙箱
app_id搭配了生产环境的支付宝公钥; - 使用生产网关提交沙箱账号;
- 重新生成应用密钥后,代码仍在使用旧私钥;
- 将”应用公钥”误当作”支付宝公钥”配置到客户端。
以 Java SDK 为例,配置结构可参考:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipaydev.com/gateway.do",
"YOUR_SANDBOX_APP_ID",
"YOUR_APP_PRIVATE_KEY",
"json",
"UTF-8",
"YOUR_ALIPAY_PUBLIC_KEY",
"RSA2"
);
不要在运行环境中直接使用示例占位符,也不要把应用私钥提交到代码仓库。
3. 每次测试使用新的商户订单号
out_trade_no 是商户订单号,在同一个商户应用中应保持唯一。重复使用已经支付、关闭或状态异常的订单号,可能导致支付失败。
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("https://example.com/alipay/return");
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setTotalAmount("0.01");
model.setSubject("沙箱支付测试订单");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
request.setBizModel(model);
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (!response.isSuccess()) {
System.out.println("code=" + response.getCode());
System.out.println("subCode=" + response.getSubCode());
System.out.println("subMsg=" + response.getSubMsg());
}
还需要检查:
total_amount是否为合法的金额字符串;subject是否为空;product_code是否与当前使用的支付产品匹配;- 参数在签名后是否又被修改或重新编码。
4. 主动查询订单真实状态
收银台显示的”网络系统繁忙”无法提供足够的信息,也不能据此认定订单已经失败。应使用同一个 out_trade_no 调用订单查询接口:
AlipayTradeQueryRequest queryRequest = new AlipayTradeQueryRequest();
AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel();
queryModel.setOutTradeNo("实际提交的商户订单号");
queryRequest.setBizModel(queryModel);
AlipayTradeQueryResponse queryResponse =
alipayClient.execute(queryRequest);
System.out.println("code=" + queryResponse.getCode());
System.out.println("subCode=" + queryResponse.getSubCode());
System.out.println("subMsg=" + queryResponse.getSubMsg());
System.out.println("tradeStatus=" + queryResponse.getTradeStatus());
应重点记录和检查:
codesub_codesub_msgtrade_status- 支付宝返回的请求标识
- 应用服务端异常日志
如果查询结果为 TRADE_SUCCESS,说明支付已经成功。不要因为浏览器页面报错而再次创建订单或扣款。业务系统应以异步通知的验签结果和主动查询结果为准。
5. 重置测试条件
如果配置和请求参数没有发现明显问题,可以按顺序尝试:
- 更换新的
out_trade_no; - 退出收银台,重新登录沙箱买家账号;
- 清理浏览器 Cookie,或改用无痕窗口;
- 更换另一个沙箱买家账号;
- 检查沙箱余额和账号状态;
- 等待一段时间后再次测试。
如果同一套代码此前可以正常使用,近期也没有修改配置,而且多个沙箱账号都出现相同问题,才更有可能是沙箱环境暂时异常。
如何快速判断问题位置
- 无法生成支付页面:先检查网关、签名、密钥和请求参数。
- 可以进入收银台,但无法登录:检查是否使用了沙箱买家账号及正确的登录密码。
- 输入支付密码后报错:检查支付密码、买家账号状态、账户余额、订单是否重复,以及沙箱服务状态。
- 页面报错,但订单查询成功:按成功订单处理,避免重复支付。
- 返回了明确的
sub_code:根据该错误码检查对应参数或业务限制。
注意事项
沙箱环境只用于联调,其稳定性和数据生命周期不能与生产环境等同。不要只根据收银台的中文提示判断订单状态,也不要在支付页面报错后立即生成新订单。服务端必须保存完整的请求和响应信息,正确验证异步通知签名,并通过 alipay.trade.query 补查状态不明确的订单。
备注:内容仅供参考。
