支付宝内置浏览器应使用哪种支付产品调起支付页面?
支付小周
结论
在支付宝内置浏览器中打开 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 页面来判断支付是否成功,因为用户可能关闭页面、遇到网络中断,也可能伪造前端参数。
建议按以下流程处理支付结果:
- 通过
notify_url接收支付宝异步通知; - 验证通知签名;
- 核对
app_id、商户订单号和订单金额等数据; - 确认交易状态符合业务要求;
- 幂等更新订单状态;
- 必要时主动调用交易查询接口复核。
异步通知处理完成后,需要按照支付宝接口要求返回成功响应,否则支付宝可能重复发送通知。
注意事项
- 支付请求和签名必须由服务端生成。私钥不能放在 JavaScript、App 包或公开仓库中。
notify_url必须是支付宝服务器可以访问的公网 HTTPS 地址,不能使用localhost或局域网地址。return_url只用于支付后的页面跳转,不能作为可信的支付凭证。- 商户订单号必须唯一。重复发起支付时,需要避免生成多笔不可控的业务订单。
- 金额必须由服务端根据订单数据计算,不能直接信任前端提交的金额。
- 不建议根据 User-Agent 判断页面已经位于支付宝内,并因此省略服务端校验。
- 如果页面运行在支付宝小程序中,应使用小程序对应的支付能力,不能直接套用普通 H5 的 WAP 支付流程。
- 如果需要绕过 WAP 表单,直接调用支付宝客户端桥接支付,应先确认是否具有 JSAPI 支付权限,再按对应能力创建交易并调用客户端支付接口。
备注:内容仅供参考。
