支付宝 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 为准。
检查签名和密钥配置
签名错误也可能在页面上显示为”系统繁忙”。依次确认以下配置:
- 商户发送请求时,使用商户应用私钥签名。
- 接收支付宝响应或通知时,使用支付宝公钥验签,不要误用应用公钥。
- 当前私钥与开放平台配置的应用公钥属于同一对密钥。
app_id与密钥所属的应用一致。sign_type与实际签名算法一致,例如RSA2。- 完成签名后,没有再修改参与签名的参数。
- 参数没有在网关、反向代理或前端代码中被重复编码。
这三种密钥最容易混淆:
应用私钥:商户发送请求时签名
应用公钥:配置到支付宝开放平台
支付宝公钥:商户接收支付宝响应或通知时验签
如果应用重新生成或更换过密钥,服务端配置也必须同步更新。继续使用旧私钥配合新公钥时,请求无法通过验证。
使用 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?...&sign=...">
浏览器通常可以正确解析这类内容。但如果后端程序、WebView 或中间服务直接把字符串中的 & 当作 URL 内容发送,支付宝最终收到的参数名可能会发生变化。
调试时,可以对比以下三项内容:
- 签名前的原始参数;
- 实际参与签名的待签名字符串;
- 浏览器最终发出的请求参数。
如果三者之间存在字段缺失、参数值变化或编码层级不同,就可能导致签名失败。
不要长期保存或重复使用旧支付链接
支付请求包含订单号、时间、签名和业务参数。生成后的支付链接不适合长期缓存,也不能反复用于不同用户或不同订单。
每次发起支付时,建议按照以下流程处理:
- 服务端读取当前订单状态;
- 为该订单生成合法的支付请求;
- 使用 SDK 实时签名;
- 立即将支付表单返回浏览器;
- 根据异步通知查询并更新最终支付状态。
旧链接失效后,应重新生成支付请求,不要只替换 URL 中的金额、订单号或时间。只要参与签名的参数发生变化,就必须重新签名。
检查应用和产品状态
在支付宝开放平台中确认:
- 应用当前是否可以正常调用;
- 手机网站支付能力是否已经签约或开通;
- 调用环境是否与应用环境一致;
- 商户账号是否受到限制;
- 应用网关、授权配置和接口权限是否符合当前业务场景。
开放平台的后台入口和审核要求可能会调整,具体情况以当前控制台显示的信息为准。如果接口返回”无权限”、“产品未开通”或类似错误,应先处理产品签约和应用权限问题,继续修改 URL 通常无法解决。
排除浏览器和网络因素
如果同一个请求在部分设备上可以正常支付,在另一些设备上却提示”系统繁忙”,还需要检查:
- 页面是否在微信、企业应用或第三方 App 的内置 WebView 中打开;
- 浏览器是否禁止跳转、提交表单或使用 Cookie;
- 设备是否使用了代理、抓包软件、VPN 或异常 DNS;
- 问题是否只出现在某个网络出口;
- 是否对支付宝域名设置了重定向或内容过滤;
- 页面是否通过不受信任的 iframe 加载支付地址。
可以分别使用手机系统浏览器、支付宝客户端和其他网络环境测试。如果系统浏览器可以正常支付,只有特定 WebView 异常,通常需要检查 WebView 的跳转策略、User-Agent、Cookie 或 URL 拦截逻辑。
建议的排查顺序
按以下顺序检查,通常可以较快找到问题:
- 确认调用的是
alipay.trade.wap.pay。 - 确认没有混用正式环境和沙箱环境。
- 使用官方 SDK 的
pageExecute生成支付表单。 - 检查
app_id、私钥、支付宝公钥和sign_type。 - 检查
out_trade_no、total_amount、subject和product_code。 - 确认支付表单或 URL 没有被二次编码、截断或转义。
- 记录接口返回的
code、sub_code、sub_msg和请求标识。 - 更换浏览器和网络环境,排除 WebView 或网络问题。
- 检查开放平台中的产品权限、应用状态和商户状态。
- 如果仍然无法定位,携带脱敏后的请求参数、错误响应、发生时间和请求标识,联系支付宝技术支持。
日志记录注意事项
建议记录以下信息:
app_id
method
out_trade_no
timestamp
code
msg
sub_code
sub_msg
请求发生时间
支付宝返回的请求标识
以下信息不要出现在日志、截图或工单中:
应用私钥
完整签名原文中的敏感业务数据
用户身份信息
完整支付凭证
未经脱敏的手机号或账号
页面上的”系统繁忙”只是一条通用提示。排查时更有价值的是服务端原始响应、支付宝返回的错误码,以及浏览器实际发送的请求参数。可以先检查环境、签名和编码,再排查临时网络故障或平台异常。
备注:内容仅供参考。
