PAYATHON 2026

【已解决】Unity安卓接入APP支付后小米设备无法调起支付宝和RT

支付阿杰

结论

这个问题通常与支付宝支付参数或 Unity 回调逻辑无关,而是小米设备的 MIUI 安全策略阻止了应用打开支付宝界面。支付 SDK 无法启动外部 Activity 时,Unity 仍有可能收到回调,但回调内容是空字符串。

进入小米系统的应用权限设置,为当前应用开启“后台弹出界面”或名称相近的权限。重启应用并再次发起支付,通常可以恢复正常。

解决步骤

在小米手机中依次进入:

设置
→ 应用设置
→ 应用管理
→ 选择当前应用
→ 权限管理 / 其他权限
→ 允许“后台弹出界面”

不同版本的 MIUI 或 HyperOS 可能使用不同的菜单名称,例如“后台打开新界面”“显示弹出窗口”等。

修改权限后,按以下步骤重新测试:

  1. 完全结束当前应用和支付宝进程。
  2. 重新启动应用。
  3. 确认支付宝已经安装并且可以正常登录。
  4. 再次点击支付按钮。

如果开启权限后能够正常调起支付宝,基本可以确认问题来自小米系统的界面启动限制。

Android 侧调用注意事项

支付调用应在主线程中发起,并尽量使用当前位于前台的 Activity:

import android.app.Activity;
import android.text.TextUtils;
import android.util.Log;

import com.alipay.sdk.app.PayTask;
import com.unity3d.player.UnityPlayer;

public final class AlipayBridge {

    public static void pay(final String orderInfo) {
        final Activity activity = UnityPlayer.currentActivity;

        if (activity == null || TextUtils.isEmpty(orderInfo)) {
            UnityPlayer.UnitySendMessage(
                "PayManager",
                "OnAlipayResult",
                ""
            );
            return;
        }

        activity.runOnUiThread(() -> {
            new Thread(() -> {
                try {
                    PayTask payTask = new PayTask(activity);
                    String result = payTask.pay(orderInfo, true);

                    Log.d("AlipayBridge", "pay result: " + result);

                    UnityPlayer.UnitySendMessage(
                        "PayManager",
                        "OnAlipayResult",
                        result == null ? "" : result
                    );
                } catch (Throwable throwable) {
                    Log.e("AlipayBridge", "Failed to invoke Alipay", throwable);

                    UnityPlayer.UnitySendMessage(
                        "PayManager",
                        "OnAlipayResult",
                        ""
                    );
                }
            }).start();
        });
    }
}

具体应在哪个线程调用,仍需以当前接入的支付宝 SDK 文档为准。务必保留异常日志,否则启动失败、系统拦截和用户取消都可能被归入同一个空字符串结果,难以继续排查。

Unity 侧不要直接把空字符串当作取消支付

using UnityEngine;

public class PayManager : MonoBehaviour
{
    public void OnAlipayResult(string result)
    {
        if (string.IsNullOrWhiteSpace(result))
        {
            Debug.LogError(
                "支付宝返回为空:可能是系统拦截、支付宝未安装、调用异常或用户取消"
            );
            return;
        }

        Debug.Log("支付宝原始回调:" + result);

        // 客户端结果仅用于展示支付状态。
        // 最终支付结果应由服务端通过支付宝异步通知或主动查询确认。
    }
}

空字符串无法准确说明支付失败的原因,也不能直接视为“用户取消”。

仍然无法调起时的排查方法

可以通过 adb logcat 查看点击支付按钮前后的系统日志:

adb logcat | grep -iE "alipay|ActivityTaskManager|ActivityManager|SecurityException|Background"

重点检查日志中是否出现以下情况:

  • 后台启动 Activity 被禁止;
  • 出现 SecurityException;
  • 没有应用可以处理支付 Intent;
  • 支付宝未安装或其包不可见;
  • Unity 当前的 Activity 已被销毁或不在前台;
  • 支付 SDK 内部抛出异常。

如果应用带有“检测支付宝是否安装”的逻辑,在 Android 11 及以上版本中还需处理包可见性配置。可以根据实际使用的支付宝包名,在 AndroidManifest.xml 中声明查询能力:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <queries>
        <package android:name="com.eg.android.AlipayGphone" />
    </queries>

    <application>
        <!-- 应用配置 -->
    </application>
</manifest>

<queries> 主要影响安装状态查询,不一定能解决 MIUI 对界面启动的拦截。具体原因仍需结合日志判断。

注意事项

  • “关闭 MIUI 优化”可以用于临时验证问题,但不适合成为正式解决方案。
  • 不要要求所有用户手动关闭系统安全功能。正式发布时,应用应在检测到调起失败后提供清晰的权限设置指引。
  • 确认所用支付宝 SDK 与当前 Android targetSdkVersion 兼容。
  • 不要只根据客户端回调判断交易成功,最终支付状态应由服务端验签并查询。
  • 如果开启“后台弹出界面”后问题仍未解决,应根据 logcat 中的实际异常继续排查,不能只凭机型认定是 MIUI 权限导致的。

备注:内容仅供参考。