PAYATHON 2026

支付宝扫码支付提示“非支付宝官方网页”如何解决?

支付小周

结论

这个提示通常不是支付接口报错,而是二维码中包含了商户自己的公开网页地址。支付宝扫码后会先访问第三方网页,而不是支付宝生成的收款二维码地址,因此显示“非支付宝官方网页,请确认是否继续”属于正常现象。

如果要让用户打开支付宝扫描二维码付款,应调用当面付预创建接口 alipay.trade.precreate,再将响应中的 qr_code 原样生成二维码。二维码内容不应是“请求支付 URL 的中转接口”、跳转页面或自行拼接的支付宝网关地址。

原因说明

当前流程可能是:

支付宝扫码
    ↓
访问 https://merchant.example.com/create-pay
    ↓
商户服务器生成支付宝支付 URL
    ↓
页面跳转到支付宝

支付宝扫码时,首先识别到的是商户域名。由于该页面不是支付宝官方页面,出现安全提示符合预期。即使这个地址随后通过 302 跳转到支付宝支付地址,也未必能避开提示,因为扫码入口仍是外部网页。

正确的扫码支付流程是:

商户服务器调用 alipay.trade.precreate
    ↓
取得 response.qr_code
    ↓
将 qr_code 直接生成二维码
    ↓
用户使用支付宝扫码并完成付款

调整步骤

1. 使用正确的支付产品

二维码由商户展示,用户打开支付宝扫码时,应使用支付宝当面付的预创建交易接口:

alipay.trade.precreate

如果用户已经在手机浏览器中打开商户网页,再点击按钮发起支付,通常应使用手机网站支付接口:

alipay.trade.wap.pay

不要混用这两种场景。alipay.trade.wap.pay 返回的跳转页面不能作为当面付二维码的内容。

2. 服务端创建预支付交易

下面是 Java SDK 的示意代码。具体的类名和配置方式,应以项目实际使用的支付宝 SDK 版本为准:

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

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("ORDER_202609090001");
model.setSubject("订单支付");
model.setTotalAmount("0.01");

request.setBizModel(model);
request.setNotifyUrl("https://merchant.example.com/alipay/notify");

AlipayTradePrecreateResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    String qrCode = response.getQrCode();
    // 将 qrCode 返回给前端,或者直接在服务端生成二维码图片
} else {
    throw new IllegalStateException(
        response.getCode() + ": " + response.getSubMsg()
    );
}

在生产环境中,out_trade_no 必须唯一。total_amount 应由服务端根据订单计算,不能直接使用前端提交的金额。

3. 直接对 qr_code 编码

服务端只需向前端返回必要的数据:

{
  "outTradeNo": "ORDER_202609090001",
  "qrCode": "https://qr.alipay.com/xxxxxxxxxxxx"
}

前端直接使用 qrCode 字段生成二维码:

new QRCode(document.getElementById("qrcode"), {
  text: result.qrCode,
  width: 240,
  height: 240
});

不要再把它包装成商户页面地址,例如:

https://merchant.example.com/pay?target=https%3A%2F%2Fqr.alipay.com%2F...

二维码也不建议指向返回 302 的中转接口。

4. 通过异步通知确认支付结果

二维码生成成功不等于付款成功。订单状态应以支付宝异步通知或主动查询结果为准:

alipay.trade.query

接收异步通知时,需要完成以下校验:

  • 使用支付宝公钥验证签名。
  • 校验 app_id、seller_id 等商户身份信息。
  • 校验 out_trade_no 是否属于当前系统。
  • 校验 total_amount 是否与订单金额一致。
  • 仅在 TRADE_SUCCESS 或业务认可的状态下更新订单。
  • 做好幂等处理,避免重复通知导致重复入账。

如果必须扫描商户网页地址

如果二维码本来就是用来打开 H5 页面,而不是直接进入支付宝收银台,那么“非支付宝官方网页”的提示可能无法通过普通接口配置彻底消除。应用网关、授权回调地址、支付回调地址或域名 HTTPS 等配置,也不会让商户页面自动变成支付宝官方页面。

此时需要:

  • 使用有效的 HTTPS 证书。
  • 确保域名和页面内容符合支付宝及浏览器的安全要求。
  • 避免使用多层跳转、短链接或隐藏跳转目标。
  • 检查域名是否已被安全系统标记为风险地址。
  • 页面打开后,让用户明确点击支付按钮,再发起适合 H5 场景的支付流程。

如果二维码已经直接使用 alipay.trade.precreate 返回的 qr_code,却仍然出现相同提示,应先检查二维码内容是否在传输、短链转换或生成过程中被替换。确认内容完全一致后仍有问题,可能与应用签约状态、产品权限或支付宝安全风控有关。此时需要携带 app_id、请求时间、接口响应和二维码实际内容,联系支付宝开放平台技术支持核查。

备注:内容仅供参考。