支付宝扫码支付提示“非支付宝官方网页”如何解决?
结论
这个提示通常不是支付接口报错,而是二维码中包含了商户自己的公开网页地址。支付宝扫码后会先访问第三方网页,而不是支付宝生成的收款二维码地址,因此显示“非支付宝官方网页,请确认是否继续”属于正常现象。
如果要让用户打开支付宝扫描二维码付款,应调用当面付预创建接口 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、请求时间、接口响应和二维码实际内容,联系支付宝开放平台技术支持核查。
备注:内容仅供参考。
