PAYATHON 2026

支付宝内置浏览器应使用哪种支付产品调起支付页面?

支付小周

结论

在支付宝内置浏览器中打开 H5 支付页面,并进入支付宝收银台,应接入支付宝的手机网站支付(WAP 支付),由服务端调用 alipay.trade.wap.pay 接口。

由于页面已经在支付宝客户端内运行,通常无须再次唤起支付宝 App。服务端生成支付表单后,前端提交该表单即可进入支付宝支付页面。

为什么选择手机网站支付

手机网站支付适用于移动端浏览器中的网页支付,包括:

  • 普通手机浏览器中的 H5 页面;
  • 支付宝内置浏览器中的 H5 页面;
  • 其他可以正常跳转或提交 HTML 表单的移动 WebView。

支付订单必须由服务端创建并签名。前端不能保存应用私钥,也不应自行拼接未经签名的支付地址。

如果要通过支付宝 JSBridge 在当前 WebView 中调用支付能力,则需要采用另一种接入方式,并确认账号是否已经开通 JSAPI 支付能力。对于从 H5 页面进入支付宝收银台的需求,通常优先使用手机网站支付。

接入步骤

1. 开通手机网站支付

在支付宝开放平台创建应用,开通手机网站支付能力,并完成应用公钥证书或公钥等签名配置。

商户类型、应用状态和开放平台页面不同,可申请的产品可能也不同,具体以当前应用后台显示的信息为准。

2. 服务端创建支付请求

服务端调用:

alipay.trade.wap.pay

核心业务参数示例:

{
  "out_trade_no": "ORDER_202609090001",
  "total_amount": "99.00",
  "subject": "订单支付",
  "product_code": "QUICK_WAP_WAY"
}

参数说明:

  • out_trade_no:商户订单号,必须唯一;
  • total_amount:订单金额,单位为元;
  • subject:订单标题;
  • product_code:手机网站支付通常使用 QUICK_WAP_WAY。

3. 将支付表单返回给浏览器

下面是 Java SDK 的常见写法。类名和构造参数可能会随 SDK 版本变化,请以所用版本的官方文档为准。

AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();

request.setNotifyUrl("https://example.com/alipay/notify");
request.setReturnUrl("https://example.com/payment/result");

AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("99.00");
model.setSubject("订单支付");
model.setProductCode("QUICK_WAP_WAY");

request.setBizModel(model);

AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);

if (response.isSuccess()) {
    String paymentForm = response.getBody();
    // 将 paymentForm 原样返回给浏览器
} else {
    // 记录错误码和错误信息,不要直接向用户暴露敏感数据
}

服务端返回的 paymentForm 通常是一段包含签名参数的 HTML 表单,可以直接作为响应正文返回:

response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(paymentForm);

浏览器加载并提交表单后,就会进入支付宝收银台。

支付结果处理

不能只看 return_url 页面来判断支付是否成功,因为用户可能关闭页面、遇到网络中断,也可能伪造前端参数。

建议按以下流程处理支付结果:

  1. 通过 notify_url 接收支付宝异步通知;
  2. 验证通知签名;
  3. 核对 app_id、商户订单号和订单金额等数据;
  4. 确认交易状态符合业务要求;
  5. 幂等更新订单状态;
  6. 必要时主动调用交易查询接口复核。

异步通知处理完成后,需要按照支付宝接口要求返回成功响应,否则支付宝可能重复发送通知。

注意事项

  • 支付请求和签名必须由服务端生成。私钥不能放在 JavaScript、App 包或公开仓库中。
  • notify_url 必须是支付宝服务器可以访问的公网 HTTPS 地址,不能使用 localhost 或局域网地址。
  • return_url 只用于支付后的页面跳转,不能作为可信的支付凭证。
  • 商户订单号必须唯一。重复发起支付时,需要避免生成多笔不可控的业务订单。
  • 金额必须由服务端根据订单数据计算,不能直接信任前端提交的金额。
  • 不建议根据 User-Agent 判断页面已经位于支付宝内,并因此省略服务端校验。
  • 如果页面运行在支付宝小程序中,应使用小程序对应的支付能力,不能直接套用普通 H5 的 WAP 支付流程。
  • 如果需要绕过 WAP 表单,直接调用支付宝客户端桥接支付,应先确认是否具有 JSAPI 支付权限,再按对应能力创建交易并调用客户端支付接口。

备注:内容仅供参考。