Integrate M-Pesa and card payments into your application
Initiate an M-Pesa STK Push in your preferred language. Replace your_api_key and your_api_secret with your credentials from the dashboard.
<?php
$ch = curl_init('https://digipay.co.ke/api/v1/payments/mpesa/initiate');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Api-Key: your_api_key',
'X-Api-Secret: your_api_secret',
],
CURLOPT_POSTFIELDS => json_encode([
'phone_number' => '254712345678',
'amount' => 1500.00,
'reference' => 'ORDER-001',
'description' => 'Payment for Order #001',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
url = "https://digipay.co.ke/api/v1/payments/mpesa/initiate"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "your_api_key",
"X-Api-Secret": "your_api_secret",
}
payload = {
"phone_number": "254712345678",
"amount": 1500.00,
"reference": "ORDER-001",
"description": "Payment for Order #001",
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
# views.py
import requests
from django.http import JsonResponse
def initiate_payment(request):
url = "https://digipay.co.ke/api/v1/payments/mpesa/initiate"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "your_api_key",
"X-Api-Secret": "your_api_secret",
}
payload = {
"phone_number": "254712345678",
"amount": 1500.00,
"reference": "ORDER-001",
"description": "Payment for Order #001",
}
r = requests.post(url, json=payload, headers=headers)
return JsonResponse(r.json(), safe=False)
import java.net.http.*;
import java.net.URI;
public class DigiPay {
public static void main(String[] args) throws Exception {
String json = """
{
"phone_number": "254712345678",
"amount": 1500.00,
"reference": "ORDER-001",
"description": "Payment for Order #001"
}""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://digipay.co.ke/api/v1/payments/mpesa/initiate"))
.header("Content-Type", "application/json")
.header("X-Api-Key", "your_api_key")
.header("X-Api-Secret", "your_api_secret")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
using System.Net.Http;
using System.Text;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Api-Key", "your_api_key");
client.DefaultRequestHeaders.Add("X-Api-Secret", "your_api_secret");
var json = @"{
""phone_number"": ""254712345678"",
""amount"": 1500.00,
""reference"": ""ORDER-001"",
""description"": ""Payment for Order #001""
}";
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
"https://digipay.co.ke/api/v1/payments/mpesa/initiate", content);
Console.WriteLine(await response.Content.ReadAsStringAsync());
require 'net/http'
require 'json'
require 'uri'
uri = URI('https://digipay.co.ke/api/v1/payments/mpesa/initiate')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['X-Api-Key'] = 'your_api_key'
request['X-Api-Secret'] = 'your_api_secret'
request.body = {
phone_number: '254712345678',
amount: 1500.00,
reference: 'ORDER-001',
description: 'Payment for Order #001'
}.to_json
response = http.request(request)
puts response.body
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{
"phone_number": "254712345678",
"amount": 1500.00,
"reference": "ORDER-001",
"description": "Payment for Order #001"
}`)
req, _ := http.NewRequest("POST",
"https://digipay.co.ke/api/v1/payments/mpesa/initiate",
bytes.NewBuffer(payload))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Api-Key", "your_api_key")
req.Header.Set("X-Api-Secret", "your_api_secret")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
const response = await fetch(
"https://digipay.co.ke/api/v1/payments/mpesa/initiate",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": "your_api_key",
"X-Api-Secret": "your_api_secret",
},
body: JSON.stringify({
phone_number: "254712345678",
amount: 1500.0,
reference: "ORDER-001",
description: "Payment for Order #001",
}),
}
);
const data = await response.json();
console.log(data);
Include your API credentials in request headers:
X-Api-Key: your_api_key_here
X-Api-Secret: your_api_secret_here
POST /api/v1/payments/mpesa/initiate
{
"phone_number": "254712345678",
"amount": 1500.00,
"reference": "ORDER-001",
"description": "Payment for Order #001"
}
{
"success": true,
"data": {
"transaction_reference": "TXN-A1B2C3D4E5F6",
"status": "processing",
"amount": 1500.00,
"fee": 30.00,
"net_amount": 1470.00
}
}
POST /api/v1/payments/card/charge
{
"amount": 5000.00,
"currency": "KES",
"reference": "ORDER-002",
"card_number": "4111111111111111",
"expiry_month": "12",
"expiry_year": "26",
"cvv": "123",
"card_holder_name": "James Mwangi"
}
GET /api/v1/payments/status/{transaction_reference}
DigiPay sends a POST to your webhook URL when payments complete or fail:
{
"event": "payment.completed",
"data": {
"transaction_reference": "TXN-A1B2C3D4E5F6",
"merchant_reference": "ORDER-001",
"amount": 1500.00,
"fee_amount": 30.00,
"net_amount": 1470.00,
"status": "completed"
}
}
| Code | Meaning |
|---|---|
| 401 | Invalid API credentials |
| 403 | Merchant not active |
| 422 | Validation error |
| 500 | Server error |
A flat 2% is deducted from each successful transaction.
| Amount | Fee | You Receive |
|---|---|---|
| KES 1,000 | KES 20 | KES 980 |
| KES 10,000 | KES 200 | KES 9,800 |
| KES 100,000 | KES 2,000 | KES 98,000 |