Flutter移动支付插件flutter_mpesa_stk的使用

Flutter移动支付插件flutter_mpesa_stk的使用

一个Flutter插件,允许你通过daraja API轻松执行Lipa Na M-Pesa STK推送。

功能

Mpesa STK推送(目前仅支持通过PayBill进行)

开始使用

你可以从以下链接获取特定变量:

然后在Mpesa模拟页面获取MpesaExpress密码以用于STK推送。

  • STK密码

这些值用于使用Mpesa STK服务。

  • 消费者密钥
  • 消费者密钥
  • STK密码
  • 短代码
  • 回调URL

要了解更多关于Daraja的信息以及如何准备生产就绪的应用,请阅读此文档

使用示例

安装最新版本的包:

flutter pub get flutter_mpesa_stk

以下是一个使用mpesa stk的示例:

import 'package:flutter_mpesa_stk/flutter_mpesa_stk.dart';
import 'package:flutter_mpesa_stk/models/Mpesa.dart';
import 'package:flutter_mpesa_stk/models/MpesaResponse.dart';

// 这里替换为你的实际参数
String consumerKey = "your_consumer_key";
String consumerSecret = "your_consumer_secret";
String stkPassword = "your_stk_password";
String shortCode = "174379"; // 这个是测试用的PayBill
String callbackURL = "https://94f9-41-90-65-205.ngrok-free.app/api/secret-url/callback";

MpesaResponse response = await FlutterMpesaSTK(
  consumerKey,
  consumerSecret,
  stkPassword,
  shortCode,
  callbackURL,
  "default Message", // 可选参数
  env: "production" // 可选参数
).stkPush(
  Mpesa(
    100, // 金额
    "2547XXXXXXXXX", // 手机号码
    accountReference: "reference", // 可选参数
    transactionDesc: "description" // 可选参数
);

if (response.status) {
  // 响应体包含成功或失败的信息
  print(response.body);
  notify("成功的STK推送。请输入PIN");
} else {
  // 根据响应处理错误
  print(response.body);
  notify("失败。请重试");
}

完整示例代码

以下是完整的示例代码,展示了如何在Flutter应用中集成M-Pesa STK插件:

import 'package:flutter/material.dart';
import 'package:flutter_mpesa_stk/flutter_mpesa_stk.dart';
import 'package:flutter_mpesa_stk/models/Mpesa.dart';
import 'package:flutter_mpesa_stk/models/MpesaResponse.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Mpesa STK 插件演示',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Mpesa STK 插件演示'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final amountController = TextEditingController();
  final phoneNumberController = TextEditingController();

  [@override](/user/override)
  void dispose() {
    amountController.dispose();
    phoneNumberController.dispose();
  }

  bool loading = false;
  void setLoading(bool value) {
    setState(() {
      loading = value;
    });
  }

  void notify(String message) {
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text(message)));
  }

  processSTK() async {
    if (loading) {
      return;
    }
    setLoading(true);
    int amount = 0;
    try {
      amount = int.parse(amountController.value.text);
    } catch (e) {
      setLoading(false);
      notify("输入有效的金额");
      return;
    }

    if (amount < 0) {
      notify("输入有效的金额");
      setLoading(false);
      return;
    }

    MpesaResponse response = await FlutterMpesaSTK(
      "your_consumer_key",
      "your_consumer_secret",
      "your_stk_password",
      "174379", // 短代码
      "https://94f9-41-90-65-205.ngrok-free.app/api/secret-url/callback",
      "默认消息"
    ).stkPush(
      Mpesa(
        amount,
        phoneNumberController.value.text,
        accountReference: "reference",
        transactionDesc: "description"
      )
    );

    if (response.status) {
      print(response.body);
      notify("成功的STK推送。请输入PIN");
    } else {
      print(response.body);
      notify("失败。请重试");
    }
    setLoading(false);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        padding: const EdgeInsets.all(12),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text(
                '点击按钮触发STK推送',
                style: TextStyle(fontWeight: FontWeight.w600, fontSize: 22),
              ),
              const SizedBox(
                height: 12,
              ),
              TextField(
                controller: amountController,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: '输入M-Pesa金额 *',
                  hintText: '金额',
                ),
              ),
              const SizedBox(
                height: 12,
              ),
              TextField(
                controller: phoneNumberController,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: '输入电话号码 *',
                  hintText: '电话号码',
                ),
              ),
              TextButton(
                onPressed: () async {
                  if (loading) {
                    notify("正在处理");
                    return;
                  }
                  await processSTK();
                },
                child: Container(
                  padding: const EdgeInsets.all(12),
                  decoration: const BoxDecoration(
                    color: Colors.red,
                    borderRadius: BorderRadius.all(Radius.circular(8)),
                  ),
                  child: const Text(
                    "触发STK推送",
                    style: TextStyle(color: Colors.white, fontSize: 18),
                  ),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成和使用flutter_mpesa_stk插件的示例代码。这个插件通常用于集成肯尼亚的MPESA STK Push支付功能。

首先,确保你已经在你的Flutter项目中添加了flutter_mpesa_stk依赖。打开你的pubspec.yaml文件并添加以下依赖:

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

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

接下来,配置你的Android和iOS项目以支持MPESA支付。这通常涉及到配置API密钥和其他必要信息,但具体步骤依赖于你的后端设置和MPESA的配置。

以下是一个简单的Flutter示例,展示如何使用flutter_mpesa_stk插件发起一个STK Push支付请求:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String responseMessage = "";

  void initiateStkPushPayment() async {
    // 配置你的MPESA STK Push支付所需的信息
    final MpesaConfig mpesaConfig = MpesaConfig(
      businessShortCode: '你的业务短代码', // 替换为你的MPESA业务短代码
      password: '你的API密码', // 替换为你的MPESA API密码
      timestamp: DateTime.now().millisecondsSinceEpoch.toString(),
      transactionType: 'M-PESA',
      amount: '100', // 支付金额
      partyA: '你的电话号码', // 替换为你的电话号码(收款方)
      partyB: '客户的电话号码', // 替换为客户的电话号码(付款方)
      phoneNumber: '你的电话号码', // 替换为你的电话号码(用于接收回调)
      callbackUrl: '你的回调URL', // 替换为你的回调URL
      accountId: '1', // 通常是1,除非你有特定的账户配置
      remark: '支付描述',
    );

    try {
      // 发起支付请求
      final result = await FlutterMpesaStk.initiateStkPush(mpesaConfig: mpesaConfig);
      setState(() {
        responseMessage = '支付请求成功: ${result.responseDescription}';
      });
      print('支付结果: ${result.toJson()}');
    } catch (e) {
      setState(() {
        responseMessage = '支付请求失败: ${e.message}';
      });
      print('支付错误: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MPESA STK Push 支付示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                responseMessage,
                style: TextStyle(fontSize: 18),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: initiateStkPushPayment,
                child: Text('发起支付'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它有一个按钮用于发起MPESA STK Push支付请求。用户点击按钮后,应用会使用提供的MpesaConfig信息来发起支付请求,并显示支付结果。

请注意,flutter_mpesa_stk插件的具体使用方法和API可能会随着版本的更新而发生变化,因此请务必查阅最新的插件文档和示例代码。

此外,由于MPESA支付涉及到敏感信息和金融交易,务必确保你的应用和后端服务采取了适当的安全措施来保护这些信息。

回到顶部