Typed, async-first Python SDK for M-Pesa (Safaricom Daraja API)
Project description
daraja-sdk
A typed, async-first Python SDK for the M-Pesa Safaricom Daraja API.
Installation
pip install daraja-sdk
With Django support:
pip install daraja-sdk[django]
With FastAPI support:
pip install daraja-sdk[fastapi]
Quick start
from daraja_sdk import MpesaClient
async with MpesaClient(
consumer_key="...",
consumer_secret="...",
shortcode="174379",
passkey="...",
callback_url="https://yourdomain.com/mpesa/stk/callback/",
environment="sandbox",
) as client:
result = await client.stk_push(phone="0712345678", amount=100)
print(result)
Django
Add to INSTALLED_APPS and configure in settings.py:
INSTALLED_APPS = [
...
"daraja_sdk",
]
MPESA_CONSUMER_KEY = "..."
MPESA_CONSUMER_SECRET = "..."
MPESA_SHORTCODE = "174379"
MPESA_PASSKEY = "..."
MPESA_CALLBACK_URL = "https://yourdomain.com/mpesa/stk/callback/"
MPESA_ENV = "sandbox"
Include the SDK URLs:
from django.urls import include, path
urlpatterns = [
path("mpesa/", include("daraja_sdk.urls", namespace="daraja_sdk")),
]
Listen for successful payments via the signal:
from django.dispatch import receiver
from daraja_sdk.signals import payment_received
@receiver(payment_received)
def on_payment(sender, callback, **kwargs):
print(callback.phone, callback.amount, callback.mpesa_receipt_number)
FastAPI
from contextlib import asynccontextmanager
from fastapi import FastAPI
import daraja_sdk.fastapi as daraja_fastapi
from daraja_sdk import MpesaClient
from daraja_sdk.fastapi import router
@asynccontextmanager
async def lifespan(app):
daraja_fastapi.set_client(MpesaClient(...))
yield
app = FastAPI(lifespan=lifespan, redirect_slashes=False)
app.include_router(router)
@daraja_fastapi.on_payment_received
async def handle_payment(data: dict) -> None:
print(data["phone"], data["amount"], data["receipt"])
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
daraja_sdk-0.1.0.tar.gz
(10.8 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file daraja_sdk-0.1.0.tar.gz.
File metadata
- Download URL: daraja_sdk-0.1.0.tar.gz
- Upload date:
- Size: 10.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.13.5 Darwin/25.2.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
914fe0e67bcf1a5645a4548e20eaf92c810ac019f12adb2dcf1f02746b0915b0
|
|
| MD5 |
708fd9687372f83cece9ea8ac252f864
|
|
| BLAKE2b-256 |
624e5e7fe5a36106afa842915a323f44642f1f8dda99198be21d950abda38841
|
File details
Details for the file daraja_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: daraja_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.13.5 Darwin/25.2.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4ad4b99ca034c6bf373da477d6939468f96d767f1258e21ba35a77c5d5b5abb
|
|
| MD5 |
654ee4c9911c4d592a77b2967be0106f
|
|
| BLAKE2b-256 |
ff50cb872e482e9d20ea955e9482035653d69426ce5e50118e298ef4ea0efa3c
|