PAYATHON 2026

支付宝沙箱扫码支付提示“系统有点忙,请稍后再试”

支付老李

结论

支付宝沙箱扫码支付提示“系统有点忙,请稍后再试”,通常不只是网络繁忙,也可能是沙箱环境、付款账号或接口配置不一致。

建议先检查:

  1. 请求是否发到了沙箱网关。
  2. 扫码时是否使用沙箱支持的客户端和沙箱买家账号。
  3. app_id、应用私钥和支付宝公钥是否来自同一个沙箱应用。
  4. 服务端调用 alipay.trade.precreate 时是否返回了业务错误。
  5. 二维码是否根据接口成功响应中的 qr_code 生成,订单是否已过期或被重复使用。

手机页面上的“系统有点忙”只是通用提示,无法直接说明故障原因。排查时应重点查看服务端接口响应中的 code、sub_code 和 sub_msg。

先确认沙箱环境是否配套

沙箱支付不能和正式环境混用。服务端网关、应用配置及付款账号都必须属于沙箱环境。

沙箱网关通常是:

https://openapi-sandbox.dl.alipaydev.com/gateway.do

正式环境网关是:

https://openapi.alipay.com/gateway.do

使用沙箱 app_id 请求正式网关,或者使用正式应用的密钥请求沙箱网关,都可能导致请求失败。

扫码付款时,还要使用支付宝开放平台沙箱提供的买家测试账号。普通支付宝账号通常无法直接完成沙箱交易。沙箱客户端的获取方式和支持平台可能发生调整,具体以开放平台控制台当前的沙箱说明为准。

检查服务端接口响应

扫码支付一般先调用 alipay.trade.precreate 生成二维码。只有接口明确返回成功后,才能把 qr_code 展示给用户。

建议完整记录这些字段:

code
msg
sub_code
sub_msg
trade_no
out_trade_no
qr_code

判断接口是否成功,不能只看 HTTP 状态码,还要检查支付宝的业务响应码。常见的成功码是 10000,实际判断时仍应优先使用 SDK 返回对象提供的成功判断方法。

Java 示例:

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi-sandbox.dl.alipaydev.com/gateway.do",
    appId,
    merchantPrivateKey,
    "json",
    "UTF-8",
    alipayPublicKey,
    "RSA2"
);

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl("https://example.com/alipay/notify");

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("TEST_" + System.currentTimeMillis());
model.setTotalAmount("0.01");
model.setSubject("沙箱扫码支付测试");

request.setBizModel(model);

AlipayTradePrecreateResponse response = alipayClient.execute(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("qrCode=" + response.getQrCode());

if (response.isSuccess()) {
    String qrCode = response.getQrCode();
    // 使用二维码组件将 qrCode 原样生成二维码
} else {
    throw new IllegalStateException(
        "支付宝预下单失败:" + response.getCode()
            + " / " + response.getSubCode()
            + " / " + response.getSubMsg()
    );
}

如果 response.isSuccess() 为 false,就不要继续生成二维码。此时应先根据 sub_code 和 sub_msg 修正服务端配置或请求参数,手机端显示的提示并不能帮助定位具体问题。

核对密钥和签名配置

沙箱应用至少需要检查以下配置:

  • app_id 是否来自当前沙箱应用。
  • merchantPrivateKey 是否为应用私钥,并且与上传到该应用的应用公钥配对。
  • alipayPublicKey 是否为开放平台给当前沙箱应用提供的支付宝公钥,而不是应用公钥。
  • 签名算法是否一致。例如配置为 RSA2 时,请求也必须使用 RSA2。
  • 字符集通常使用 UTF-8。
  • 修改或重新上传应用公钥后,本地配置是否已同步更新。

“应用公钥”和“支付宝公钥”很容易混淆,两者用途不同:

  • 应用私钥由商户侧用来生成签名。
  • 支付宝公钥由商户侧用来验证支付宝签名。
  • 应用公钥需要上传到开放平台,供支付宝验证商户请求。

如果公钥填反,或者公私钥不配对,接口一般会返回验签或签名相关错误。

检查二维码和订单参数

接口返回成功后,应直接使用响应中的 qr_code 生成二维码。不要自行拼接支付地址,也不要重复对内容进行 URL 编码或解码。

同时检查订单参数:

{
  "out_trade_no": "TEST_202609090001",
  "total_amount": "0.01",
  "subject": "沙箱扫码支付测试"
}

注意以下几点:

  • out_trade_no 在商户侧必须唯一。
  • total_amount 应是合法的金额字符串,例如 "0.01"。
  • subject 不能为空。
  • 不要重复使用已经关闭、已经支付或状态异常的订单号。
  • 二维码必须来自本次成功的预下单响应。
  • 如果设置了 timeout_express,需要确认二维码仍在有效期内。

排查时可以为每次测试生成新的 out_trade_no,避免旧订单状态影响结果。

确认扫码账号与环境一致

如果预下单成功,二维码内容也没有问题,但扫码后仍然提示“系统有点忙”,应重点检查扫码端:

  1. 当前登录的账号是否为开放平台提供的沙箱买家账号。
  2. 是否误用了普通支付宝客户端或正式支付宝账号。
  3. 沙箱买家账号能否正常登录,余额和账号状态是否满足测试条件。
  4. 是否把商户沙箱账号当成了买家账号。
  5. 客户端缓存的登录状态是否与当前测试账号一致。

可以先退出扫码端账号并清理登录状态,然后重新登录沙箱买家账号,再扫描新生成的二维码。沙箱客户端和账号的具体使用方式可能随开放平台调整,应以控制台当前显示的信息为准。

推荐的排查顺序

可以按以下顺序排查:

  1. 确认请求使用的是沙箱网关。
  2. 确认 app_id、应用私钥和支付宝公钥都来自同一个沙箱应用。
  3. 打印 alipay.trade.precreate 的完整响应。
  4. 确认响应成功,并且包含非空的 qr_code。
  5. 使用新的 out_trade_no 重新预下单。
  6. 根据 qr_code 原样生成二维码。
  7. 使用沙箱买家账号扫码付款。
  8. 支付后调用 alipay.trade.query 查询交易状态,不要只依赖页面跳转结果。

如果预下单接口已经成功,但所有沙箱买家账号扫码时都出现相同提示,可以保留请求时间、app_id、out_trade_no、接口响应和客户端截图,再通过支付宝开放平台的技术支持渠道确认沙箱服务状态。提交排查信息时,不要附带应用私钥、完整签名串或其他敏感凭据。

备注:内容仅供参考。