PHP code example of abutimartin / mpesa-sdk

1. Go to this page and download the library: Download abutimartin/mpesa-sdk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

abutimartin / mpesa-sdk example snippets




pesaSDK\MpesaSDK;

// Initialize SDK
$mpesa = MpesaSDK::sandbox([
    'consumer_key' => 'your_consumer_key',
    'consumer_secret' => 'your_consumer_secret',
    'business_short_code' => '174379',
    'passkey' => 'your_passkey'
]);

// STK Push
$response = $mpesa->stkPush()->push(
    phoneNumber: '254712345678',
    amount: 100.00,
    accountReference: 'ORDER123',
    transactionDescription: 'Payment',
    callbackUrl: 'https://yourapp.com/callback'
);

if ($response->isSuccessful()) {
    echo "Payment initiated! Checkout ID: " . $response->get('CheckoutRequestID');
}



// Using Dependency Injection
class PaymentController extends Controller
{
    public function pay(Request $request, MpesaSDK $mpesa)
    {
        $response = $mpesa->stkPush()->push(
            phoneNumber: $request->phone,
            amount: $request->amount,
            accountReference: 'ORDER123',
            transactionDescription: 'Payment',
            callbackUrl: route('mpesa.callback')
        );
        
        return response()->json($response->getData());
    }
}

// Using Facade
use MpesaSDK\Laravel\MpesaFacade as Mpesa;

$response = Mpesa::requestPayment(
    phoneNumber: '254712345678',
    amount: 100.00,
    callbackUrl: route('mpesa.callback')
);

// Sandbox
$mpesa = MpesaSDK::sandbox([
    'consumer_key' => 'your_consumer_key',
    'consumer_secret' => 'your_consumer_secret',
    'business_short_code' => '174379',
    'passkey' => 'your_passkey'
]);

// Production
$mpesa = MpesaSDK::production([
    'consumer_key' => 'your_consumer_key',
    'consumer_secret' => 'your_consumer_secret',
    'business_short_code' => 'your_shortcode',
    'passkey' => 'your_passkey',
    'initiator_name' => 'your_initiator',
    'security_credential' => 'your_security_credential'
]);

$mpesa = MpesaSDK::fromEnv();

// Automatic via Service Container
public function __construct(MpesaSDK $mpesa) {
    $this->mpesa = $mpesa;
}

// Or via Facade
Mpesa::stkPush()->push(...);

// STK Push Status
$statusResponse = $mpesa->stkPush()->queryStatus($checkoutRequestId);

// General Transaction Status
$response = $mpesa->transactionStatus()->query(
    transactionId: 'LHG31AA5TX',
    queueTimeoutUrl: 'https://yourapp.com/timeout',
    resultUrl: 'https://yourapp.com/result'
);

// In Controller
$status = $mpesa->stkPush()->queryStatus($request->checkout_id);
return response()->json($status->getData());

$response = $mpesa->accountBalance()->query(
    queueTimeoutUrl: 'https://yourapp.com/timeout',
    resultUrl: 'https://yourapp.com/result'
);



pesaSDK\Callbacks\STKPushCallback;
use MpesaSDK\Utils\Logger;

$logger = new Logger(Logger::LEVEL_INFO, 'mpesa.log');
$callback = new STKPushCallback($logger);

$callback->onSuccess(function($data) {
    // Store successful transaction
    file_put_contents('transactions.log', 
        "SUCCESS: {$data['mpesa_receipt_number']} - {$data['amount']}\n", 
        FILE_APPEND
    );
});

$callback->onFailure(function($data) {
    // Handle failed transaction
    file_put_contents('transactions.log', 
        "FAILED: {$data['result_desc']}\n", 
        FILE_APPEND
    );
});

$response = $callback->process();
header('Content-Type: application/json');
echo json_encode($response);



use MpesaSDK\Callbacks\STKPushCallback;
use App\Models\Transaction;

class MpesaController extends Controller
{
    public function handleCallback(Request $request)
    {
        $callback = new STKPushCallback();
        
        $callback->onSuccess(function($data) {
            Transaction::create([
                'checkout_request_id' => $data['checkout_request_id'],
                'mpesa_receipt_number' => $data['mpesa_receipt_number'],
                'amount' => $data['amount'],
                'phone_number' => $data['phone_number'],
                'status' => 'completed'
            ]);
            
            \Log::info('Payment successful', $data);
        });
        
        $callback->onFailure(function($data) {
            Transaction::create([
                'checkout_request_id' => $data['checkout_request_id'],
                'status' => 'failed',
                'failure_reason' => $data['result_desc']
            ]);
            
            \Log::warning('Payment failed', $data);
        });
        
        $response = $callback->process();
        return response()->json($response);
    }
}

$response = $mpesa->stkPush()->push(
    phoneNumber: '254712345678',
    amount: 100.00,
    accountReference: 'ORDER123',
    transactionDescription: 'Payment',
    callbackUrl: 'https://yourapp.com/callback'
);

// Quick method
$response = $mpesa->requestPayment(
    phoneNumber: '254712345678',
    amount: 100.00,
    callbackUrl: 'https://yourapp.com/callback'
);

// Controller method
public function initiatePayment(Request $request, MpesaSDK $mpesa)
{
    $response = $mpesa->stkPush()->push(
        phoneNumber: $request->phone,
        amount: $request->amount,
        accountReference: $request->reference,
        transactionDescription: 'Payment',
        callbackUrl: route('mpesa.callback')
    );
    
    return response()->json($response->getData());
}

// Using Facade
$response = Mpesa::requestPayment(
    phoneNumber: $request->phone,
    amount: $request->amount,
    callbackUrl: route('mpesa.callback')
);

$response = $mpesa->b2c()->send(
    phoneNumber: '254712345678',
    amount: 100.00,
    commandId: 'BusinessPayment',
    remarks: 'Salary payment',
    queueTimeoutUrl: 'https://yourapp.com/timeout',
    resultUrl: 'https://yourapp.com/result'
);

$response = $mpesa->sendMoney(
    phoneNumber: $request->phone,
    amount: $request->amount,
    remarks: 'Payment',
    queueTimeoutUrl: route('mpesa.timeout'),
    resultUrl: route('mpesa.result')
);

use MpesaSDK\Utils\Logger;

// Create logger
$logger = new Logger(
    logLevel: Logger::LEVEL_INFO,
    logFile: 'mpesa.log',
    enableConsole: true
);

// Use with SDK
$mpesa = MpesaSDK::sandbox($config, null, $logger);

// Manual logging
$logger->info('Payment initiated', ['amount' => 100]);
$logger->error('Payment failed', ['error' => 'Invalid phone number']);

use MpesaSDK\Exceptions\MpesaException;
use MpesaSDK\Exceptions\ValidationException;

try {
    $response = $mpesa->stkPush()->push(
        phoneNumber: '254712345678',
        amount: 100.00,
        accountReference: 'ORDER123',
        transactionDescription: 'Payment',
        callbackUrl: 'https://yourapp.com/callback'
    );
    
    if (!$response->isSuccessful()) {
        throw new MpesaException($response->getErrorMessage());
    }
    
} catch (ValidationException $e) {
    echo "Validation error: " . $e->getMessage();
} catch (MpesaException $e) {
    echo "M-Pesa error: " . $e->getFullErrorMessage();
} catch (Exception $e) {
    echo "General error: " . $e->getMessage();
}
bash
php artisan vendor:publish --tag=mpesa-config