PAYATHON 2026

Android App调用支付宝支付后如何返回自己的App?

支付老李

结论

仅通过 ACTION_VIEW 打开 https://qr.alipay.com/... 或 alipays://platformapi/startapp...,不能保证用户支付成功或取消后自动返回自己的 App。

这类地址是支付宝二维码或内部页面的唤起链接。你的 App 只能负责打开支付宝,之后的页面跳转和任务栈由支付宝控制,也没有可供第三方 App 配置的回调 Scheme。

要实现完整的支付发起、结果获取和返回 App 流程,应接入支付宝 App 支付 SDK。如果必须使用现有二维码,只能在 App 恢复到前台后主动查询订单状态,不能依赖二维码链接自动跳回。

为什么会停留在支付宝

下面的代码只是启动一个能够处理该 URI 的外部 Activity:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
activity.startActivity(intent);

它既没有建立支付结果回调,也没有告诉支付宝支付结束后应打开哪个 Activity。

给 Intent 添加 FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP 等标志,只能影响 Android 任务栈,无法要求支付宝在支付结束后主动跳回你的 App。自行修改 alipays://platformapi/startapp 参数也不可靠,不应把这类参数当作公开支付接口使用。

推荐方案:接入支付宝 App 支付 SDK

标准流程如下:

  1. App 向业务服务器提交下单请求。
  2. 服务器调用支付宝接口创建订单,并生成、签名 orderInfo。
  3. App 通过支付宝 SDK 的 PayTask.payV2() 发起支付。
  4. 支付交互结束后,SDK 将客户端结果返回给 App。
  5. 服务器通过支付宝异步通知或主动查询接口确认订单的最终状态。
  6. App 根据服务器确认的状态更新支付页面。

订单签名必须由服务器完成,不能将应用私钥放入 APK。

示例代码:

ExecutorService executor = Executors.newSingleThreadExecutor();

executor.execute(() -> {
    PayTask payTask = new PayTask(activity);

    // orderInfo 应由业务服务器生成并签名
    Map<String, String> result = payTask.payV2(orderInfo, true);

    activity.runOnUiThread(() -> {
        String resultStatus = result.get("resultStatus");
        String memo = result.get("memo");
        String rawResult = result.get("result");

        if ("9000".equals(resultStatus)) {
            // 客户端显示支付已完成,但仍需向业务服务器查询最终订单状态
            queryOrderFromServer();
        } else if ("6001".equals(resultStatus)) {
            // 用户取消支付
            showPaymentCancelled();
        } else {
            // 包括处理中、网络异常、重复请求等情况
            // 不应只凭本地返回值直接判定订单失败
            queryOrderFromServer();
        }
    });
});

payV2() 是阻塞调用,不要直接在主线程中执行。SDK 依赖、混淆规则和 Manifest 配置,应以当前支付宝开放平台文档及实际使用的 SDK 版本为准。

如果必须继续使用二维码

如果二维码来自个人收款码、当面付二维码或其他固定二维码场景,通常不支持支付后回跳第三方 App。二维码唤起方式可以保留,但业务流程需要调整为:

@Override
protected void onResume() {
    super.onResume();

    if (waitingForPayment) {
        queryOrderFromServer();
    }
}

用户通过返回键、最近任务列表或桌面重新进入 App 后,在 onResume() 中查询服务器订单状态,再显示支付结果。

需要注意:

  • onResume() 只能说明 App 已回到前台,不能说明支付成功。
  • 不要在每次执行 onResume() 时无条件查询,应保存仍待确认的业务订单号。
  • 查询需要设置超时和重试次数,避免持续轮询。
  • 二维码支付必须与唯一的业务订单关联,否则服务器无法可靠判断对应的是哪笔付款。
  • 客户端截图、页面停留状态和支付宝本地返回内容,都不能代替服务端验签与订单确认。

不建议自行注册回跳 Scheme

自己的 App 可以注册自定义 Scheme,例如:

<activity
    android:name=".PaymentCallbackActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:scheme="myapp"
            android:host="payment-result" />
    </intent-filter>
</activity>

只有支付产品明确支持配置回跳地址,并且支付宝确实会访问类似下面的地址时,这种配置才会生效:

myapp://payment-result

App 注册 Scheme 并不会让普通 qr.alipay.com 二维码自动回跳。也不要将未经文档确认的自定义参数拼接到 alipays://platformapi/startapp 链接中。

如果需要稳定地自动返回 App,应使用支付宝 App 支付 SDK。如果继续使用二维码,则需要分别处理“返回 App”和“确认支付结果”这两个步骤。

备注:内容仅供参考。