PAYATHON 2026

通过 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 被唤起后,应按以下流程处理:

  1. 校验链接的 scheme、host 和 path。
  2. 读取 orderId,不要信任页面传入的支付状态。
  3. 调用业务服务端的订单查询接口。
  4. 由服务端根据支付宝异步通知或主动查单结果确认最终状态。
  5. 展示支付成功、失败或处理中的页面。

如果使用 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 回跳的方式只适合作为兼容方案。

备注:内容仅供参考。