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

Flutter WebView支付后回调:如何捕获Return URL查询参数

Flutter支付回调URL Scheme配置与参数处理

一、先配置自定义URL Scheme

要让支付完成后能跳回你的App,得先给App注册一个专属的URL Scheme:

  • iOS端:打开ios/Runner/Info.plist,添加以下配置:
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>myflutterpay</string> <!-- 换成你自己的Scheme,比如你的App英文名缩写 -->
    </array>
  </dict>
</array>
  • Android端:打开android/app/src/main/AndroidManifest.xml,在MainActivity标签内添加intent-filter:
<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="myflutterpay" /> <!-- 和iOS保持一致 -->
</intent-filter>

二、设置API请求的Return URL

调用支付API时,把redirection_url字段设为你的Scheme链接,示例如下:

{
"client_id": "abcd",
"redirection_url": "myflutterpay://payment/callback",
"amount": 300,
"order_id": "dsdsassddddddd3"
}

支付完成后,第三方支付系统会自动跳转到这个URL,并在后面拼接交易结果的查询参数(比如status=success&transaction_id=xxx)。

三、WebView内拦截回调跳转

在你已实现的WebView流程中,添加导航拦截逻辑,识别并处理回调URL:

WebView(
  initialUrl: paymentRedirectUrl, // API返回的支付页面URL
  navigationDelegate: (NavigationRequest request) {
    // 判断当前跳转URL是否属于我们的回调Scheme
    if (request.url.startsWith('myflutterpay://')) {
      // 拦截跳转,交给App内部处理回调参数
      _handlePaymentCallback(request.url);
      return NavigationDecision.prevent;
    }
    // 其他正常跳转放行
    return NavigationDecision.navigate;
  },
)

四、解析回调参数并处理业务逻辑

实现_handlePaymentCallback方法,提取URL里的交易参数并处理:

void _handlePaymentCallback(String callbackUrl) {
  final uri = Uri.parse(callbackUrl);
  // 提取查询参数,具体字段以支付API返回为准
  final transactionId = uri.queryParameters['transaction_id'];
  final paymentStatus = uri.queryParameters['status'];
  final orderId = uri.queryParameters['order_id'];

  // 根据支付状态执行对应逻辑
  if (paymentStatus == 'success') {
    // 支付成功:更新本地订单状态、弹窗提示用户、跳转到订单详情页等
  } else if (paymentStatus == 'failed') {
    // 支付失败:提示用户重新尝试、记录失败原因等
  } else {
    // 支付取消:返回订单列表或首页
  }
}

五、处理App从外部唤起的情况

如果用户支付时用了系统浏览器(而非WebView),支付完成后会直接唤起你的App,这时需要在App启动时检查启动URL:

@override
void initState() {
  super.initState();
  // 页面初始化完成后检查启动URL
  WidgetsBinding.instance.addPostFrameCallback((_) {
    _checkInitialCallbackUrl();
  });
}

void _checkInitialCallbackUrl() {
  final initialUri = Uri.base;
  // 判断是否是支付回调的Scheme链接
  if (initialUri.scheme == 'myflutterpay' && initialUri.path == '/payment/callback') {
    _handlePaymentCallback(initialUri.toString());
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:30:58