通过 scheme 跳转支付宝支付后如何返回原 APP
结论
Nebula 通用浏览器容器 appId=20000067 没有通用 API 可以识别并返回原 APP。
要可靠地返回指定 APP,需要由原 APP 提供回跳地址,并在支付完成后的 H5 页面中主动唤起:
- iOS 优先使用 Universal Links。
- Android 优先使用 App Links。
- 无法使用通用链接时,可以使用自定义 URL Scheme。
- 如果只是关闭支付宝当前的 H5 页面,可以尝试使用 Nebula 的关闭窗口能力。但关闭后只能返回支付宝的上一层页面,无法保证回到原 APP。
实现思路
原 APP 跳转到支付宝时,将回跳地址或业务标识传给支付结果页。例如:
https://pay.example.com/result?orderId=123456&callback=myapp%3A%2F%2Fpayment%2Fresult
支付完成后,服务端先确认订单状态。确认成功后,再由结果页尝试打开原 APP:
myapp://payment/result?orderId=123456&status=success
原 APP 需要注册并处理该链接,解析 orderId 后重新向业务服务端查询支付结果。不能直接将 H5 传入的 status=success 作为支付成功凭证。
H5 回跳示例
下面以自定义 Scheme 为例:
<button id="open-app" type="button">返回 APP</button>
<script>
document.getElementById('open-app').addEventListener('click', function () {
const orderId = '123456';
const callbackUrl =
'myapp://payment/result?orderId=' + encodeURIComponent(orderId);
window.location.href = callbackUrl;
});
</script>
跳转最好由用户点击按钮触发。支付宝内置浏览器、系统 WebView 或操作系统可能会限制页面自动唤起外部 APP,因此在支付完成后立即执行 window.location.href 不一定有效。
还可以为 APP 未安装或唤起失败的情况增加兜底页面:
function openApp(orderId) {
const appUrl =
'myapp://payment/result?orderId=' + encodeURIComponent(orderId);
const fallbackUrl =
'https://www.example.com/download';
const startedAt = Date.now();
window.location.href = appUrl;
window.setTimeout(function () {
if (document.visibilityState === 'visible' &&
Date.now() - startedAt < 2500) {
window.location.href = fallbackUrl;
}
}, 1500);
}
这种定时判断只能用于体验兜底,无法准确判断 APP 是否已经成功启动。不同支付宝版本和操作系统处理外部 Scheme 的方式可能不同,需要在目标环境中实际验证。
原 APP 的处理
原 APP 需要注册对应链接,并校验允许接收的路径和参数。
例如,可以约定:
myapp://payment/result?orderId=123456
APP 被唤起后,应按以下流程处理:
- 校验链接的 scheme、host 和 path。
- 读取
orderId,不要信任页面传入的支付状态。 - 调用业务服务端的订单查询接口。
- 由服务端根据支付宝异步通知或主动查单结果确认最终状态。
- 展示支付成功、失败或处理中的页面。
如果使用 Universal Links 或 Android App Links,还需要配置域名关联文件和客户端声明。与自定义 Scheme 相比,这两种方式通常更安全,也能减少 Scheme 被其他应用抢占的问题。
只关闭支付宝 H5 容器
如果只需要关闭当前 Nebula 页面,而不需要定向唤起原 APP,可以在支付宝 JSBridge 初始化后尝试关闭窗口:
document.addEventListener('AlipayJSBridgeReady', function () {
AlipayJSBridge.call('popWindow');
});
某些容器场景也可能提供 exitApp:
document.addEventListener('AlipayJSBridgeReady', function () {
AlipayJSBridge.call('exitApp');
});
这两个能力能否使用,取决于支付宝客户端版本、容器类型和 JSAPI 权限。尤其在 appId=20000067 的通用浏览器模式下,不能假定 H5 一定具备相应权限。
即使窗口成功关闭,通常也只会回到支付宝的上一层界面。操作系统是否会显示原 APP,取决于支付宝的打开方式、页面栈状态和系统调度,因此不能将关闭窗口作为可靠的定向回跳方案。
注意事项
- 支付接口中的
return_url通常是支付完成后的网页同步跳转地址,不是原生 APP 的回调地址。可以先跳转到业务 H5 结果页,再由结果页唤起 APP。 - 支付最终结果必须以服务端异步通知或服务端主动查单为准。
- 回跳链接中不要携带支付密钥、用户凭证或其他敏感数据。
- 自定义 Scheme 应使用业务专属名称,并在 APP 内严格限制可处理的路由。
- iOS 和 Android 对外部应用唤起的限制不同,需要分别测试 APP 已安装、未安装、支付取消、支付处理中和支付宝冷启动等场景。
- 如果业务要求稳定完成 “APP → 支付宝 → APP” 的闭环,应优先使用支付宝面向原生 APP 的支付接入方式,并结合客户端支付回调、服务端验签和查单确认结果。通过通用浏览器 H5 和 Scheme 回跳的方式只适合作为兼容方案。
备注:内容仅供参考。
