Flutter网页视图集成Iamport支付插件iamport_webview_flutter的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter网页视图集成Iamport支付插件iamport_webview_flutter的使用

在Flutter应用中集成Iamport支付插件iamport_webview_flutter,可以方便地实现网页视图内的支付功能。本文将详细介绍如何配置和使用该插件。

安装依赖

首先,在项目的pubspec.yaml文件中添加iamport_webview_flutter依赖:

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

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

配置Android平台视图

为了在Android平台上正确地嵌入WebView,需要启用Hybrid Composition。在initState()方法中设置:

import 'dart:io';

import 'package:iamport_webview_flutter/iamport_webview_flutter.dart';

class WebViewExample extends StatefulWidget {
  [@override](/user/override)
  WebViewExampleState createState() => WebViewExampleState();
}

class WebViewExampleState extends State<WebViewExample> {
  [@override](/user/override)
  void initState() {
    super.initState();
    if (Platform.isAndroid) {
      IamportWebView.platform = SurfaceAndroidWebView();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Iamport WebView Example'),
      ),
      body: IamportWebView(
        initialUrl: 'https://example.com/payment',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (IamportWebViewController webViewController) {
          // WebView创建完成后的回调
        },
        onPageStarted: (String url) {
          print('Page started loading: $url');
        },
        onPageFinished: (String url) {
          print('Page finished loading: $url');
        },
      ),
    );
  }
}

确保在build.gradle文件中设置最低API级别为19:

android {
    defaultConfig {
        minSdkVersion 19
    }
}

使用示例

以下是一个完整的示例代码,展示了如何在Flutter应用中集成Iamport支付插件:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:iamport_webview_flutter/iamport_webview_flutter.dart';

void main() => runApp(MaterialApp(home: WebViewExample()));

class WebViewExample extends StatefulWidget {
  [@override](/user/override)
  _WebViewExampleState createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<WebViewExample> {
  final Completer<IamportWebViewController> _controller = Completer<IamportWebViewController>();

  [@override](/user/override)
  void initState() {
    super.initState();
    if (Platform.isAndroid) {
      IamportWebView.platform = SurfaceAndroidWebView();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Iamport WebView Example'),
        actions: <Widget>[
          NavigationControls(_controller.future),
        ],
      ),
      body: Builder(builder: (BuildContext context) {
        return IamportWebView(
          initialUrl: 'https://example.com/payment',
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (IamportWebViewController webViewController) {
            _controller.complete(webViewController);
          },
          onProgress: (int progress) {
            print("WebView is loading (progress : $progress%)");
          },
          onPageStarted: (String url) {
            print('Page started loading: $url');
          },
          onPageFinished: (String url) {
            print('Page finished loading: $url');
          },
          gestureNavigationEnabled: true,
        );
      }),
      floatingActionButton: favoriteButton(),
    );
  }

  Widget favoriteButton() {
    return FutureBuilder<IamportWebViewController>(
        future: _controller.future,
        builder: (BuildContext context, AsyncSnapshot<IamportWebViewController> controller) {
          if (controller.hasData) {
            return FloatingActionButton(
              onPressed: () async {
                final String url = (await controller.data!.currentUrl())!;
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Favorited $url')),
                );
              },
              child: const Icon(Icons.favorite),
            );
          }
          return Container();
        });
  }
}

class NavigationControls extends StatelessWidget {
  const NavigationControls(this._webViewControllerFuture)
      : assert(_webViewControllerFuture != null);

  final Future<IamportWebViewController> _webViewControllerFuture;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FutureBuilder<IamportWebViewController>(
      future: _webViewControllerFuture,
      builder: (BuildContext context, AsyncSnapshot<IamportWebViewController> snapshot) {
        final bool webViewReady = snapshot.connectionState == ConnectionState.done;
        final IamportWebViewController controller = snapshot.data!;
        return Row(
          children: <Widget>[
            IconButton(
              icon: const Icon(Icons.arrow_back_ios),
              onPressed: !webViewReady
                  ? null
                  : () async {
                      if (await controller.canGoBack()) {
                        await controller.goBack();
                      } else {
                        ScaffoldMessenger.of(context).showSnackBar(
                          const SnackBar(content: Text("No back history item")),
                        );
                        return;
                      }
                    },
            ),
            IconButton(
              icon: const Icon(Icons.arrow_forward_ios),
              onPressed: !webViewReady
                  ? null
                  : () async {
                      if (await controller.canGoForward()) {
                        await controller.goForward();
                      } else {
                        ScaffoldMessenger.of(context).showSnackBar(
                          const SnackBar(content: Text("No forward history item")),
                        );
                        return;
                      }
                    },
            ),
            IconButton(
              icon: const Icon(Icons.replay),
              onPressed: !webViewReady
                  ? null
                  : () {
                      controller.reload();
                    },
            ),
          ],
        );
      },
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中集成iamport_webview_flutter插件以使用Iamport支付功能的代码案例。这个插件利用WebView来显示和交互Iamport的支付页面。

首先,确保你已经在pubspec.yaml文件中添加了iamport_webview_flutter依赖:

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

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

接下来,你需要配置你的Flutter项目以使用Iamport。以下是一个基本的实现步骤和代码示例:

  1. 配置Iamport的API密钥: 确保你已经从Iamport获得了API密钥,并将其安全地存储在你的应用中。

  2. 创建支付页面: 使用iamport_webview_flutter插件来创建一个WebView页面,加载Iamport的支付URL。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Iamport Payment Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PaymentScreen(),
    );
  }
}

class PaymentScreen extends StatefulWidget {
  @override
  _PaymentScreenState createState() => _PaymentScreenState();
}

class _PaymentScreenState extends State<PaymentScreen> {
  final IamportWebViewFlutterController _controller = IamportWebViewFlutterController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Iamport Payment'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                // 构建Iamport支付URL
                String impKey = '你的Iamport API密钥';
                String merchantUid = '你的商户订单号';
                String amount = '支付金额'; // 例如 '1000' 表示1000韩元
                String name = '商品名称';
                String desc = '商品描述';
                String url = Uri.encodeFull(
                  "https://api.iamport.kr/v1/payments/pgs?imp_key=$impKey&merchant_uid=$merchantUid&amount=$amount&name=$name&desc=$desc"
                );

                // 加载支付URL
                _controller.loadUrl(url);
              },
              child: Text('发起支付'),
            ),
            Expanded(
              child: IamportWebViewFlutter(
                controller: _controller,
                initialOptions: IamportWebViewFlutterOptions(
                  javascriptMode: JavascriptMode.unrestricted,
                ),
                onPageFinished: (String url) {
                  // 页面加载完成时的回调,可用于处理支付结果
                  print('支付页面加载完成: $url');
                },
                onNavigationStateChange: (IamportWebViewFlutterNavigationState change) {
                  // 导航状态改变时的回调,可用于处理支付完成后的跳转
                  if (change.url.contains('success')) {
                    // 支付成功处理逻辑
                    print('支付成功');
                    // 可以在这里关闭WebView或显示支付成功信息
                  } else if (change.url.contains('fail')) {
                    // 支付失败处理逻辑
                    print('支付失败');
                  }
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项:

  1. 安全性:确保你的Iamport API密钥不会被泄露。在生产环境中,避免在客户端代码中硬编码敏感信息。

  2. 支付结果处理:在实际应用中,你需要在onNavigationStateChange回调中处理支付成功或失败后的逻辑,比如关闭WebView,显示支付结果信息,或者向服务器发送支付结果通知。

  3. 错误处理:添加适当的错误处理逻辑,以处理WebView加载失败、网络错误等情况。

  4. 测试:在集成完成后,务必进行充分的测试,包括正常支付流程、取消支付、支付失败等情况。

  5. 用户体验:考虑在WebView上方或下方添加一些用户提示信息,比如加载中提示、支付成功或失败的提示等。

希望这个示例能帮助你在Flutter项目中成功集成Iamport支付插件!

回到顶部