Skip to main content

M-Pesa Python SDK

Overview

The M-Pesa Python SDK simplifies the integration of your Python applications with the M-Pesa API, enabling seamless access to mobile money services such as payments, payouts, and transaction management. This SDK is designed to accelerate your development by providing a robust interface for M-Pesa’s STK Push, C2B, B2C, and authentication APIs.

Features

  • Authentication: Retrieve OAuth2 access tokens.
  • STK Push: Initiate mobile money payments from customers.
  • Customer to Business (C2B): Process customer payments with validation and confirmation callbacks.
  • Business to Customer (B2C): Payouts for salaries, rewards, or refunds.
  • Error Handling: Comprehensive exception management.
  • Logging: Built-in logging for debugging and monitoring.

Requirements

  • Python 3.7 or higher
  • An M-Pesa API developer account
  • Consumer Key and Consumer Secret from the M-Pesa API portal
  • Publicly accessible callback URLs (for C2B and B2C)

Installation

Install the SDK using pip:

pip install mpesa_client

Configuration Guide

Option 1: Using Environment Variables

This is the recommended approach to keep your credentials and configuration secure and centralized.

  1. Create a .env File

Place a .env file in your project root with the following content:

# API Base URL and Endpoints
BASE_URL=https://sandbox.safaricom.et
TOKEN_GENERATE_ENDPOINT=/v1/token/generate
STK_PUSH_ENDPOINT=/mpesa/stkpush/v1/processrequest
C2B_REGISTER_URL_ENDPOINT=/mpesa/c2b/v1/registerurl
C2B_PAYMENTS_ENDPOINT=/mpesa/c2b/v1/simulate
B2C_PAYMENT_REQUEST_ENDPOINT=/mpesa/b2c/v1/paymentrequest

# Authentication
CLIENT_KEY=your_client_key
CLIENT_SECRET=your_client_secret

# Logging and Environment
TIMEOUT=30
MPESA_LOG_DIR=./logs
LOG_LEVEL=DEBUG
ENVIRONMENT=DEV  # Set to TEST to disable console logging
  1. Access Configuration in Code

The SDK automatically loads these variables using the dotenv package:

from mpesa import Config

# Access configuration
print("Base URL:", Config.BASE_URL)
print("Client Key:", Config.CLIENT_KEY)

Option 2: Overriding Configuration Directly

If you don’t want to use environment variables or need to change settings dynamically, you can override the configuration directly in your application.

Example:

# Override configuration
Config.BASE_URL = "https://production.safaricom.et"
Config.CLIENT_KEY = "your_production_client_key"
Config.CLIENT_SECRET = "your_production_client_secret"
Config.ENVIRONMENT = "TEST"  # Disable console logs in production

print("Base URL:", Config.BASE_URL)

Handling Changes in Endpoints

If M-Pesa updates its endpoints or you need to switch between environments (sandbox/production), you can easily update the relevant endpoints:

Example:

# Set custom endpoint
Config.STK_PUSH_ENDPOINT = "/custom/stkpush/v1/processrequest"
print("Updated STK Push Endpoint:", Config.STK_PUSH_ENDPOINT)

Usage

Step 1: Authentication

Authenticate with the M-Pesa API to retrieve the access token.

from mpesa import Auth

auth = Auth(
    consumer_key="your_consumer_key",
    consumer_secret="your_consumer_secret",
    base_url="https://sandbox.safaricom.et"
)

response = auth.get_access_token()
print("Access Token:", response.get("access_token"))

Step 2: STK Push Integration

Send an STK Push request to initiate a payment from a customer.

from mpesa import STKPush

stk_push = STKPush(
    base_url="https://sandbox.safaricom.et",
    access_token=access_token
)

payload = stk_push.create_payload(
    short_code="174379",
    pass_key="your_pass_key",
    BusinessShortCode="174379",
    Amount="1000",
    PartyA="254712345678",
    PartyB="174379",
    PhoneNumber="254712345678",
    CallBackURL="https://example.com/callback",
    AccountReference="INV123456",
    TransactionDesc="Payment for Invoice #123456"
)

response = stk_push.send_stk_push(payload)
print("STK Push Response:", response)

Step 3: C2B Payment

Register URLs and process customer payments.

from mpesa import C2B

c2b = C2B(base_url="https://sandbox.safaricom.et", access_token=access_token)

# Register validation and confirmation URLs
registration_response = c2b.register_url(payload={
    "ShortCode": "123456",
    "ResponseType": "Completed",
    "CommandID": "RegisterURL",
    "ConfirmationURL": "https://example.com/confirmation",
    "ValidationURL": "https://example.com/validation"
})

# Process a payment
payment_response = c2b.make_payment(payload={
    "ShortCode": "123456",
    "CommandID": "CustomerPayBillOnline",
    "Amount": "500",
    "Msisdn": "254700000000",
    "BillRefNumber": "INV12345"
})

print("Payment Response:", payment_response)

Step 4: B2C Payout

Send payments to customers.

from mpesa import B2C

b2c = B2C(
    base_url="https://api.safaricom.et",
    access_token=access_token
)

payload = {
    "amount": 5000,
    "partyA": "600000",
    "partyB": "254712345678",
    "remarks": "Loan Disbursement",
    "queueTimeoutURL": "https://yourcallback.url/timeout",
    "resultURL": "https://yourcallback.url/result"
}

response = b2c.make_payment(payload)
print(response)

Logging Guide

The SDK includes a flexible logging system to capture debug and runtime information.

Default Behavior

  • Logs are saved to the directory specified by MPESA_LOG_DIR (e.g., ./logs).
  • Logs are displayed in the terminal (unless ENVIRONMENT is set to TEST).

Customizing Logging

  1. Environment Variables

Control logging behavior via your .env file:

MPESA_LOG_DIR=./custom_logs
LOG_LEVEL=INFO
ENVIRONMENT=TEST  # Disable console logs
  1. Disable Console Logs Programmatically

You can also set the environment programmatically to TEST:

from mpesa import Config

Config.ENVIRONMENT = "TEST"  # Disables console logging
  1. Using the Logger

Set up and use a logger in your application:

from mpesa import get_logger

# Initialize logger
logger = get_logger(__name__)

# Log messages
logger.info("Starting the M-Pesa payment process.")
logger.debug("Debugging transaction payload.")

Error Handling

The SDK includes custom exceptions for better debugging:

  • ValidationError: Raised for invalid payloads.
  • APIError: Raised for API-level errors.

Example:

from mpesa import APIError, ValidationError

try:
    response = stk_push.send_stk_push(payload)
except ValidationError as e:
    print("Payload validation failed:", e)
except APIError as e:
    print("API error occurred:", e)
except Exception as e:
    print("An unexpected error occurred:", e)

Contributing

Contributions are welcome! If you’d like to improve the SDK, feel free to fork the repository and submit a pull request.

License

This project is licensed under the MIT License. See the LICENSE file for more details.


Happy coding with M-Pesa Python SDK!

Metadata

Release files for mpesa-client 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mpesa-client 1.0.0
File Size Uploaded
mpesa_client-1.0.0.tar.gz 27.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mpesa-client 1.0.0
File Interpreter ABI Platform
mpesa_client-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 63.6 kB

Release files / mpesa_client-1.0.0.tar.gz

Download URL mpesa_client-1.0.0.tar.gz
Size 27.6 kB
Tags Source
SHA-256 checksum
How to use checksums
7da5a5a8447e6bb3ea80f922764fd98915f3fdadb5c89438fb4acbe259366d6f
BLAKE2b-256 checksum
How to use checksums
4458dec8da5498deeafa5dc44103fdf839351b2304b86c7e81029b39e989c2b6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.8.10

Release files / mpesa_client-1.0.0-py3-none-any.whl

Download URL mpesa_client-1.0.0-py3-none-any.whl
Size 36.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
744519d6089c742e2a14e69a0b43be6692dc70095dc5646320c6f0ea3de4c5e5
BLAKE2b-256 checksum
How to use checksums
b5086ed7497ba8a3e6b9f698b51a6ba6f4ac78f92b0c07ee3b5b00c025dc31b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.8.10

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page