PAYATHON 2026

ap.tradePay H5 支付成功后的回调与跳转地址如何配置?

支付老李

结论

ap.tradePay 没有“完成按钮跳转地址”配置项。支付完成页及“完成”按钮由支付宝客户端控制,业务方无法直接修改按钮的文案或点击行为。

这里需要区分两类地址:

  • 支付结果回调:服务端创建支付订单时配置 notify_url,支付宝服务器通过该地址异步通知商户服务器。
  • 支付后的页面跳转:ap.tradePay 返回结果后,H5 页面可以根据支付结果调用 location.replace() 等方法跳转。

如果使用 alipay.trade.wap.pay 网页支付接口,还可以在请求中设置 return_url。它是同步返回地址,不能代替可靠的支付结果通知,也不保证改变支付宝客户端支付完成页“完成”按钮原有的关闭行为。

配置支付结果回调

notify_url 需要在服务端调用支付接口、生成订单参数时设置,不能只在 H5 页面中配置。

示例:

AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();

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

request.setBizContent("""
{
  "out_trade_no": "ORDER_202609130001",
  "total_amount": "99.00",
  "subject": "订单支付",
  "product_code": "QUICK_WAP_WAY"
}
""");

支付宝会向 notify_url 发送服务器请求。回调接口需要:

  1. 验证支付宝签名。
  2. 校验 app_id、seller_id、out_trade_no 和支付金额。
  3. 判断 trade_status。
  4. 以幂等方式更新订单状态。
  5. 处理成功后返回纯文本 success。

示意代码:

@PostMapping("/alipay/notify")
public String handleNotify(HttpServletRequest request) {
    Map<String, String> params = extractAlipayParams(request);

    boolean verified = verifyAlipaySignature(params);
    if (!verified) {
        return "failure";
    }

    if (!checkOrderNumberAndAmount(params)) {
        return "failure";
    }

    String tradeStatus = params.get("trade_status");
    if ("TRADE_SUCCESS".equals(tradeStatus)
            || "TRADE_FINISHED".equals(tradeStatus)) {
        updateOrderIdempotently(params);
        return "success";
    }

    return "failure";
}

SDK 的具体类名和签名验证方法可能随语言及 SDK 版本变化,请以当前使用的支付宝开放平台 SDK 为准。

在 ap.tradePay 回调中跳转

支付控件关闭并返回结果后,H5 页面可以自行跳转:

ap.tradePay(
  {
    tradeNO: '支付宝交易号'
  },
  function (result) {
    if (String(result.resultCode) === '9000') {
      window.location.replace(
        '/pay/result?orderNo=ORDER_202609130001'
      );
      return;
    }

    // 取消、失败或结果未知时,也建议进入订单查询页
    window.location.replace(
      '/pay/result?orderNo=ORDER_202609130001'
    );
  }
);

结果页不应仅凭 resultCode === '9000' 就展示“已支付”。更稳妥的处理流程是:

ap.tradePay 返回
    ↓
跳转到业务结果页
    ↓
结果页请求商户服务器查询订单
    ↓
商户服务器查询本地订单,必要时主动查询支付宝
    ↓
展示最终支付状态

return_url 的适用范围

服务端调用 alipay.trade.wap.pay 时,通常可以同时设置:

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

两者用途不同:

  • notify_url:供支付宝服务器通知商户服务器,用于可靠地更新订单状态。
  • return_url:支付流程结束后的同步页面返回地址,主要用于改善用户体验。

支付结束后是否会跳转到 return_url,还取决于支付入口、支付宝客户端版本、WebView 生命周期以及用户是否关闭页面等因素。因此,不能将它作为判断支付成功的唯一依据,也不能假定它一定会覆盖“完成”按钮原有的行为。

注意事项

  • 不要为 ap.tradePay 添加文档中没有定义的 returnUrl、redirectUrl 等参数,未声明的参数通常不会生效。
  • “完成”按钮属于支付宝收银台页面,业务 H5 无法修改其文案和点击逻辑。
  • 页面可能因关闭、网络中断或客户端行为而无法执行前端成功回调。订单状态必须以服务端异步通知或主动查询结果为准。
  • notify_url 必须是支付宝服务器可以访问的 HTTPS 地址,不能使用本机地址、内网地址,也不能指向依赖用户登录状态的页面。
  • 支付宝可能重复发送异步通知,因此订单更新必须具备幂等性。
  • 如果点击“完成”会关闭承载 H5 的整个 WebView,导致原页面无法继续执行 JavaScript,就需要依靠 notify_url 更新订单。用户再次进入业务页面时,再查询并恢复订单状态。

备注:内容仅供参考。