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
3KB
mpesa-rust
关于
一个非官方的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_KEY 和 CONSUMER_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
枚举实现了 FromStr
和 TryFrom
对于 String
和 &str
类型,您可以使用 Environment::from_str
或 Environment::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