edwinmugendi / sapamapay
Sapama Pay API - MPESA, Equitel, Sapama Pay API
Installs: 540
Dependents: 0
Suggesters: 0
Security: 0
Stars: 37
Watchers: 6
Forks: 51
Open Issues: 2
Requires
- php: >=4.0.2
This package is auto-updated.
Last update: 2025-04-26 07:30:10 UTC
README
SapamaPay API
This library is an API wrapper to the following Safaricom MPESA API's
- Lipa Na M-Pesa Online Payment API
- Lipa Na M-Pesa Query Request API
- Account Balance Request
- B2B Payment Request
- B2C Payment Request
- Transaction Status Request
- C2B Simulate Transaction
- C2B Register URL
- Reversal
- Generate Token
##Installation
###Requirements
PHP >=4.0.2
Add edwinmugendi/sapamapay
to composer.json
.
"edwinmugendi/sapamapay": "master"
Run composer update
to pull down the latest version.
Or run
composer require edwinmugendi/sapamapay
Without composer. Download the source code and require_once
the autoload.php
require_once __DIR__ . '/../vendor/autoload.php';
##Testing
Update the $api
variable to the API you want to run.
<?php require_once __DIR__ . '/../vendor/autoload.php'; // Autoload files using Composer autoload use Edwinmugendi\Sapamapay\MpesaApi; $mpesa_api = new MpesaApi(); $configs = array( 'AccessToken' => 'ACCESSTOKEN', 'Environment' => 'sandbox', 'Content-Type' => 'application/json', 'Verbose' => 'true', ); $api = 'generate_token'; if ($api == 'stk_push') { $parameters = array( 'BusinessShortCode' => '603013', 'Password' => 'TkNZpjhQ', 'Timestamp' => '20171010101010', 'TransactionType' => 'TransactionType', 'Amount' => '10', 'PartyA' => '254708374149', 'PartyB' => '603013', 'PhoneNumber' => '254708374149', 'CallBackURL' => 'https://url', 'AccountReference' => '1232', 'TransactionDesc' => 'TESTING', ); } else if ($api == 'stk_query') { $parameters = array( 'BusinessShortCode' => '603013', 'Password' => 'TkNZpjhQ', 'Timestamp' => '20171010101010', 'CheckoutRequestID' => 'ws_co_123456789', ); } else if ($api == 'account_balance') { $parameters = array( 'CommandID' => 'AccountBalance', 'PartyA' => '603013', 'IdentifierType' => '4', 'Remarks' => 'Remarks', 'Initiator' => 'apiop41', 'SecurityCredential' => 'TkNZpjhQ', 'QueueTimeOutURL' => 'https://url', 'ResultURL' => 'https://url', ); } else if ($api == 'b2b_payment_request') { $parameters = array( 'CommandID' => 'BusinessPayBill', 'Amount' => '10', 'PartyA' => '603013', 'SenderIdentifierType' => '4', 'PartyB' => '600000', 'RecieverIdentifierType' => '4', 'Remarks' => 'Remarks', 'Initiator' => 'apiop41', 'SecurityCredential' => 'TkNZpjhQ', 'QueueTimeOutURL' => 'https://url', 'ResultURL' => 'https://url', 'AccountReference' => '12', ); } else if ($api == 'b2c_payment_request') { $parameters = array( 'InitiatorName' => 'apiop41', 'SecurityCredential' => 'TkNZpjhQ', 'CommandID' => 'SalaryPayment', 'Amount' => '10', 'PartyA' => '603013', 'PartyB' => '254708374149', 'Remarks' => 'Remarks', 'QueueTimeOutURL' => 'https://url', 'ResultURL' => 'https://url', 'Occasion' => '12', ); } else if ($api == 'reversal') { $parameters = array( 'CommandID' => 'TransactionReversal', 'ReceiverParty' => '254708374149', 'RecieverIdentifierType' => '1', 'Remarks' => 'remarks', 'Initiator' => 'apiop41', 'SecurityCredential' => 'TkNZpjhQ', 'QueueTimeOutURL' => 'https://url', 'ResultURL' => 'https://url', 'TransactionID' => '11211', 'Occasion' => '12', 'Amount' => '10', ); } else if ($api == 'transaction_status_request') { $parameters = array( 'CommandID' => 'TransactionStatusQuery', 'PartyA' => '254708374149', 'IdentifierType' => '603013', 'Remarks' => 'remarks', 'Initiator' => 'apiop41', 'SecurityCredential' => 'TkNZpjhQ', 'QueueTimeOutURL' => 'https://url', 'ResultURL' => 'https://url', 'TransactionID' => '11211', 'Occasion' => '12', ); } else if ($api == 'c2b_register_url') { $parameters = array( 'ValidationURL' => 'https://url', 'ConfirmationURL' => 'https://url', 'ResponseType' => 'Completed', 'ShortCode' => '603013', ); } else if ($api == 'c2b_simulate') { $parameters = array( 'CommandID' => 'CustomerPayBillOnline', 'Amount' => '100', 'Msisdn' => '254708374149', 'BillRefNumber' => 'TESTING', 'ShortCode' => '603013', ); } else if ($api == 'generate_token') { $parameters = array( 'ConsumerKey' => 'CONSUMER_KEY', 'ConsumerSecret' => 'CONSUMER_SECRET', ); }//E# if statement $response = $mpesa_api->call($api, $configs, $parameters); echo 'JSON response: <p>'; echo json_encode($response); echo '<p>Response var_dump:<p>'; var_dump($response);
##Authentication
First call the generate_token
to get the access token
After getting the access token, set it in the AccessToken
index in the $configs
to make other calls.
##Configurations
The $configs
parameters has the following indices
AccessToken
- The access token. Get the access to ken by running calling the `generate_token' APIEnvironment
- Can besandbox
(when testing your app) orlive
(when your app is in production)Content-Type
- Should always beapplication/json
Verbose
- (Optional) for easy debugging, set this index to run your code in verbose mode ie echo and var dump parametersUrl
- (Optional), this overrides the endpoint. By default we use https://sandbox.safaricom.co.ke/ and https://api.safaricom.co.ke/ for sandbox and live respecitvely. Don't forget the forward slush as the end(/)
$configs = array( 'AccessToken' => 'ACCESSTOKEN', 'Environment' => 'sandbox', 'Content-Type' => 'application/json', 'Verbose' => 'true', //THIS );
##Response The response has the following indices
Environment
- live or sandboxName
- The name of the API calledHttpVerb
- get or postHttpStatusCode
- HTTP status codeHttpStatusMessage
- HTTP status messageMessage
- Custom MessageResponse
- Response arrayEndpoint
- URL calledParameters
- Parameters passed to the URLExpectedResponse
- Expected Reponse Parameters as documents in the API
Sample Json
{"Environment":"sandbox","Name":"Generate Token","HttpVerb":"get","HttpStatusCode":"200","HttpStatusMessage":"Success","Message":"Success","Response":{"access_token":"YdiXeOksM3G9WVgl7jR1pCtT2Ckt","expires_in":"3599"},"Endpoint":"https:\/\/sandbox.safaricom.co.ke\/oauth\/v1\/generate","Parameters":{"ConsumerKey":"Li2dKUeKhlX6Gw0Fpkbq6LEBndlpOuxZ","ConsumerSecret":"hX3Yyd0BGMBiYaln"},"ExpectedResponse":{"Expiry":{"name":"Token expiry time in seconds.","type":"Integer","sample_value":"3599"},"Access_Token":{"name":"Access token to access other APIs","type":"Alpha-Numeric","sample_value":"O22vJy6rnN2nRAnOPqZ8dkyGxmXG"}}}
Sample PHP Var dump
array (size=10) 'Environment' => string 'sandbox' (length=7) 'Name' => string 'Generate Token' (length=14) 'HttpVerb' => string 'get' (length=3) 'HttpStatusCode' => string '200' (length=3) 'HttpStatusMessage' => string 'Success' (length=7) 'Message' => string 'Success' (length=7) 'Response' => array (size=2) 'access_token' => string 'YdiXeOksM3G9WVgl7jR1pCtT2Ckt' (length=28) 'expires_in' => string '3599' (length=4) 'Endpoint' => string 'https://sandbox.safaricom.co.ke/oauth/v1/generate' (length=49) 'Parameters' => array (size=2) 'ConsumerKey' => string 'Li2dKUeKhlX6Gw0Fpkbq6LEBndlpOuxZ' (length=32) 'ConsumerSecret' => string 'hX3Yyd0BGMBiYaln' (length=16) 'ExpectedResponse' => array (size=2) 'Expiry' => array (size=3) 'name' => string 'Token expiry time in seconds.' (length=29) 'type' => string 'Integer' (length=7) 'sample_value' => string '3599' (length=4) 'Access_Token' => array (size=3) 'name' => string 'Access token to access other APIs' (length=33) 'type' => string 'Alpha-Numeric' (length=13) 'sample_value' => string 'O22vJy6rnN2nRAnOPqZ8dkyGxmXG' (length=28)
##Help For API integration assistance, bugs or assistance, kindly reach me on edwinmugendi@gmail.com