Flutter移动支付插件mpesa_sdk的使用
Flutter移动支付插件mpesa_sdk的使用
mpesa-sdk
是一个用于 VODACOM M-Pesa API(开放API)的 Dart 包,适用于坦桑尼亚、加纳和莱索托市场。该包提供了多种方法来实现移动支付功能。
功能
- [√] C2B(从客户到商家)
- [√] B2C(从商家到客户)
- [√] B2B(从商家到商家)
- [√] REVERSAL(交易撤销)
- [√] TRANSACTION STATUS(交易状态查询)
开始使用
凭证
- 在Vodacom Developer Portal上创建一个账户。
- 注册你的应用。
- 获取你的密钥:
apiKey
和publicKey
。
使用
添加依赖
在 pubspec.yaml
文件中添加依赖:
dependencies:
mpesa_sdk: <latest_version>
导入包
在你的 Flutter 应用或纯 Dart 应用中导入:
import 'package:mpesa_sdk/mpesa_sdk.dart';
创建实例并使用方法
以下是一个完整的示例,展示了如何使用 mpesa_sdk
实现不同类型的交易:
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:mpesa_sdk/mpesa_sdk.dart';
void main() async {
// 替换为你的公钥和 API Key
String publicKey = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArv9yxA69XQKBo24BaF/D+fvlqmGdYjqLQ5WtNBb5tquqGvAvG3WMFETVUSow/LizQalxj2ElMVrUmzu5mGGkxK08bWEXF7a1DEvtVJs6nppIlFJc2SnrU14AOrIrB28ogm58JjAl5BOQawOXD5dfSk7MaAA82pVHoIqEu0FxA8BOKU+RGTihRU+ptw1j4bsAJYiPbSX6i71gfPvwHPYamM0bfI4CmlsUUR3KvCG24rB6FNPcRBhM3jDuv8ae2kC33w9hEq8qNB55uw51vK7hyXoAa+U7IqP1y6nBdlN25gkxEA8yrsl1678cspeXr+3ciRyqoRgj9RD/ONbJhhxFvt1cLBh+qwK2eqISfBb06eRnNeC71oBokDm3zyCnkOtMDGl7IvnMfZfEPFCfg5QgJVk1msPpRvQxmEsrX9MQRyFVzgy2CWNIb7c+jPapyrNwoUbANlN8adU1m6yOuoX7F49x+OjiG2se0EJ6nafeKUXw/+hiJZvELUYgzKUtMAZVTNZfT8jjb58j8GVtuS+6TM2AutbejaCV84ZK58E2CRJqhmjQibEUO6KPdD7oTlEkFy52Y1uOOBXgYpqMzufNPmfdqqqSM4dU70PO8ogyKGiLAIxCetMjjm6FCMEA3Kc8K0Ig7/XtFm9By6VxTJK1Mg36TlHaZKP6VzVLXMtesJECAwEAAQ==";
String apiKey = "eRJuTmYzqttBt4V39fEQSdnZrdLcU0N8";
final mpesa = Mpesa(
env: ENV.sandbox,
market: MarketCountry.vodacomTZN,
apiKey: apiKey,
publicKey: publicKey);
// C2B 交易
final res = await mpesa.c2b(
inputAmount: 1000,
inputCustomerMSISDN: "000000000001", // 客户电话号码
inputServiceProviderCode: "000000", // VODACOM 提供的代码
inputCountry: "TZN",
inputCurrency: "TZS",
inputThirdPartyConversationID: "asv02e5yy58774Z228d83d0d689761", // 唯一标识
inputTransactionReference: "T1Z774C", // 唯一标识
inputPurchasedItemsDesc: "BAG");
print("********C2B**********<<<<<${res?.getBody()}>>>>>**********************C2B********");
// B2C 交易
final res2 = await mpesa.b2c(
inputAmount: 1000,
inputCustomerMSISDN: "000000000001",
inputServiceProviderCode: "000000",
inputCountry: "TZN",
inputCurrency: "TZS",
inputThirdPartyConversationID: "as2v02e5yy58774P228d83d0d6897613444",
inputTransactionReference: "T1P7744",
inputPaymentItemsDesc: "SALARY PAYMENT");
print("********B2C**********<<<<<${res2?.getBody()}>>>>>**********************B2C********");
// B2B 交易
final res3 = await mpesa.b2b(
inputAmount: 1000,
inputReceiverPartyCode: "000001",
inputPrimaryPartyCode: "000000",
inputCountry: "TZN",
inputCurrency: "TZS",
inputThirdPartyConversationID: "as3v02e5yy587749028d83d0d68976155",
inputTransactionReference: "T1297755",
inputPaymentItemsDesc: "SALARY PAYMENT");
print("********B2B**********<<<<<${res3?.getBody()}>>>>>**********************B2B********");
// 交易撤销
final res4 = await mpesa.reversal(
inputReversalAmount: 25,
inputServiceProviderCode: "000000",
inputThirdPartyConversationID: "asv02e595804f7ba228d83d0d689777",
inputTransactionID: "0000000000001",
inputCountry: "TZN");
print("********REVERSAL**********<<<<<${res4?.getBody()}>>>>>**********************REVERSAL********");
// 查询交易状态
final res5 = await mpesa.getTransactionStatus(
inputQueryReference: "000000000000000000001",
inputServiceProviderCode: "000000",
inputThirdPartyConversationID: "asv02e5958774f7ba228d83d0d689761",
inputCountry: "TZN");
print("********Transaction Status**********<<<<<${res5?.getBody()}>>>>>**********************Transaction Status********");
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Scaffold(body: Text('Flutter Demo Home Page')),
);
}
}
更多关于Flutter移动支付插件mpesa_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter移动支付插件mpesa_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
mpesa_sdk
是一个用于在Flutter应用中集成M-Pesa支付功能的插件。M-Pesa 是肯尼亚和其他非洲国家广泛使用的一种移动支付服务。使用 mpesa_sdk
插件,你可以在Flutter应用中轻松实现M-Pesa支付功能。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 mpesa_sdk
插件的依赖:
dependencies:
flutter:
sdk: flutter
mpesa_sdk: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 配置插件
在使用 mpesa_sdk
之前,你需要进行一些配置。通常,这些配置包括M-Pesa API的认证信息、支付回调URL等。
import 'package:mpesa_sdk/mpesa_sdk.dart';
void configureMpesa() {
MpesaSDK.configure(
consumerKey: 'YOUR_CONSUMER_KEY',
consumerSecret: 'YOUR_CONSUMER_SECRET',
environment: MpesaEnvironment.sandbox, // 或 MpesaEnvironment.production
businessShortCode: 'YOUR_BUSINESS_SHORT_CODE',
passKey: 'YOUR_PASS_KEY',
callbackUrl: 'YOUR_CALLBACK_URL',
);
}
3. 发起支付请求
配置完成后,你可以使用 MpesaSDK
发起支付请求。以下是一个简单的示例:
void initiatePayment() async {
try {
final response = await MpesaSDK.initiatePayment(
phoneNumber: '254712345678', // 用户的手机号码
amount: 100.0, // 支付金额
accountReference: 'TestPayment', // 账户引用
transactionDesc: 'Payment for goods', // 交易描述
);
if (response.status == 'Success') {
print('Payment initiated successfully: ${response.transactionId}');
} else {
print('Payment initiation failed: ${response.errorMessage}');
}
} catch (e) {
print('Error initiating payment: $e');
}
}
4. 处理支付回调
M-Pesa 支付完成后,系统会向你在配置中指定的 callbackUrl
发送回调通知。你需要在服务器端处理这些回调,并更新订单状态。
5. 错误处理
在实际应用中,你可能会遇到各种错误,比如网络问题、认证失败等。确保在代码中正确处理这些错误,并向用户提供友好的错误提示。
6. 测试与发布
在开发阶段,你可以使用M-Pesa 的沙盒环境进行测试。确保在发布应用之前切换到生产环境,并使用真实的API密钥和配置。
7. 示例代码
以下是一个完整的示例代码,展示了如何配置和发起M-Pesa支付:
import 'package:flutter/material.dart';
import 'package:mpesa_sdk/mpesa_sdk.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('M-Pesa Payment Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
configureMpesa();
initiatePayment();
},
child: Text('Initiate Payment'),
),
),
),
);
}
}
void configureMpesa() {
MpesaSDK.configure(
consumerKey: 'YOUR_CONSUMER_KEY',
consumerSecret: 'YOUR_CONSUMER_SECRET',
environment: MpesaEnvironment.sandbox,
businessShortCode: 'YOUR_BUSINESS_SHORT_CODE',
passKey: 'YOUR_PASS_KEY',
callbackUrl: 'YOUR_CALLBACK_URL',
);
}
void initiatePayment() async {
try {
final response = await MpesaSDK.initiatePayment(
phoneNumber: '254712345678',
amount: 100.0,
accountReference: 'TestPayment',
transactionDesc: 'Payment for goods',
);
if (response.status == 'Success') {
print('Payment initiated successfully: ${response.transactionId}');
} else {
print('Payment initiation failed: ${response.errorMessage}');
}
} catch (e) {
print('Error initiating payment: $e');
}
}