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 发送服务器请求。回调接口需要:
- 验证支付宝签名。
- 校验
app_id、seller_id、out_trade_no和支付金额。 - 判断
trade_status。 - 以幂等方式更新订单状态。
- 处理成功后返回纯文本
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更新订单。用户再次进入业务页面时,再查询并恢复订单状态。
备注:内容仅供参考。
