Flutter支付集成插件midtrans_plugin的使用
Flutter支付集成插件midtrans_plugin的使用
Midtrans 插件
引言
此插件用于将Midtrans支付网关集成到您的Flutter应用中。Midtrans是一家基于技术的金融服务公司,提供印度尼西亚的支付网关服务。它支持多种在线支付方式,并提供资金转账(放款)功能,使客户在业务交易中更加便捷,并专注于发展业务。
功能
- 无缝集成Midtrans支付网关。
- 可定制的支付方式和配置选项。
- 安全处理交易以保护用户敏感数据。
- 易于使用的API来发起和管理交易。
安装
要使用此插件,请遵循以下步骤:
-
添加依赖:在您的
pubspec.yaml
文件中添加以下行:dependencies: midtrans_plugin: <latest_version>
-
安装包:在终端中运行以下命令:
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 && !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() => _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 && transactionID.isNotEmpty) {
message += 'transactionID: $transactionID';
}
if (status != null && 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
更多关于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.xml
和Info.plist
文件,以及可能需要在MainActivity.kt
或AppDelegate.swift
中添加一些代码来处理支付回调。具体配置请参考Midtrans官方文档。
3. 处理支付回调
支付完成后,Midtrans通常会通过URL Scheme回调到你的应用。你需要在你的应用中处理这个回调,并根据支付结果更新UI或执行相应的逻辑。这通常涉及到在MainActivity.kt
或AppDelegate.swift
中添加代码来解析回调URL并调用Flutter端的逻辑。
由于这部分代码因项目而异,且涉及到原生代码,这里不给出具体示例。但你可以参考Midtrans官方文档或Flutter插件的README文件来了解如何处理支付回调。
请确保在实际项目中仔细阅读并遵循Midtrans官方文档,以确保支付流程的安全性和可靠性。