You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Android端如何强制在系统浏览器打开SBP支付链接并忽略DeepLink

解决方案:强制Android系统在浏览器打开SBP支付链接

针对你的场景,要避免第三方银行App通过DeepLink拦截SBP支付链接,确保链接在系统浏览器中打开,可以通过以下两种方式实现(基于Flutter的launchUrl API):

方法1:通过Flutter launchUrl的浏览器专属配置

直接在调用launchUrl时,指定浏览器启动模式为外部应用打开,并配置Intent标记限制仅浏览器处理:

import 'package:url_launcher/url_launcher.dart';

Future<void> launchSbpUrl(String url) async {
  final Uri uri = Uri.parse(url);
  if (await canLaunchUrl(uri)) {
    await launchUrl(
      uri,
      mode: LaunchMode.externalApplication,
      browserLaunchMode: BrowserLaunchMode.externalApplication,
      // 添加Intent标记,确保链接仅由浏览器处理
      webOnlyIntent: const Intent(
        action: Intent.actionView,
        categories: {Intent.categoryBrowsable},
      ),
    );
  }
}

关键参数说明:

  • mode: LaunchMode.externalApplication:强制启动外部应用,而非在当前App内的WebView打开。
  • browserLaunchMode: BrowserLaunchMode.externalApplication:明确要求使用系统默认浏览器打开链接,而非其他支持DeepLink的应用。
  • webOnlyIntent:针对Web链接添加Intent.categoryBrowsable,该类别仅浏览器应用会声明,能过滤掉银行App的DeepLink拦截。

方法2:指定系统浏览器包名(更彻底)

如果方法1仍有被拦截的情况,可以直接指定系统浏览器的包名,强制链接在指定浏览器中打开。以下是常见厂商的系统浏览器包名:

  • 谷歌Chrome:com.android.chrome
  • 三星浏览器:com.sec.android.app.sbrowser
  • 小米浏览器:com.android.browser
  • 华为浏览器:com.huawei.browser

实现代码如下:

import 'package:url_launcher/url_launcher.dart';

Future<void> launchSbpUrlInSystemBrowser(String url) async {
  final Uri uri = Uri.parse(url);
  // 优先尝试Chrome,若不存在则 fallback 到其他浏览器
  List<String> browserPackages = [
    "com.android.chrome",
    "com.sec.android.app.sbrowser",
    "com.android.browser"
  ];

  for (String package in browserPackages) {
    if (await canLaunchUrl(uri, mode: LaunchMode.externalApplication, webOnlyPackageName: package)) {
      await launchUrl(
        uri,
        mode: LaunchMode.externalApplication,
        webOnlyPackageName: package,
      );
      return;
    }
  }

  // 若指定浏览器都不存在,使用默认浏览器打开
  await launchUrl(
    uri,
    mode: LaunchMode.externalApplication,
    browserLaunchMode: BrowserLaunchMode.externalApplication,
  );
}

注意事项:

  • 针对Android 11及以上系统,若要检测浏览器是否存在,需在AndroidManifest.xml中添加权限或查询声明:
    • 方式1:添加全量查询权限
      <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
      
    • 方式2(更合规):声明允许查询的浏览器包名
      <queries>
        <package android:name="com.android.chrome" />
        <package android:name="com.sec.android.app.sbrowser" />
        <package android:name="com.android.browser" />
      </queries>
      

验证方式

测试时可先卸载所有支持SBP DeepLink的银行App,确认链接能正常打开浏览器;再安装银行App,测试是否不会被拦截,而是直接进入浏览器。

内容的提问来源于stack exchange,提问作者gregman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:23:41