支付宝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. 查看服务端响应,不要只看客户端提示
需要重点记录:
codemsgsub_codesub_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 行为和网关的实际返回结果为准。
如何快速缩小范围
可以使用一组全新的订单号,由服务端直接生成支付参数:
- 在服务端记录非敏感的请求摘要和完整错误字段。
- 不经过额外网关或前端加工,直接验证 SDK 生成的支付字符串。
- 分别测试 APP 支付和 WAP 支付。
- 对比正常环境与异常环境的
app_id、网关、签名方式、密钥版本和系统时间。 - 根据
sub_code在支付宝开放平台查询对应的错误说明。如果没有明确错误码,可携带请求时间、订单号和请求标识,联系支付宝技术支持查询链路。
注意事项
不要通过修改 SDK 源码强行补充 method、timestamp 或 sign。这些参数本来就是 SDK 请求组装和签名流程的一部分,重复设置容易造成签名不一致。
4.10.70.ALL 是否为当前最新版本,应以实际 Maven 仓库和支付宝官方 SDK 发布信息为准。单纯升级依赖通常不能代替错误定位。先取得网关返回的 sub_code 和 sub_msg,通常比盲目升级、降级或补参数更有效。
备注:内容仅供参考。
