【已解决】Unity安卓接入APP支付后小米设备无法调起支付宝和RT
支付阿杰
结论
这个问题通常与支付宝支付参数或 Unity 回调逻辑无关,而是小米设备的 MIUI 安全策略阻止了应用打开支付宝界面。支付 SDK 无法启动外部 Activity 时,Unity 仍有可能收到回调,但回调内容是空字符串。
进入小米系统的应用权限设置,为当前应用开启“后台弹出界面”或名称相近的权限。重启应用并再次发起支付,通常可以恢复正常。
解决步骤
在小米手机中依次进入:
设置
→ 应用设置
→ 应用管理
→ 选择当前应用
→ 权限管理 / 其他权限
→ 允许“后台弹出界面”
不同版本的 MIUI 或 HyperOS 可能使用不同的菜单名称,例如“后台打开新界面”“显示弹出窗口”等。
修改权限后,按以下步骤重新测试:
- 完全结束当前应用和支付宝进程。
- 重新启动应用。
- 确认支付宝已经安装并且可以正常登录。
- 再次点击支付按钮。
如果开启权限后能够正常调起支付宝,基本可以确认问题来自小米系统的界面启动限制。
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 权限导致的。
备注:内容仅供参考。
