Skip to content

A Python SDK for integrating M-Pesa services, including STK Push, C2B, and B2C payments, with easy-to-use authentication and transaction handling.

License

Notifications You must be signed in to change notification settings

amlaksil/mpesa-sdk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5952407 · Jan 11, 2025

History

92 Commits
Jan 11, 2025
Jan 10, 2025
Jan 10, 2025
Dec 26, 2024
Jan 9, 2025
Jan 10, 2025
Jan 10, 2025
Jan 11, 2025
Jan 10, 2025
Jan 1, 2025
Jan 10, 2025
Dec 27, 2024

Repository files navigation

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!

About

A Python SDK for integrating M-Pesa services, including STK Push, C2B, and B2C payments, with easy-to-use authentication and transaction handling.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published