PAYATHON 2026

百度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 策略以及支付宝收银台当时的路由判断。

建议按以下顺序排查:

  1. 在手机系统浏览器中打开同一个支付入口,确认订单和支付宝签约均正常。

  2. 确保支付动作由用户点击直接触发,不要通过定时器、异步回调或多层 iframe 自动唤起。

  3. 使用页面顶层跳转:

    window.top.location.href = paymentUrl;

    这种方式只能在页面不存在跨域顶层访问限制时使用。

  4. 检查百度 App 是否拦截外部 Scheme、新窗口或跨应用跳转。

  5. 如果内嵌 WebView 明确不支持外部唤起,应提示用户”在系统浏览器中打开”,同时保留支付宝 H5 收银台支付路径。

  6. 如果目前仍使用旧版 mobilepay.htm 接入方式,应根据商户已签约的产品迁移至 alipay.trade.wap.pay,不要尝试将其转换成 trade_pay.do。

支付结果处理

return_url 只用于页面回跳,不能单独作为支付成功的确认依据。用户可能关闭页面或遇到网络中断,回跳参数也可能被伪造。

订单状态应以以下结果为准:

  • 验签通过的支付宝异步通知。
  • 服务端调用交易查询接口获得的状态。

收到异步通知后,还需要核对:

  • app_id
  • out_trade_no
  • total_amount
  • seller_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。

备注:内容仅供参考。