Flutter支付集成插件midtrans_plugin的使用

Flutter支付集成插件midtrans_plugin的使用

Midtrans 插件

引言

此插件用于将Midtrans支付网关集成到您的Flutter应用中。Midtrans是一家基于技术的金融服务公司,提供印度尼西亚的支付网关服务。它支持多种在线支付方式,并提供资金转账(放款)功能,使客户在业务交易中更加便捷,并专注于发展业务。

功能

  • 无缝集成Midtrans支付网关。
  • 可定制的支付方式和配置选项。
  • 安全处理交易以保护用户敏感数据。
  • 易于使用的API来发起和管理交易。

安装

要使用此插件,请遵循以下步骤:

  1. 添加依赖:在您的pubspec.yaml文件中添加以下行:

    dependencies:
      midtrans_plugin: <latest_version>
    
  2. 安装包:在终端中运行以下命令:

    flutter pub get
    

使用方法

1. 导入插件

import 'package:midtrans_plugin/midtrans_plugin.dart';

2. 初始化Midtrans

String merchantClientKey = 'clientKeySandbox';
String merchantUrl = 'merchantUrlSandbox';

if (!kDebugMode && !kProfileMode) {
    merchantClientKey = 'clientKeyProd';
    merchantUrl = 'merchantUrlProd';
}

final config = MidtransConfig(
    merchantClientKey: merchantClientKey,
    merchantUrl: merchantUrl,
);

await MidtransPlugin.initialize(config);

3. 发起交易

try {
    final transactionDetails = TransactionDetails(
        orderId: 'ORDER-${DateTime.now().millisecondsSinceEpoch}',
        grossAmount: 10.0,
    );

    final itemDetails = [
        ItemDetail(
            id: 'product_a',
            price: 10.0,
            quantity: 1,
            name: '产品A',
        )
    ];

    final customerDetails = CustomerDetails(
        firstName: 'John',
        lastName: 'Doe',
        email: 'john@example.com',
        phone: '08123456789',
        billingAddress: BillingAddress(
            firstName: 'John',
            lastName: 'Doe',
            address: 'Jl. Buntu No. 2',
            city: '雅加达',
            phone: '08123456789',
            postalCode: '112233',
        ),
    );

    await MidtransPlugin.instance.startPayment(
        MidtransPayload(
            transactionDetails: transactionDetails,
            itemDetails: itemDetails,
            customerDetails: customerDetails,
        ),
    );

} catch (e) {
    print('发生错误 $e');
}

4. 处理支付结果

MidtransPlugin.onTransactionResult.listen((result) {
    print('[transactionResult] $result');
});

示例代码

import 'dart:async';
import 'dart:developer';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:midtrans_plugin/midtrans_plugin.dart';
import 'package:midtrans_plugin/models/midtrans_config.dart';
import 'package:midtrans_plugin/models/midtrans_payload.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  String merchantClientKey = 'clientKeySandbox';
  String merchantUrl = 'merchantUrlSandbox';
  if (!kDebugMode &amp;&amp; !kProfileMode) {
    merchantClientKey = 'clientKeyProd';
    merchantUrl = 'merchantUrlProd';
  }

  final config = MidtransConfig(
    merchantClientKey: merchantClientKey,
    merchantUrl: merchantUrl,
    paymentTypeConfig: PaymentTypeConfig.twoClickPayment,
  );

  await MidtransPlugin.initialize(config);

  runApp(const MyApp());
}

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

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

class _MyAppState extends State<MyApp> {
  String _message = '';
  bool _isLoading = false;

  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

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

    MidtransPlugin.onTransactionResult.listen((result) {
      log('[transactionResult] $result');
      final transactionID = result.transactionId;
      final status = result.transactionStatus;

      String message = '';
      if (result.isCanceled) message = '已取消';

      if (result.isFailed) message = '支付失败';

      if (transactionID != null &amp;&amp; transactionID.isNotEmpty) {
        message += 'transactionID: $transactionID';
      }
      if (status != null &amp;&amp; status.isNotEmpty) message += ' $status';

      ScaffoldMessenger.of(_scaffoldKey.currentContext!).showSnackBar(
        SnackBar(content: Text(message)),
      );
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        key: _scaffoldKey,
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              if (_message.isNotEmpty) Text(_message),
              if (_isLoading)
                const CircularProgressIndicator.adaptive()
              else
                ElevatedButton(
                  onPressed: () async {
                    setState(() {
                      _isLoading = true;
                      _message = '';
                    });

                    try {
                      final transactionDetails = TransactionDetails(
                        orderId:
                            'ORDER-${DateTime.now().millisecondsSinceEpoch}',
                        grossAmount: 10.0,
                      );

                      final itemDetails = [
                        ItemDetail(
                          id: 'product_a',
                          price: 10.0,
                          quantity: 1,
                          name: '产品A',
                        )
                      ];

                      final customerDetails = CustomerDetails(
                        firstName: 'John',
                        lastName: 'Doe',
                        email: 'john@example.com',
                        phone: '08123456789',
                        billingAddress: BillingAddress(
                          firstName: 'John',
                          lastName: 'Doe',
                          address: 'Jl. Buntu No. 2',
                          city: '雅加达',
                          phone: '08123456789',
                          postalCode: '112233',
                        ),
                      );

                      await MidtransPlugin.instance.startPayment(
                        MidtransPayload(
                          transactionDetails: transactionDetails,
                          itemDetails: itemDetails,
                          customerDetails: customerDetails,
                        ),
                      );

                      setState(() {
                        _isLoading = false;
                      });
                    } catch (e) {
                      log('发生错误', error: e);
                      setState(() {
                        _isLoading = false;
                        _message = '无法支付';
                      });
                    }
                  },
                  child: const Text('支付'),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中集成并使用midtrans_plugin进行支付的示例代码。请注意,实际项目中可能需要根据具体需求进行调整,并且确保你已经遵循了Midtrans的官方文档进行了相关的配置。

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

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

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

接下来,在你的Flutter项目中,你需要进行以下步骤来集成Midtrans支付:

1. 初始化Midtrans插件

在你的主应用文件(通常是main.dart)或者需要集成支付的页面文件中,首先导入midtrans_plugin包,并进行初始化。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final MidtransPlugin _midtransPlugin = MidtransPlugin();

  @override
  void initState() {
    super.initState();
    // 初始化Midtrans插件(假设你已经在Midtrans后台配置了client_key)
    _midtransPlugin.init(
      clientKey: '你的Client Key', // 替换为你的Midtrans Client Key
      isProduction: false, // 如果是生产环境,设置为true
    );
  }

  void _startPayment() async {
    try {
      // 构建支付请求数据
      final Map<String, dynamic> paymentData = {
        'gross_amount': 100000, // 支付金额,单位为印尼卢比(Rupiah)
        'currency': 'IDR',
        'item_details': [
          {
            'id': 'item1',
            'price': 100000,
            'quantity': 1,
            'name': 'Test Item',
          },
        ],
        'user_details': {
          'first_name': 'John',
          'last_name': 'Doe',
          'email': 'john.doe@example.com',
          'phone': '081234567890',
        },
      };

      // 发起支付请求
      final Map<String, dynamic> response = await _midtransPlugin.startPayment(paymentData);
      
      // 处理支付响应
      if (response['status'] == 'success') {
        print('支付成功');
        // 更新UI或处理支付成功后的逻辑
      } else if (response['status'] == 'pending') {
        print('支付待确认');
        // 处理待确认支付逻辑
      } else {
        print('支付失败: ${response['message'] ?? '未知错误'}');
        // 处理支付失败逻辑
      }
    } catch (e) {
      print('支付过程中发生错误: $e');
      // 处理异常
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Midtrans Payment Integration'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _startPayment,
          child: Text('发起支付'),
        ),
      ),
    );
  }
}

2. Android和iOS配置

确保你已经在Android和iOS项目中配置了必要的权限和URL Scheme。这通常涉及修改AndroidManifest.xmlInfo.plist文件,以及可能需要在MainActivity.ktAppDelegate.swift中添加一些代码来处理支付回调。具体配置请参考Midtrans官方文档。

3. 处理支付回调

支付完成后,Midtrans通常会通过URL Scheme回调到你的应用。你需要在你的应用中处理这个回调,并根据支付结果更新UI或执行相应的逻辑。这通常涉及到在MainActivity.ktAppDelegate.swift中添加代码来解析回调URL并调用Flutter端的逻辑。

由于这部分代码因项目而异,且涉及到原生代码,这里不给出具体示例。但你可以参考Midtrans官方文档或Flutter插件的README文件来了解如何处理支付回调。

请确保在实际项目中仔细阅读并遵循Midtrans官方文档,以确保支付流程的安全性和可靠性。

回到顶部