支付宝聚合支付成功后如何从H5完成页跳转到自定义页面
支付老李
结论
如果实际调用的是支付宝手机网站支付接口 alipay.trade.wap.pay,需要在后端创建支付请求时设置 return_url。它的值应为支付完成后跳转到的前端完整地址。
前后端分离并不会改变这个参数的配置位置。支付参数需要签名,所以 return_url 应由后端传给支付宝,不能只在前端配置支付完成页的路由。用户点击支付宝收银台右上角的”完成”后,支付宝会跳转到该地址。
后端配置示例
以 Java SDK 为例:
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
// 支付完成后的页面跳转地址
request.setReturnUrl("https://www.example.com/payment/result");
// 支付结果异步通知地址
request.setNotifyUrl("https://api.example.com/alipay/notify");
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(orderNo);
model.setTotalAmount("99.00");
model.setSubject("订单支付");
model.setProductCode("QUICK_WAP_WAY");
request.setBizModel(model);
String paymentForm = alipayClient.pageExecute(request).getBody();
后端生成 paymentForm 后,可以将其返回给前端,由前端提交表单并进入支付宝收银台:
document.open();
document.write(paymentForm);
document.close();
后端也可以直接输出支付宝返回的表单页面,具体方式取决于项目现有的支付跳转流程。
前端结果页处理
假设 return_url 设置为:
https://www.example.com/payment/result
前端进入该路由后,可以读取商户订单号,再调用自己的后端接口查询订单状态:
const params = new URLSearchParams(window.location.search);
const outTradeNo = params.get('out_trade_no');
fetch(`/api/orders/${encodeURIComponent(outTradeNo)}/payment-status`)
.then(response => response.json())
.then(result => {
if (result.paid) {
// 展示支付成功
} else {
// 展示处理中,并按需继续查询
}
});
不能仅根据跳转页面携带的参数,将订单状态改为”已支付”。
return_url 和 notify_url 的区别
两个地址的用途不同:
return_url:页面跳转地址,用于将用户带回商户页面。notify_url:支付宝服务器的异步通知地址,供后端确认并更新支付结果。
用户可能关闭页面、遇到断网,或者没有点击”完成”,所以 return_url 不一定会被访问。订单状态应以验签通过的异步通知为主,后端也可以调用支付宝交易查询接口进行补偿确认。
异步通知接口通常需要处理以下内容:
- 验证支付宝签名。
- 核对
app_id、商户订单号、金额等数据。 - 判断交易状态,例如
TRADE_SUCCESS或业务接受的其他状态。 - 幂等更新订单,避免重复通知引发重复处理。
- 按支付宝接口要求返回成功响应。
聚合支付场景需要确认实际接口
“聚合支付二维码”可能只是业务上的统称,不代表最终调用的一定是 alipay.trade.wap.pay。
不同支付链路的处理方式如下:
alipay.trade.wap.pay:在支付请求中设置return_url。alipay.trade.precreate:这是扫码支付接口,通常没有 H5 支付完成页的return_url配置方式。- 第三方聚合支付服务商接口:需要查找服务商提供的
return_url、redirect_url、front_url或类似参数,再由服务商将其透传给支付宝。 - 支付宝客户端自身的原生页面或关闭按钮:商户页面无法通过 JavaScript 监听或强制改变它的行为,只能使用支付接口支持的返回地址参数。
应先检查后端创建支付订单时调用的具体接口。如果代码中有 AlipayTradeWapPayRequest 或接口名 alipay.trade.wap.pay,就在支付请求中配置 return_url。
注意事项
return_url应填写可通过公网访问的完整HTTP或HTTPS地址,生产环境建议使用HTTPS。- 不要填写
/payment/result这类前端相对路径,支付宝无法根据它确定商户站点的完整地址。 - 如果前端使用 History 路由,Web 服务器需要将
/payment/result回退到前端入口文件,否则刷新或跳转后可能出现 404。 - 不要将签名私钥放在前端,也不要让前端直接拼装需要签名的支付宝请求。
- 地址中的动态参数需要正确编码。使用官方 SDK 时,优先通过 SDK 的
setReturnUrl等方法传入。 - 支付状态必须以后端验签和交易查询结果为准。页面跳转只用于衔接用户操作流程,不能作为支付成功的可信凭据。
备注:内容仅供参考。
