H5网页调起支付宝支付时提示“此网页已停止访问”怎么办?
结论
出现“此网页已停止访问”,通常并不是支付接口返回了业务错误,而是支付跳转链路中的某个页面被浏览器、支付宝安全组件或手机安全软件拦截。
如果只有部分安卓手机出现问题,其他设备可以正常支付,应优先检查:
- 实际被拦截的 URL 或域名是否被识别为风险地址;
- 支付请求是否经过短链、第三方跳转、HTTP 页面或多次重定向;
return_url、quit_url等地址是否填写错误、没有正确编码或包含不可信域名;- 支付是否从微信、应用内 WebView、
iframe等受限环境发起; - 用户手机上的支付宝、浏览器或 Android System WebView 是否异常。
排查时,先确认提示页面由谁显示,以及具体拦截了哪个地址,再判断应该修改支付链路、处理域名风险,还是修复客户端环境。
一、先定位被拦截的页面
不要只凭提示文字判断支付宝接口出了故障。建议记录完整的支付链路:
业务下单页
→ 商户后端创建支付宝支付请求
→ 支付宝收银台
→ 商户 return_url
首先确认错误发生在哪个阶段:
- 还没有进入支付宝收银台;
- 已经进入支付宝,但收银台页面被拦截;
- 支付完成后,返回商户页面时被拦截;
- 从中间跳转页、短链接或广告落地页进入时被拦截。
可以请用户提供错误页截图,并在不泄露订单号、签名等敏感信息的情况下确认:
- 错误页来自支付宝、系统浏览器还是第三方浏览器;
- 地址栏显示的域名;
- 手机型号和 Android 版本;
- 支付宝及浏览器版本;
- 当前入口是短信、二维码、微信、浏览器还是 App 内嵌页;
- Wi-Fi 和移动网络下是否都能复现。
如果问题只出现在少数用户的设备上,更可能与客户端兼容性或本地安全策略有关。如果同一域名在多台设备上都能稳定复现,应优先检查域名和跳转链路。
二、检查域名和 HTTPS 配置
支付宝收银台之前以及支付返回之后涉及的商户页面,都应使用能够从公网正常访问的 HTTPS 地址。
需要检查:
- HTTPS 证书是否有效,证书链是否完整;
- 证书中的域名是否与实际访问域名一致;
- 是否仍在使用 HTTP 页面,或者发生了从 HTTPS 到 HTTP 的降级;
- 是否跳转到了 IP 地址、非标准端口或临时测试域名;
- 是否使用了短链、动态跳转域名或第三方中转服务;
- 域名近期是否更换过解析、证书或页面内容;
- 页面是否包含恶意脚本、强制下载、仿冒登录、诱导点击等容易触发安全拦截的内容。
检查时应覆盖整条重定向链,不要只看入口地址。例如:
curl -I -L 'https://pay.example.com/order/123'
不要把含有支付签名、用户身份信息或有效订单参数的完整 URL 提交到公开检测平台。
如果确认域名被支付宝或浏览器标记为风险地址,应先清除风险内容,再通过错误页面提供的申诉入口或相应平台的安全申诉渠道处理。更换域名可以用于定位问题,但不应成为长期绕过安全拦截的办法。
三、检查支付宝支付请求的生成方式
H5 支付通常由服务端调用 alipay.trade.wap.pay 生成支付表单,再由浏览器提交表单进入支付宝收银台。
不要在前端自行拼接签名,也不要对支付宝返回的整个表单再次进行 URL 编码或 HTML 转义。典型的处理方式如下:
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://pay.example.com/alipay/return");
request.setNotifyUrl("https://api.example.com/alipay/notify");
String bizContent = """
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "99.00",
"subject": "订单支付",
"product_code": "QUICK_WAP_WAY"
}
""";
request.setBizContent(bizContent);
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String form = response.getBody();
// 将 form 原样输出给浏览器,由顶层页面提交
} else {
// 记录 code、subCode、msg、subMsg,禁止记录私钥等敏感数据
}
前端页面可以直接输出并提交服务端生成的表单:
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="referrer" content="no-referrer">
<title>正在跳转到支付宝</title>
</head>
<body>
<!-- 服务端在此输出支付宝 SDK 生成的 form -->
</body>
</html>
不同语言和 SDK 版本的具体调用方式可能有所不同,应以当前接入的支付宝开放平台文档为准。基本原则不变:参数和签名由服务端生成,支付表单由浏览器顶层页面正常提交。
四、检查 return_url 和 notify_url
这两个地址的用途不同:
return_url:支付完成后,浏览器跳回的前端页面;notify_url:支付宝服务端发送异步通知的后端接口。
常见问题包括:
- 两个地址指向同一个只适合浏览器访问的页面;
return_url使用了 HTTP、IP 地址或测试域名;- URL 中嵌套了另一个 URL,却没有正确编码;
- 返回页再次无条件跳转,导致循环;
- 返回页依赖登录状态,登录失效后又跳到异常域名;
notify_url无法从公网访问,或者被登录验证、WAF 规则拦截。
需要在返回地址中携带业务参数时,应使用标准 URL 编码:
const returnUrl =
`https://pay.example.com/result?redirect=${encodeURIComponent(
"https://www.example.com/orders"
)}`;
不能根据 return_url 中的查询参数直接判定支付成功。最终支付状态应由服务端验签支付宝异步通知,或者主动查询交易结果后确认。
五、减少中间跳转
下面这种链路更容易触发安全策略或兼容性问题:
业务页 → 短链 → 统计页 → 广告落地页 → 支付中转页 → 支付宝
建议缩短为:
业务页 → 商户支付提交页 → 支付宝
还应避免:
- 使用 JavaScript 连续执行多次跨域跳转;
- 在隐藏的
iframe中加载支付宝收银台; - 通过 AJAX 请求收银台页面;
- 将支付表单嵌入第三方页面;
- 使用未经确认的 URL Scheme 强制拉起支付宝;
- 页面加载后立即触发下载、弹窗或剪贴板操作。
H5 支付最好由用户明确点击支付按钮后触发,并在浏览器顶层窗口中完成跳转:
document.querySelector("#pay-button").addEventListener("click", () => {
window.location.href = "/payment/alipay/create?orderId=ORDER_202609090001";
});
后端必须验证订单归属和订单状态,不能只根据前端传入的 orderId 和金额创建支付。
六、排查安卓客户端环境
如果域名和支付参数都正常,问题又只影响个别安卓用户,可以依次做以下对照测试:
- 更新支付宝客户端;
- 更新默认浏览器;
- 更新 Android System WebView 和 Chrome;
- 清除支付宝或浏览器缓存后重试;
- 暂时关闭第三方安全软件、广告过滤或私人 DNS 后测试;
- 在 Wi-Fi 和移动网络之间切换;
- 将链接复制到系统浏览器中打开;
- 换一台安卓设备,通过同一个订单入口测试。
这些操作只适合用来定位问题,不应要求用户长期关闭安全保护。如果关闭安全软件后才能访问,仍要继续排查页面内容、域名信誉和跳转行为。
从微信、QQ 或其他 App 的内置浏览器进入时,还可能受到宿主应用外链策略的限制。可以提示用户改用系统浏览器打开,但能否直接拉起支付宝取决于具体浏览器和客户端环境,不能假定所有安卓设备的行为都相同。
七、建议增加诊断日志
服务端至少应记录以下信息:
request_id
out_trade_no
支付接口调用时间
支付宝返回的 code / sub_code / msg / sub_msg
支付入口域名
return_url 的域名
User-Agent
Referer
最终支付状态
以下信息不要记录:
应用私钥
完整签名原文
用户身份证号
银行卡信息
完整手机号
可重复使用的支付凭证
前端可以记录页面生命周期和跳转阶段,但不要采集支付宝收银台内部的数据。借助这些日志,可以区分“接口创建失败”“浏览器没有提交表单”“域名被拦截”和“支付后返回页异常”。
注意事项
- “此网页已停止访问”不是能够直接定位根因的支付宝业务错误码,必须结合错误页来源和被拦截的 URL 判断。
- 不要通过忽略 HTTPS 错误、关闭证书校验或反复更换跳转域名来规避问题。
- 如果支付宝接口返回了
code、sub_code等字段,应优先根据实际错误码处理。如果接口调用成功但页面被拦截,则重点检查域名、重定向和客户端环境。 - 如果同一链接在支付宝客户端内一直被拦截,应保留截图、复现时间、商户应用标识、脱敏订单号和相关域名,并提交给支付宝技术支持或安全申诉渠道核查。
- 支付结果必须以服务端验签后的异步通知或主动查询结果为准,不能把浏览器是否成功跳回作为支付成功的依据。
备注:内容仅供参考。
