Flutter统一支付接口插件swift_upi的使用

Flutter统一支付接口插件swift_upi的使用

获取开始

此项目是一个新的 Flutter 插件项目,用于在 Android 和/或 iOS 平台上实现特定的平台特定代码。

对于 Flutter 开发的帮助,您可以查看官方文档,其中提供了教程、示例、移动开发指南以及完整的 API 参考。

示例代码

以下是使用 swift_upi 插件的基本示例:

import 'dart:developer';
import 'dart:io';

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

import 'package:flutter/services.dart';
import 'package:swift_upi/swift_upi.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  String _platformVersionCode = '0';
  final _swiftUpiPlugin = SwiftUpi();
  List<dynamic> upiApps = [];
  bool isLoading = true;

  String txnId = 'N/A';
  String responseCode = 'N/A';
  String txnRef = 'N/A';
  String status = 'N/A';
  String recUpiId = '9988776655[@ybl](/user/ybl)';

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

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用一个 try/catch 来捕获 PlatformException。
    // 我们还处理了消息可能返回 null 的情况。
    try {
      platformVersion = await _swiftUpiPlugin.getPlatformVersion() ?? '未知平台版本';
      setState(() {
        _platformVersionCode = platformVersion.split(' ')[1].split('.')[0];
      });
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果小部件从树中被移除,而异步平台消息正在飞行中,我们希望丢弃回复而不是调用 setState 更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  // Future<void> fetchUpiApps() async {
  //   try {
  //     final List<dynamic> apps = await _swiftUpiPlugin.getAllUpiApps();
  //     // 处理 UPI 应用程序列表
  //     setState(() {
  //       upiApps = apps; // 使用应用程序列表更新状态
  //       isLoading = false; // 设置加载为 false
  //     });
  //     for (var app in apps) {
  //       log('应用名称: ${app['name']}, 包名: ${app['packageName']}', name: 'UPI 应用');
  //     }
  //   } on PlatformException catch (e) {
  //     // log("获取 UPI 应用失败: '${e.message}'.", name: '权限');
  //     log("获取 UPI 应用失败: '${e.message}', 错误码: '${e.code}'.", name: '权限');
  //     setState(() {
  //       isLoading = false; // 即使出现错误也要更新加载状态
  //     });
  //   }
  // }

  Future<void> _getInstalledUpiApps() async {
    final List<dynamic> apps = await _swiftUpiPlugin.getAllUpiApps();
    setState(() {
      upiApps = apps;
      isLoading = false;
    });
    for (var app in apps) {
      log('应用名称: ${app['name']}, 包名: ${app['packageName']}', name: 'UPI 应用');
    }
  }

  void _openUpiApp(String packageName) async {
    try {
      final String? result = await _swiftUpiPlugin.launchUpiApp(packageName);
      print(result); // 处理成功信息
    } on PlatformException catch (e) {
      print("启动应用失败: '${e.message}'.");
    }
  }

  // 新方法来启动交易
  void _startTransaction({
    required String recUpiId,
    required String recName,
    required String txnRefId,
    required String txnNote,
    required String amt,
    required String app,
  }) async {
    Map<String, String> resultMap = {};

    try {
      final result = await _swiftUpiPlugin.startTransaction(
        merchantId: '123',
        currency: 'INR',
        url: 'https://domain.in',

        receiverUpiId: recUpiId,
        // 替换为实际接收者的 UPI ID
        receiverName: recName,
        // 替换为实际接收者的姓名
        transactionRefId: txnRefId,
        // 替换为唯一的交易参考 ID(可选)
        transactionNote: txnNote,
        // 替换为交易说明(可选)
        amount: amt,
        // 金额(以印度卢比为单位)
        app: app, // 货币(默认为 INR,可选)
      );

      if (result != null) {
        log(result, name: '交易结果');
        // String modifiedResult = result!.replaceAll('&amp;', '\t');
        // log(modifiedResult, name: '交易结果');

        // 将结果字符串拆分为键值对
        List<String> params = result.split('&amp;');
        for (String param in params) {
          List<String> keyValue = param.split('=');
          if (keyValue.length == 2) {
            resultMap[keyValue[0]] = keyValue[1];
          }
        }

        // 提取映射中的值
        setState(() {
          txnId = resultMap['txnId'] ?? 'N/A';
          responseCode = resultMap['responseCode'] ?? 'N/A';
          txnRef = resultMap['txnRef'] ?? 'N/A';
          status = resultMap['Status'] ?? 'N/A';
        });

        // 记录值
        log('交易 ID: $txnId', name: '交易详情');
        log('响应代码: $responseCode', name: '交易详情');
        log('交易参考: $txnRef', name: '交易详情');
        log('状态: $status', name: '交易详情');
      }
    } on PlatformException catch (e) {
      print("启动交易失败: '${e.message}'.");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: const Text(
            'Swift UPI 插件 - 示例应用',
            style: TextStyle(
              fontSize: 16,
              fontFamily: 'monospace',
              fontWeight: FontWeight.w600,
            ),
          ),
        ),
        body: Column(
          children: [
            Text('运行于: $_platformVersion\n'),
            Text('付款至: $recUpiId\n'),
            isLoading
                ? const Center(
                    child: CircularProgressIndicator(),
                  )
                : SizedBox(
                    height: MediaQuery.of(context).size.height * 0.125,
                    child: ListView.builder(
                      itemCount: upiApps.length,
                      shrinkWrap: true,
                      scrollDirection: Axis.horizontal,
                      itemBuilder: (context, index) {
                        return SizedBox(
                          width: MediaQuery.of(context).size.width * 0.25,
                          child: Column(
                            children: [
                              InkWell(
                                onTap: () {
                                  _startTransaction(
                                    recUpiId: recUpiId,
                                    recName: 'UPI 测试',
                                    txnRefId: 'TXN123QWER',
                                    txnNote: '检查',
                                    amt: '1.0',
                                    app: upiApps[index]['packageName'],
                                  );
                                },
                                child: _buildAppIcon(
                                  upiApps[index]['icon'],
                                ),
                              ),
                              const SizedBox(height: 8),
                              Text(upiApps[index]['name'])
                            ],
                          ),
                        );
                      },
                    ),
                  ),
            const Spacer(),
            Card(
              elevation: 4,
              margin: const EdgeInsets.all(24),
              child: Container(
                width: double.infinity,
                padding: const EdgeInsets.all(16),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Column(
                      children: [
                        const Text(
                          '交易 ID',
                          style: TextStyle(fontWeight: FontWeight.bold),
                        ),
                        const SizedBox(height: 8),
                        Text(txnId),
                        const SizedBox(height: 8),
                        const Divider(),
                      ],
                    ),
                    Column(
                      children: [
                        const Text(
                          '响应代码',
                          style: TextStyle(fontWeight: FontWeight.bold),
                        ),
                        const SizedBox(height: 8),
                        Text(responseCode),
                        const SizedBox(height: 8),
                        const Divider(),
                      ],
                    ),
                    Column(
                      children: [
                        const Text(
                          '交易参考',
                          style: TextStyle(fontWeight: FontWeight.bold),
                        ),
                        const SizedBox(height: 8),
                        Text(txnRef),
                        const SizedBox(height: 8),
                        const Divider(),
                      ],
                    ),
                    Column(
                      children: [
                        const Text(
                          '状态',
                          style: TextStyle(fontWeight: FontWeight.bold),
                        ),
                        const SizedBox(height: 8),
                        Text(status),
                        const SizedBox(height: 8),
                      ],
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// 辅助函数用于从字节数组构建应用图标
Widget _buildAppIcon(dynamic iconData) {
  return Image.memory(
    Uint8List.fromList(iconData), // 将字节数组转换为 Uint8List
    width: 40, // 设置所需宽度
    height: 40, // 设置所需高度
    fit: BoxFit.cover, // 设置盒模型适配
  );
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中集成并使用 swift_upi 插件以实现统一支付接口(Unified Payment Interface)的示例代码。swift_upi 是一个假设的插件名称,实际使用时你可能需要查找具体的Flutter插件名称并参考其官方文档。不过,下面的示例将展示一个典型的集成和使用流程。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 swift_upi 插件的依赖。请注意,你需要替换 swift_upi 为实际的插件名称。

dependencies:
  flutter:
    sdk: flutter
  swift_upi: ^x.y.z  # 替换为实际版本号

然后运行 flutter pub get 来获取依赖。

2. 配置原生代码(如果需要)

某些Flutter插件可能需要在iOS和Android的原生代码中进行额外的配置。请查看 swift_upi 插件的官方文档以获取这些步骤。

3. 导入插件并初始化

在你的 Dart 代码中,导入 swift_upi 插件并进行初始化。

import 'package:flutter/material.dart';
import 'package:swift_upi/swift_upi.dart';  // 假设插件名为swift_upi

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Unified Payment Interface Example'),
        ),
        body: PaymentScreen(),
      ),
    );
  }
}

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

class _PaymentScreenState extends State<PaymentScreen> {
  late final SwiftUpiPlugin _swiftUpi;

  @override
  void initState() {
    super.initState();
    _swiftUpi = SwiftUpiPlugin();
    // 可以在这里进行插件的初始化,例如配置API密钥等
    // _swiftUpi.initialize(...);
  }

  void _makePayment() async {
    try {
      // 假设支付请求的参数包括金额、支付描述等
      final paymentResponse = await _swiftUpi.makePayment(
        amount: 100.0,  // 支付金额
        description: 'Test Payment',  // 支付描述
        // 其他可能的参数,例如currency, paymentMethod等
      );

      if (paymentResponse.success) {
        // 支付成功处理
        print('Payment successful!');
      } else {
        // 支付失败处理
        print('Payment failed: ${paymentResponse.errorMessage}');
      }
    } catch (e) {
      // 错误处理
      print('An error occurred: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: _makePayment,
        child: Text('Make Payment'),
      ),
    );
  }
}

4. 处理支付响应

在上面的代码中,_makePayment 方法会调用 _swiftUpi.makePayment 来发起支付请求,并处理支付响应。这只是一个基本的示例,实际的插件可能有更多的参数和更复杂的响应结构,请参考插件的官方文档。

5. 运行应用

确保所有配置正确后,运行你的Flutter应用,并测试支付功能。

flutter run

注意事项

  • 插件版本:确保你使用的是最新版本的插件,并查看其更新日志以获取最新的功能和修复。
  • 错误处理:在实际应用中,添加更多的错误处理和用户反馈。
  • 安全性:不要在客户端代码中硬编码敏感信息,如API密钥等。

由于 swift_upi 是一个假设的插件名称,因此你需要找到并使用实际的Flutter支付插件,并根据其官方文档进行集成。

回到顶部