Flutter支付集成插件bootpay_webview_flutter_android的使用

Flutter支付集成插件bootpay_webview_flutter_android的使用

在本教程中,我们将学习如何在Flutter应用中使用bootpay_webview_flutter_android插件进行支付集成。该插件基于webview_flutter,可以方便地在Flutter应用中嵌入网页并实现各种功能,包括支付。

使用步骤

1. 添加依赖

首先,在你的pubspec.yaml文件中添加bootpay_webview_flutter_android依赖:

dependencies:
  flutter:
    sdk: flutter
  bootpay_webview_flutter_android: ^版本号

然后运行flutter pub get来安装依赖。

2. 创建一个简单的Flutter应用

我们将创建一个简单的Flutter应用,并在其中集成支付功能。以下是一个完整的示例代码:

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:bootpay_webview_flutter_android/bootpay_webview_flutter_android.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: WebViewExample(),
    );
  }
}

class WebViewExample extends StatefulWidget {
  const WebViewExample({super.key});

  [@override](/user/override)
  State<WebViewExample> createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<WebViewExample> {
  late final PlatformWebViewController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();

    _controller = PlatformWebViewController(
      AndroidWebViewControllerCreationParams(),
    )
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x80000000))
      ..setPlatformNavigationDelegate(
        PlatformNavigationDelegate(
          const PlatformNavigationDelegateCreationParams(),
        )
          ..setOnProgress((int progress) {
            debugPrint('WebView is loading (progress : $progress%)');
          })
          ..setOnPageStarted((String url) {
            debugPrint('Page started loading: $url');
          })
          ..setOnPageFinished((String url) {
            debugPrint('Page finished loading: $url');
          })
          ..setOnWebResourceError((WebResourceError error) {
            debugPrint('''
Page resource error:
  code: ${error.errorCode}
  description: ${error.description}
  errorType: ${error.errorType}
  isForMainFrame: ${error.isForMainFrame}
          ''');
          })
          ..setOnNavigationRequest((NavigationRequest request) {
            if (request.url.startsWith('https://www.youtube.com/')) {
              debugPrint('blocking navigation to ${request.url}');
              return NavigationDecision.prevent;
            }
            debugPrint('allowing navigation to ${request.url}');
            return NavigationDecision.navigate;
          })
          ..setOnUrlChange((UrlChange change) {
            debugPrint('url change to ${change.url}');
          }),
      )
      ..setOnJavaScriptAlertDialog((JavaScriptAlertDialogRequest request) async {
        await _showAlert(context, request.message);
      })
      ..setOnJavaScriptConfirmDialog(
        (JavaScriptConfirmDialogRequest request) async {
          final bool result = await _showConfirm(context, request.message);
          return result;
        }
      )
      ..setOnJavaScriptTextInputDialog(
        (JavaScriptTextInputDialogRequest request) async {
          final String result = await _showTextInput(context, request.message, request.defaultText);
          return result;
        }
      )
      ..addJavaScriptChannel(JavaScriptChannelParams(
        name: 'Toaster',
        onMessageReceived: (JavaScriptMessage message) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text(message.message)),
          );
        },
      ))
      ..setOnPlatformPermissionRequest(
        (PlatformWebViewPermissionRequest request) {
          debugPrint(
            'requesting permissions for ${request.types.map((WebViewPermissionResourceType type) => type.name)}',
          );
          request.grant();
        },
      )
      ..loadRequest(LoadRequestParams(
        uri: Uri.parse('https://dev-js.bootapi.com/test/payment/'), // 这里填写你的支付页面URL
      ));
  }

  Future<void> _showAlert(BuildContext context, String message) async {
    return showDialog<void>(
      context: context,
      builder: (BuildContext ctx) {
        return AlertDialog(
          content: Text(message),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.of(ctx).pop();
              },
              child: const Text('OK'),
            ),
          ],
        );
      },
    );
  }

  Future<bool> _showConfirm(BuildContext context, String message) async {
    return await showDialog<bool>(
      context: context,
      builder: (BuildContext ctx) {
        return AlertDialog(
          content: Text(message),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.of(ctx).pop(false);
              },
              child: const Text('Cancel'),
            ),
            TextButton(
              onPressed: () {
                Navigator.of(ctx).pop(true);
              },
              child: const Text('OK'),
            ),
          ],
        );
      },
    ) ?? false;
  }

  Future<String> _showTextInput(BuildContext context, String message, String? defaultText) async {
    return await showDialog<String>(
      context: context,
      builder: (BuildContext ctx) {
        return AlertDialog(
          content: Text(message),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.of(ctx).pop('Text test');
              },
              child: const Text('Enter'),
            ),
          ],
        );
      },
    ) ?? '';
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter WebView example'),
        actions: <Widget>[
          NavigationControls(webViewController: _controller),
        ],
      ),
      body: PlatformWebViewWidget(
        PlatformWebViewWidgetCreationParams(controller: _controller),
      ).build(context),
      floatingActionButton: favoriteButton(),
    );
  }

  Widget favoriteButton() {
    return FloatingActionButton(
      onPressed: () async {
        final String? url = await _controller.currentUrl();
        if (context.mounted) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Favorited $url')),
          );
        }
      },
      child: const Icon(Icons.favorite),
    );
  }
}

class NavigationControls extends StatelessWidget {
  const NavigationControls({super.key, required this.webViewController});

  final PlatformWebViewController webViewController;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        IconButton(
          icon: const Icon(Icons.arrow_back_ios),
          onPressed: () async {
            if (await webViewController.canGoBack()) {
              await webViewController.goBack();
            } else {
              if (context.mounted) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(content: Text('No back history item')),
                );
              }
            }
          },
        ),
        IconButton(
          icon: const Icon(Icons.arrow_forward_ios),
          onPressed: () async {
            if (await webViewController.canGoForward()) {
              await webViewController.goForward();
            } else {
              if (context.mounted) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(content: Text('No forward history item')),
                );
              }
            }
          },
        ),
        IconButton(
          icon: const Icon(Icons.replay),
          onPressed: () => webViewController.reload(),
        ),
      ],
    );
  }
}

更多关于Flutter支付集成插件bootpay_webview_flutter_android的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter支付集成插件bootpay_webview_flutter_android的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用bootpay_webview_flutter_android插件来进行支付的示例代码。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加bootpay_webview_flutter_android依赖:

dependencies:
  flutter:
    sdk: flutter
  bootpay_webview_flutter_android: ^最新版本号 # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

2. 配置AndroidManifest.xml

确保你的AndroidManifest.xml文件中已经配置了必要的权限和Activity,通常这个插件的README文件会提供详细的配置信息。以下是一个示例配置:

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

    <application
        ... >
        <activity
            android:name=".MainActivity"
            ... >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 其他Activity配置 -->
    </application>

    <!-- 添加必要的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

3. 初始化并调用支付

在你的Flutter代码中,你可以按照以下步骤初始化并使用Bootpay进行支付:

import 'package:flutter/material.dart';
import 'package:bootpay_webview_flutter_android/bootpay_webview_flutter_android.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Bootpay Payment Integration'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _startPayment,
            child: Text('Start Payment'),
          ),
        ),
      ),
    );
  }

  void _startPayment() async {
    // Bootpay配置信息,请根据实际情况替换
    final BootpayConfig config = BootpayConfig(
      appKey: '你的Bootpay App Key',
      name: '你的应用名称',
      totalAmount: 1000, // 金额,单位:韩元(如果使用其他货币,请参考Bootpay文档)
      currency: 'KRW', // 货币代码
      // 其他可选配置
    );

    try {
      final result = await BootpayWebviewFlutterAndroid.startPayment(config);
      print('支付结果: $result');
      // 根据支付结果进行相应的处理
      if (result['status'] == 'success') {
        // 支付成功处理
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('支付成功')),
        );
      } else {
        // 支付失败处理
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('支付失败: ${result['message']}')),
        );
      }
    } catch (e) {
      // 错误处理
      print('支付过程中发生错误: $e');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('支付过程中发生错误')),
      );
    }
  }
}

注意事项

  1. 依赖版本:确保你使用的是最新版本的bootpay_webview_flutter_android插件,因为旧版本可能存在已知问题或不支持新功能。
  2. 支付配置:在调用支付之前,确保你已经在Bootpay后台正确配置了支付相关的参数,如应用密钥、回调URL等。
  3. 错误处理:在实际应用中,添加更详细的错误处理和用户提示,以提升用户体验。
  4. 测试环境:在上线之前,请在测试环境中充分测试支付流程,确保一切正常工作。

希望这个示例代码能帮助你成功集成Bootpay支付功能!

回到顶部