PAYATHON 2026

支付宝app唤起支付提示系统繁忙,AlipayClient参数如何排查?

支付小周

结论

method 和 timestamp 通常不需要业务代码在构造 AlipayClient 时手动传入:

  • method 由具体的请求类决定。例如,AlipayTradeAppPayRequest 对应 alipay.trade.app.pay。
  • timestamp 由支付宝 Java SDK 在发送请求或生成支付参数时自动填充。

因此,不能直接把“系统繁忙”归因于缺少这两个公共参数。排查时应先查看服务端返回的 code、sub_code、msg 和 sub_msg,同时确认 APP 支付与手机网站支付使用了正确的请求类和调用方法。仅凭支付宝客户端显示的“系统繁忙”,无法判断具体原因。

为什么 AlipayClient 中没有 method 和 timestamp

AlipayClient 的构造参数主要是应用级配置,包括网关地址、app_id、应用私钥、支付宝公钥、字符集和签名方式:

AlipayClient alipayClient = new DefaultAlipayClient(
        gatewayUrl,
        appId,
        merchantPrivateKey,
        "json",
        "UTF-8",
        alipayPublicKey,
        "RSA2"
);

method 是接口级参数,由请求对象决定:

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

SDK 可以根据这个请求类判断调用的接口是 alipay.trade.app.pay。timestamp、sign、sign_type 等公共参数也会由 SDK 在组装请求和签名时处理。

文档将这些字段列为公共必传参数,不代表业务代码需要再次拼接。手动处理时,如果编码、排序或签名范围与 SDK 不一致,反而可能导致验签失败。

先获取真正的错误信息

APP 支付一般通过 sdkExecute 生成交给客户端的订单字符串:

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl(notifyUrl);

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo(outTradeNo);
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setProductCode("QUICK_MSECURITY_PAY");

request.setBizModel(model);

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

if (!response.isSuccess()) {
    log.error(
        "Alipay APP pay failed: code={}, msg={}, subCode={}, subMsg={}",
        response.getCode(),
        response.getMsg(),
        response.getSubCode(),
        response.getSubMsg()
    );
    throw new IllegalStateException("生成支付宝支付参数失败");
}

String orderString = response.getBody();

手机网站支付通常使用 AlipayTradeWapPayRequest:

AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl(returnUrl);
request.setNotifyUrl(notifyUrl);

AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(outTradeNo);
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setQuitUrl(quitUrl);
model.setProductCode("QUICK_WAP_WAY");

request.setBizModel(model);

AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);

if (!response.isSuccess()) {
    log.error(
        "Alipay WAP pay failed: code={}, msg={}, subCode={}, subMsg={}",
        response.getCode(),
        response.getMsg(),
        response.getSubCode(),
        response.getSubMsg()
    );
    throw new IllegalStateException("生成支付宝网页支付表单失败");
}

String form = response.getBody();

不同 SDK 版本提供的重载方法可能有所区别,应以当前依赖中的实际 API 为准。无论使用哪个版本,APP 支付与 WAP 支付都不能混用请求类或调用方式。

建议按以下顺序排查

1. 查看服务端响应,不要只看客户端提示

需要重点记录:

  • code
  • msg
  • sub_code
  • sub_msg
  • 支付宝返回的请求标识,例如响应中存在的 trace_id
  • out_trade_no
  • 请求时间

“系统繁忙”可能只是客户端使用的统一提示。服务端返回的 sub_code 和 sub_msg 才是判断参数、权限、签名或订单问题的主要依据。

日志中不要记录应用私钥、完整签名、用户授权信息或其他敏感数据。

2. 核对请求类型和产品码

APP 支付应使用:

AlipayTradeAppPayRequest
product_code = QUICK_MSECURITY_PAY
sdkExecute(...)

手机网站支付应使用:

AlipayTradeWapPayRequest
product_code = QUICK_WAP_WAY
pageExecute(...)

请求类、product_code 或前端调用方式不匹配时,可能直到唤起支付宝后才显示失败。

3. 核对密钥和签名配置

逐项确认:

  • app_id 是否属于当前应用;
  • 应用私钥是否与开放平台配置的应用公钥配套;
  • 使用普通公钥模式时,填写的是否为“支付宝公钥”,而不是商户应用公钥;
  • 使用证书模式时,是否误用了普通公钥模式的初始化方式;
  • sign_type 是否与配置一致,通常为 RSA2;
  • charset 是否一致,通常为 UTF-8;
  • 是否混用了正式环境和沙箱环境的网关、应用或密钥。

如果近期更换过密钥、证书、配置中心内容或部署环境,即使代码没有变化,也可能突然出现故障。

4. 检查服务器时间

虽然 timestamp 由 SDK 生成,但它依赖服务器的系统时间。服务器时间偏差过大时,请求仍可能失效。

Linux 环境可以由运维人员检查系统时间和时间同步状态,例如:

date
timedatectl status

如果应用部署在容器中,还要同时检查宿主机和容器内的时间。

5. 检查业务参数

重点核对:

  • out_trade_no 是否唯一;
  • 同一订单号是否曾用不同金额重新发起;
  • total_amount 格式是否正确;
  • subject 是否为空或包含异常字符;
  • notify_url 是否为支付宝服务器可以访问的公网地址;
  • 参数在生成订单字符串后,是否又被前端二次编码、截断或修改;
  • APP 是否将完整的 response.getBody() 原样传给支付宝 SDK。

APP 支付的订单字符串已经包含签名。前端不应自行拆分、排序、重新编码或重新拼接。

6. 检查应用和产品状态

如果 APP 支付与 WAP 支付同时失效,还需要确认:

  • 应用是否仍处于可用状态;
  • 对应的支付产品是否已经签约并生效;
  • 商户账户是否存在风控、权限或结算状态异常;
  • 开放平台配置是否被其他人员修改;
  • 生产环境是否在夜间发生过发布、回滚或配置刷新。

页面文档新增参数,不代表 SDK 的调用方式也随之改变。判断时应以接口请求类、SDK 行为和网关的实际返回结果为准。

如何快速缩小范围

可以使用一组全新的订单号,由服务端直接生成支付参数:

  1. 在服务端记录非敏感的请求摘要和完整错误字段。
  2. 不经过额外网关或前端加工,直接验证 SDK 生成的支付字符串。
  3. 分别测试 APP 支付和 WAP 支付。
  4. 对比正常环境与异常环境的 app_id、网关、签名方式、密钥版本和系统时间。
  5. 根据 sub_code 在支付宝开放平台查询对应的错误说明。如果没有明确错误码,可携带请求时间、订单号和请求标识,联系支付宝技术支持查询链路。

注意事项

不要通过修改 SDK 源码强行补充 method、timestamp 或 sign。这些参数本来就是 SDK 请求组装和签名流程的一部分,重复设置容易造成签名不一致。

4.10.70.ALL 是否为当前最新版本,应以实际 Maven 仓库和支付宝官方 SDK 发布信息为准。单纯升级依赖通常不能代替错误定位。先取得网关返回的 sub_code 和 sub_msg,通常比盲目升级、降级或补参数更有效。

备注:内容仅供参考。