Flutter移动支付插件mpesa_sdk的使用

Flutter移动支付插件mpesa_sdk的使用

mpesa-sdk 是一个用于 VODACOM M-Pesa API(开放API)的 Dart 包,适用于坦桑尼亚、加纳和莱索托市场。该包提供了多种方法来实现移动支付功能。

功能

  • [√] C2B(从客户到商家)
  • [√] B2C(从商家到客户)
  • [√] B2B(从商家到商家)
  • [√] REVERSAL(交易撤销)
  • [√] TRANSACTION STATUS(交易状态查询)

开始使用

凭证

  1. Vodacom Developer Portal上创建一个账户。
  2. 注册你的应用。
  3. 获取你的密钥:apiKeypublicKey

使用

添加依赖

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

1 回复

更多关于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');
  }
}
回到顶部