PAYATHON 2026

H5网页调起支付宝支付时提示“此网页已停止访问”怎么办?

支付阿杰

结论

出现“此网页已停止访问”,通常并不是支付接口返回了业务错误,而是支付跳转链路中的某个页面被浏览器、支付宝安全组件或手机安全软件拦截。

如果只有部分安卓手机出现问题,其他设备可以正常支付,应优先检查:

  • 实际被拦截的 URL 或域名是否被识别为风险地址;
  • 支付请求是否经过短链、第三方跳转、HTTP 页面或多次重定向;
  • return_url、quit_url 等地址是否填写错误、没有正确编码或包含不可信域名;
  • 支付是否从微信、应用内 WebView、iframe 等受限环境发起;
  • 用户手机上的支付宝、浏览器或 Android System WebView 是否异常。

排查时,先确认提示页面由谁显示,以及具体拦截了哪个地址,再判断应该修改支付链路、处理域名风险,还是修复客户端环境。

一、先定位被拦截的页面

不要只凭提示文字判断支付宝接口出了故障。建议记录完整的支付链路:

业务下单页
  → 商户后端创建支付宝支付请求
  → 支付宝收银台
  → 商户 return_url

首先确认错误发生在哪个阶段:

  1. 还没有进入支付宝收银台;
  2. 已经进入支付宝,但收银台页面被拦截;
  3. 支付完成后,返回商户页面时被拦截;
  4. 从中间跳转页、短链接或广告落地页进入时被拦截。

可以请用户提供错误页截图,并在不泄露订单号、签名等敏感信息的情况下确认:

  • 错误页来自支付宝、系统浏览器还是第三方浏览器;
  • 地址栏显示的域名;
  • 手机型号和 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 和金额创建支付。

六、排查安卓客户端环境

如果域名和支付参数都正常,问题又只影响个别安卓用户,可以依次做以下对照测试:

  1. 更新支付宝客户端;
  2. 更新默认浏览器;
  3. 更新 Android System WebView 和 Chrome;
  4. 清除支付宝或浏览器缓存后重试;
  5. 暂时关闭第三方安全软件、广告过滤或私人 DNS 后测试;
  6. 在 Wi-Fi 和移动网络之间切换;
  7. 将链接复制到系统浏览器中打开;
  8. 换一台安卓设备,通过同一个订单入口测试。

这些操作只适合用来定位问题,不应要求用户长期关闭安全保护。如果关闭安全软件后才能访问,仍要继续排查页面内容、域名信誉和跳转行为。

从微信、QQ 或其他 App 的内置浏览器进入时,还可能受到宿主应用外链策略的限制。可以提示用户改用系统浏览器打开,但能否直接拉起支付宝取决于具体浏览器和客户端环境,不能假定所有安卓设备的行为都相同。

七、建议增加诊断日志

服务端至少应记录以下信息:

request_id
out_trade_no
支付接口调用时间
支付宝返回的 code / sub_code / msg / sub_msg
支付入口域名
return_url 的域名
User-Agent
Referer
最终支付状态

以下信息不要记录:

应用私钥
完整签名原文
用户身份证号
银行卡信息
完整手机号
可重复使用的支付凭证

前端可以记录页面生命周期和跳转阶段,但不要采集支付宝收银台内部的数据。借助这些日志,可以区分“接口创建失败”“浏览器没有提交表单”“域名被拦截”和“支付后返回页异常”。

注意事项

  • “此网页已停止访问”不是能够直接定位根因的支付宝业务错误码,必须结合错误页来源和被拦截的 URL 判断。
  • 不要通过忽略 HTTPS 错误、关闭证书校验或反复更换跳转域名来规避问题。
  • 如果支付宝接口返回了 code、sub_code 等字段,应优先根据实际错误码处理。如果接口调用成功但页面被拦截,则重点检查域名、重定向和客户端环境。
  • 如果同一链接在支付宝客户端内一直被拦截,应保留截图、复现时间、商户应用标识、脱敏订单号和相关域名,并提交给支付宝技术支持或安全申诉渠道核查。
  • 支付结果必须以服务端验签后的异步通知或主动查询结果为准,不能把浏览器是否成功跳回作为支付成功的依据。

备注:内容仅供参考。