百度app内h5支付如何获取支付宝trade_pay.do链接
结论
支付宝公开支付 SDK 通常无法直接申请或转换出 https://maliprod.alipay.com/w/trade_pay.do 链接。
trade_pay.do 更接近支付宝特定业务场景使用的收银台路由。链接中的 alipay_trade_no 不能作为普通商户自行拼接收银台地址的依据。手动构造的链接也可能因交易归属、签名、风控或用户身份不匹配而失效。
移动网页支付应接入 alipay.trade.wap.pay。服务端调用该接口后,SDK 会返回一段自动提交至支付宝网关的 HTML 表单,并非固定格式的 trade_pay.do URL。浏览器加载表单后,支付宝会决定跳转到哪个收银台页面,以及是否允许唤起支付宝客户端。
为什么两个链接的表现不同
mclient.alipay.com/cashier/mobilepay.htm 和 maliprod.alipay.com/w/trade_pay.do 不是两种可以互换的公开接口地址。它们可能对应不同的支付产品、交易来源、收银台版本或支付宝内部路由策略。
在百度 App 内无法唤起支付宝,通常与以下因素有关:
- 百度 App 的 WebView 是否允许打开
alipays://等外部 Scheme。 - 页面跳转是否由用户点击直接触发。
- WebView 是否会拦截重定向、新窗口或外部应用跳转。
- 当前接入的是旧版移动支付接口,还是
alipay.trade.wap.pay。 - 商户账号是否已经签约手机网站支付产品。
- 支付页面的来源域名、回跳地址是否与实际签约配置一致。
所以,“另一个链接可以唤起”不代表商户能通过 SDK 获取同类链接,也不能证明这种链接形式适用于其他订单。
推荐接入方式
1. 服务端调用手机网站支付接口
调用 alipay.trade.wap.pay,并将 product_code 设置为:
QUICK_WAP_WAY
常用业务参数如下:
{
"out_trade_no": "ORDER_202609080001",
"total_amount": "99.00",
"subject": "订单支付",
"product_code": "QUICK_WAP_WAY",
"quit_url": "https://www.example.com/pay/cancel"
}
还需通过请求对象设置:
return_url:用户完成支付后的前端回跳地址。notify_url:支付宝向商户服务端发送异步通知的地址。
2. 将 SDK 返回的表单原样输出给浏览器
下面是 Java 示例。不同版本的支付宝 Java SDK,具体类名可能略有差异:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://www.example.com/pay/return");
request.setNotifyUrl("https://www.example.com/api/alipay/notify");
request.setBizContent("""
{
"out_trade_no": "ORDER_202609080001",
"total_amount": "99.00",
"subject": "订单支付",
"product_code": "QUICK_WAP_WAY",
"quit_url": "https://www.example.com/pay/cancel"
}
""");
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(
"创建支付宝支付页面失败:" + response.getSubCode() + " " + response.getSubMsg()
);
}
String paymentForm = response.getBody();
HTTP 接口应把 paymentForm 作为 HTML 返回:
@GetMapping(value = "/pay/alipay", produces = "text/html;charset=UTF-8")
@ResponseBody
public String pay() throws AlipayApiException {
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (!response.isSuccess()) {
throw new IllegalStateException(response.getSubMsg());
}
return response.getBody();
}
前端可以在用户点击”支付宝支付”后跳转到这个服务端地址:
document.querySelector("#alipay-button").addEventListener("click", () => {
window.location.href = "/pay/alipay?orderId=ORDER_202609080001";
});
不要从 response.getBody() 中提取临时 URL,再保存或重新拼装。表单中的网关地址、签名和参数应当整体使用。
百度 App 内仍然无法唤起时
alipay.trade.wap.pay 可以创建支付宝手机网站支付页面,但不能保证所有第三方 App 的内嵌 WebView 都允许唤起支付宝客户端。外部 App 能否拉起,还要看百度 App 的 WebView 策略以及支付宝收银台当时的路由判断。
建议按以下顺序排查:
-
在手机系统浏览器中打开同一个支付入口,确认订单和支付宝签约均正常。
-
确保支付动作由用户点击直接触发,不要通过定时器、异步回调或多层 iframe 自动唤起。
-
使用页面顶层跳转:
window.top.location.href = paymentUrl;这种方式只能在页面不存在跨域顶层访问限制时使用。
-
检查百度 App 是否拦截外部 Scheme、新窗口或跨应用跳转。
-
如果内嵌 WebView 明确不支持外部唤起,应提示用户”在系统浏览器中打开”,同时保留支付宝 H5 收银台支付路径。
-
如果目前仍使用旧版
mobilepay.htm接入方式,应根据商户已签约的产品迁移至alipay.trade.wap.pay,不要尝试将其转换成trade_pay.do。
支付结果处理
return_url 只用于页面回跳,不能单独作为支付成功的确认依据。用户可能关闭页面或遇到网络中断,回跳参数也可能被伪造。
订单状态应以以下结果为准:
- 验签通过的支付宝异步通知。
- 服务端调用交易查询接口获得的状态。
收到异步通知后,还需要核对:
app_idout_trade_nototal_amountseller_id- 交易状态
- 签名
注意事项
- 不要使用示例中的
alipay_trade_no拼接trade_pay.do。 - 不要将商户私钥放入 H5 页面或百度 App 的前端代码。
- 不要复用其他商户或其他订单生成的收银台链接。
notify_url必须能被支付宝服务器通过公网访问。- 生产环境使用
https://openapi.alipay.com/gateway.do。沙箱环境的网关、账号和密钥必须配套使用。 - 如果使用第三方封装 SDK,需要确认其底层实际调用的支付宝接口。只有底层调用
alipay.trade.wap.pay,才能按照手机网站支付的标准流程处理。第三方 SDK 自定义返回的 URL 形式,不代表支付宝公开接口支持该 URL。
备注:内容仅供参考。
