PAYATHON 2026

支付宝 H5 支付链接 URL 提示“系统繁忙,请稍后再试”如何解决?

支付老李

结论

支付宝 H5 支付页面出现”系统繁忙,请稍后再试”,背后可能有多种原因。常见情况包括:

  • 支付请求缺少参数、参数格式错误或经过二次 URL 编码;
  • 签名使用的参数与实际发送的参数不一致;
  • 应用公钥、支付宝公钥、私钥与 app_id 不匹配;
  • 混用了沙箱和正式环境的网关、账号或密钥;
  • biz_content 内容不合法、订单号重复或金额格式错误;
  • 将 SDK 返回的表单内容当作普通 URL 使用;
  • 请求被浏览器、网络环境或支付宝风控拦截。

建议先使用支付宝开放平台 SDK 生成并提交支付表单,再根据接口返回的 code、sub_code 和 sub_msg 排查。页面上的”系统繁忙”只是一条通用提示,不能直接说明具体原因。

先确认调用方式

手机网站支付通常调用:

alipay.trade.wap.pay

网关需要根据环境选择:

正式环境:https://openapi.alipay.com/gateway.do
沙箱环境:https://openapi-sandbox.dl.alipaydev.com/gateway.do

正式应用需要使用正式网关、正式 app_id 和对应的密钥。沙箱应用只能使用沙箱环境中的账号、网关和密钥。

支付宝 SDK 的 pageExecute 通常返回一段可以自动提交的 HTML 表单。服务端应将这段内容直接输出给浏览器,不要把整个表单再次拼接成 URL。

排查请求参数

至少检查以下公共参数:

app_id
method
format
charset
sign_type
sign
timestamp
version
biz_content

常用参数值如下:

method=alipay.trade.wap.pay
format=JSON
charset=utf-8
sign_type=RSA2
version=1.0

biz_content 通常包含:

{
  "out_trade_no": "ORDER_202609090001",
  "total_amount": "0.01",
  "subject": "测试商品",
  "product_code": "QUICK_WAP_WAY"
}

检查时需要注意:

  • out_trade_no 必须是商户侧的唯一订单号,不要重复使用已经成功支付的订单号。
  • total_amount 应使用字符串表示合法金额,例如 "0.01",不能写成 "¥0.01" 或 "0.01元"。
  • subject 不能为空,也不要包含无法正确编码的控制字符。
  • product_code 需要符合手机网站支付产品的要求。
  • timestamp 一般使用 yyyy-MM-dd HH:mm:ss 格式,并填写当前有效时间。
  • charset、业务参数的实际编码和签名使用的编码必须一致。
  • 如果配置了 notify_url 和 return_url,需要使用完整、合法且可以访问的 URL。

如果支付宝已经返回明确的参数错误,应以响应中的 sub_code 和 sub_msg 为准。

检查签名和密钥配置

签名错误也可能在页面上显示为”系统繁忙”。依次确认以下配置:

  1. 商户发送请求时,使用商户应用私钥签名。
  2. 接收支付宝响应或通知时,使用支付宝公钥验签,不要误用应用公钥。
  3. 当前私钥与开放平台配置的应用公钥属于同一对密钥。
  4. app_id 与密钥所属的应用一致。
  5. sign_type 与实际签名算法一致,例如 RSA2。
  6. 完成签名后,没有再修改参与签名的参数。
  7. 参数没有在网关、反向代理或前端代码中被重复编码。

这三种密钥最容易混淆:

应用私钥:商户发送请求时签名
应用公钥:配置到支付宝开放平台
支付宝公钥:商户接收支付宝响应或通知时验签

如果应用重新生成或更换过密钥,服务端配置也必须同步更新。继续使用旧私钥配合新公钥时,请求无法通过验证。

使用 SDK 生成支付表单

下面是 Java 服务端的基本调用示例。不同版本的 SDK 在类名或构造方式上可能略有差异,请以项目实际使用的支付宝 SDK 文档为准。

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi.alipay.com/gateway.do",
    APP_ID,
    APP_PRIVATE_KEY,
    "json",
    "UTF-8",
    ALIPAY_PUBLIC_KEY,
    "RSA2"
);

AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();

request.setReturnUrl("https://www.example.com/pay/return");
request.setNotifyUrl("https://www.example.com/pay/notify");

request.setBizContent("""
{
  "out_trade_no": "ORDER_202609090001",
  "total_amount": "0.01",
  "subject": "测试商品",
  "product_code": "QUICK_WAP_WAY"
}
""");

AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);

if (response.isSuccess()) {
    String form = response.getBody();

    // 将 form 原样写入 HTTP 响应,由浏览器自动提交。
    httpServletResponse.setContentType("text/html;charset=UTF-8");
    httpServletResponse.getWriter().write(form);
} else {
    System.err.println("code: " + response.getCode());
    System.err.println("msg: " + response.getMsg());
    System.err.println("subCode: " + response.getSubCode());
    System.err.println("subMsg: " + response.getSubMsg());
}

不要再次对 response.getBody() 进行 URL 编码,也不要把它作为查询参数拼接到其他地址中。

检查 URL 编码和页面转义

如果业务必须自行构造跳转请求,需要仔细检查整个编码过程。常见错误有:

& 被模板引擎输出成 &
% 被再次编码成 %25
+ 被错误转换为空格
biz_content 被重复 encodeURIComponent
sign 参数在跳转过程中被截断

例如,HTML 源码中可能出现:

<a href="https://openapi.alipay.com/gateway.do?...&amp;sign=...">

浏览器通常可以正确解析这类内容。但如果后端程序、WebView 或中间服务直接把字符串中的 &amp; 当作 URL 内容发送,支付宝最终收到的参数名可能会发生变化。

调试时,可以对比以下三项内容:

  1. 签名前的原始参数;
  2. 实际参与签名的待签名字符串;
  3. 浏览器最终发出的请求参数。

如果三者之间存在字段缺失、参数值变化或编码层级不同,就可能导致签名失败。

不要长期保存或重复使用旧支付链接

支付请求包含订单号、时间、签名和业务参数。生成后的支付链接不适合长期缓存,也不能反复用于不同用户或不同订单。

每次发起支付时,建议按照以下流程处理:

  1. 服务端读取当前订单状态;
  2. 为该订单生成合法的支付请求;
  3. 使用 SDK 实时签名;
  4. 立即将支付表单返回浏览器;
  5. 根据异步通知查询并更新最终支付状态。

旧链接失效后,应重新生成支付请求,不要只替换 URL 中的金额、订单号或时间。只要参与签名的参数发生变化,就必须重新签名。

检查应用和产品状态

在支付宝开放平台中确认:

  • 应用当前是否可以正常调用;
  • 手机网站支付能力是否已经签约或开通;
  • 调用环境是否与应用环境一致;
  • 商户账号是否受到限制;
  • 应用网关、授权配置和接口权限是否符合当前业务场景。

开放平台的后台入口和审核要求可能会调整,具体情况以当前控制台显示的信息为准。如果接口返回”无权限”、“产品未开通”或类似错误,应先处理产品签约和应用权限问题,继续修改 URL 通常无法解决。

排除浏览器和网络因素

如果同一个请求在部分设备上可以正常支付,在另一些设备上却提示”系统繁忙”,还需要检查:

  • 页面是否在微信、企业应用或第三方 App 的内置 WebView 中打开;
  • 浏览器是否禁止跳转、提交表单或使用 Cookie;
  • 设备是否使用了代理、抓包软件、VPN 或异常 DNS;
  • 问题是否只出现在某个网络出口;
  • 是否对支付宝域名设置了重定向或内容过滤;
  • 页面是否通过不受信任的 iframe 加载支付地址。

可以分别使用手机系统浏览器、支付宝客户端和其他网络环境测试。如果系统浏览器可以正常支付,只有特定 WebView 异常,通常需要检查 WebView 的跳转策略、User-Agent、Cookie 或 URL 拦截逻辑。

建议的排查顺序

按以下顺序检查,通常可以较快找到问题:

  1. 确认调用的是 alipay.trade.wap.pay。
  2. 确认没有混用正式环境和沙箱环境。
  3. 使用官方 SDK 的 pageExecute 生成支付表单。
  4. 检查 app_id、私钥、支付宝公钥和 sign_type。
  5. 检查 out_trade_no、total_amount、subject 和 product_code。
  6. 确认支付表单或 URL 没有被二次编码、截断或转义。
  7. 记录接口返回的 code、sub_code、sub_msg 和请求标识。
  8. 更换浏览器和网络环境,排除 WebView 或网络问题。
  9. 检查开放平台中的产品权限、应用状态和商户状态。
  10. 如果仍然无法定位,携带脱敏后的请求参数、错误响应、发生时间和请求标识,联系支付宝技术支持。

日志记录注意事项

建议记录以下信息:

app_id
method
out_trade_no
timestamp
code
msg
sub_code
sub_msg
请求发生时间
支付宝返回的请求标识

以下信息不要出现在日志、截图或工单中:

应用私钥
完整签名原文中的敏感业务数据
用户身份信息
完整支付凭证
未经脱敏的手机号或账号

页面上的”系统繁忙”只是一条通用提示。排查时更有价值的是服务端原始响应、支付宝返回的错误码,以及浏览器实际发送的请求参数。可以先检查环境、签名和编码,再排查临时网络故障或平台异常。

备注:内容仅供参考。