#service #traits #accessing #api #mpesa #safaricom #m-pesa

mpesa_derive

MpesaSecurity 特性推导宏库

5个不稳定版本

0.3.0 2021年6月13日
0.2.1 2020年11月19日
0.2.0 2020年11月18日
0.1.1 2020年11月9日
0.1.0 2020年10月5日

#69 in #accessing

MIT 许可证

3KB

mpesa-rust

Rust

Discord

关于

一个非官方的Rust封装,用于访问M-Pesa服务的Safaricom API。

安装

Cargo.toml

[dependencies]
mpesa = { version = "1" }

可选地,您可以禁用默认特性,这基本上是所有MPESA API套件,以便有条件地选择单个特性。(请参阅服务表以获取完整的Cargo特性列表)

示例

[dependencies]
mpesa = { version = "1", default_features = false, features = ["b2b", "express_request"] }

在您的库或二进制crate中

use mpesa::Mpesa;

使用方法

创建一个 Mpesa 客户端

您首先需要创建一个 Mpesa 实例(客户端)。您需要提供 CONSUMER_KEYCONSUMER_SECRET。您可以在 此处 获取Safaricom沙盒环境的这些凭据。值得注意的是,这些凭据仅在沙盒环境中有效。要上线并获取生产密钥,请阅读此处的文档。

以下是您创建 Mpesa 的方式:

use mpesa::{Mpesa, Environment};

#[tokio::main]
async fn main() {
    dotenvy::dotenv().ok();

    let client = Mpesa::new(
        dotenvy::var("CONSUMER_KEY").unwrap(),
        dotenvy::var("CONSUMER_SECRET").unwrap(),
        Environment::Sandbox,
    );

    assert!(client.is_connected().await);
}

由于 Environment 枚举实现了 FromStrTryFrom 对于 String&str 类型,您可以使用 Environment::from_strEnvironment::try_from 创建一个 Environment 类型。如果环境值存储在 .env 或其他配置文件中,这非常理想。

use mpesa::{Mpesa, Environment};
use std::convert::TryFrom;
use std::error::Error;
use std::str::FromStr;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    dotenvy::dotenv().ok();

    let client = Mpesa::new(
        dotenvy::var("CONSUMER_KEY").unwrap(),
        dotenvy::var("CONSUMER_SECRET").unwrap(),
        Environment::from_str("sandbox")?, // or
        // Environment::try_from("sandbox")?,
    );

    assert!(client.is_connected().await);
    Ok(())
}

Mpesa 结构体的 environment 参数对实现 ApiEnvironment 特性的任何类型都是通用的。此特性期望为给定类型实现以下方法:

pub trait ApiEnvironment {
    fn base_url(&self) -> &str;
    fn get_certificate(&self) -> &str;
}

该特性允许您创建自己的类型并将其传递给environment参数。使用该特性后,您可以通过从base_url方法返回模拟服务器URI以及提供自己的get_certificate实现来使用自己的证书来模拟http请求(用于测试目的)。这些证书是必需的,用于对发送到MPESA API的选择性请求进行签名。

请参见下面的示例(以及此处以查看如何为Environment枚举实现该特性)

use mpesa::{Mpesa, ApiEnvironment};

#[derive(Clone)]
pub struct CustomEnvironment;

impl ApiEnvironment for CustomEnvironment {
    fn base_url(&self) -> &str {
        // your base url here
        "https://your_base_url.com"
    }

    fn get_certificate(&self) -> &str {
        // your certificate here
        r#"..."#
    }
}

#[tokio::main]
async fn main() {
    dotenvy::dotenv().ok();

    let client = Mpesa::new(
        dotenvy::var("CONSUMER_KEY").unwrap(),
        dotenvy::var("CONSUMER_SECRET").unwrap(),
        CustomEnvironment,
    );
}

如果您打算在生产环境中使用,则在创建客户端后,您需要从Mpesa调用set_initiator_password方法。在这里,您提供启动密码,该密码将覆盖用于沙箱的默认密码"Safcom496!"

use mpesa::{Mpesa, Environment};

#[tokio::main]
async fn main() {
    dotenvy::dotenv().ok();

    let client = Mpesa::new(
        dotenvy::var("CONSUMER_KEY").unwrap(),
        dotenvy::var("CONSUMER_SECRET").unwrap(),
        Environment::Sandbox,
    );

    client.set_initiator_password("new_password");
    assert!(client.is_connected().await)
}

服务

下表显示了Safaricom的所有MPESA API以及该crate支持的服务,以及它们的Cargo功能和用法示例

API Cargo 功能 状态 示例
账户余额 account_balance 稳定 ✅ 账户余额示例
B2B Express Checkout N/A 未实现 N/A
账单管理器 bill_manager 不稳定 ⚠️ 账单管理器示例
商业购买商品 b2b 稳定 ✅ 商业购买商品示例
商业支付账单 N/A 未实现 N/A
商业对客户(B2C) b2c 稳定 ✅️ b2c 示例
客户对商业(注册URL) c2b_register 稳定 ✅️ c2b 注册示例
客户对商业(模拟) c2b_simulate 稳定 ✅️ c2b 模拟示例
动态QR码 dynamic_qr 稳定 ✅️ 动态QR码示例
M-PESA Express(查询) N/A 未实现 ️ N/A
M-PESA Express(模拟)/ STK推送 express_request 稳定 ✅️ express 请求示例
交易状态 transaction_status 稳定 ✅️ 交易状态示例
交易撤销 transaction_reversal 稳定 ✅️ 交易撤销示例
税务汇款 N/A 未实现 N/A

作者

Collins Muriuki

  • Twitter: @c12i_
  • 与Safaricom无关。

贡献

欢迎贡献、问题和功能请求!
请随时查看问题页面。您还可以查看贡献指南

contrib.rocks制作。


版权所有 © 2023 Collins Muriuki
本项目受MIT许可。

依赖关系

~1.5MB
~35K SLoC