PAYATHON 2026

支付宝沙箱输入支付密码后提示网络系统繁忙怎么办?

支付小周

结论

支付宝沙箱在输入支付密码后提示“抱歉,网络系统繁忙,请稍后再试”,并不一定说明本地网络有问题。常见原因有:

  • 沙箱网关、沙箱应用或沙箱买家账号混入了正式环境配置;
  • 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());
}

排查时主要检查以下内容:

  1. out_trade_no 是否唯一
    不要把同一个商户订单号用于多次不同的测试。重新发起交易时,应生成新的订单号。

  2. total_amount 是否合法
    金额应使用字符串表示,例如 "0.01",以免浮点计算产生精度误差。

  3. subject 是否为空
    商品标题不能是空字符串,也不要包含无法正常编码的内容。

  4. product_code 是否与支付产品一致
    电脑网站支付通常使用 FAST_INSTANT_TRADE_PAY。使用其他支付产品时,应按照相应接口的要求配置。

  5. 字符编码是否一致
    请求、签名和服务端处理建议统一使用 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,应优先根据这些信息排查。收银台上的“网络系统繁忙”是通用提示,通常没有服务端接口响应具体。

建议的排查顺序

  1. 调用 alipay.trade.query 查询当前订单状态;
  2. 换一个全新的 out_trade_no 再次测试;
  3. 确认网关、app_id、私钥和支付宝公钥都属于同一个沙箱应用;
  4. 确认使用的是沙箱买家账号,并检查余额和支付密码;
  5. 检查金额、商品标题、product_code 和字符编码;
  6. 查看 SDK 完整响应中的 sub_code、sub_msg 和原始报文;
  7. 检查 return_url 与 notify_url 是否能通过公网访问;
  8. 确认配置无误后,间隔一段时间重新测试,排除沙箱服务暂时异常的可能。

如果使用多个新订单和不同沙箱买家账号时都遇到相同问题,而且请求签名与交易参数已经确认无误,更可能是沙箱环境出现了临时故障。此时应保存请求时间、app_id、商户订单号、接口响应和错误截图,再通过支付宝开放平台当前提供的技术支持渠道反馈。反馈时不要提交应用私钥或支付密码。

备注:内容仅供参考。