PHP code example of josemodi97 / yii2-safaricom-daraja
1. Go to this page and download the library: Download josemodi97/yii2-safaricom-daraja 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/ */
josemodi97 / yii2-safaricom-daraja example snippets
'components' => [
'daraja' => [
'class' => 'Safaricom\\Daraja\\Daraja',
'environment' => 'sandbox',
'consumerKey' => getenv('DARAJA_CONSUMER_KEY'),
'consumerSecret' => getenv('DARAJA_CONSUMER_SECRET'),
'callbackBaseUrl' => getenv('DARAJA_CALLBACK_BASE_URL') ?: null,
],
],
'params' => [
'daraja.shortCode' => getenv('DARAJA_SHORT_CODE'),
'daraja.passkey' => getenv('DARAJA_PASSKEY'),
'daraja.initiatorName' => getenv('DARAJA_INITIATOR_NAME'),
'daraja.initiatorPassword' => getenv('DARAJA_INITIATOR_PASSWORD'),
'daraja.certificatePath' => '@app/certs/SafaricomSandboxCertificate.cer',
],
if (class_exists('Dotenv\\Dotenv')) {
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->safeLoad();
}
if (class_exists('Dotenv\\Dotenv')) {
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__, 2));
$dotenv->safeLoad();
}
$tokenResponse = Yii::$app->daraja->generateAccessToken();
$accessToken = $tokenResponse['access_token'];
$response = Yii::$app->daraja->stkPush($payload);
$response = Yii::$app->daraja->c2bRegisterUrl($payload);
$response = Yii::$app->daraja->accountBalance($payload);
use Safaricom\Daraja\EndpointCatalog;
$response = Yii::$app->daraja->request(EndpointCatalog::PULL_QUERY, [
'ShortCode' => Yii::$app->params['daraja.shortCode'],
'StartDate' => '2026-07-01 00:00:00',
'EndDate' => '2026-07-16 23:59:59',
'OffSetValue' => '0',
]);
namespace app\models;
use Yii;
use yii\base\Model;
class StkPushForm extends Model
{
public $phoneNumber;
public $amount;
public $accountReference;
public $transactionDesc;
public function rules()
{
return [
[['phoneNumber', 'amount', 'accountReference'], 'lidate()) {
return false;
}
$shortCode = Yii::$app->params['daraja.shortCode'];
$passkey = Yii::$app->params['daraja.passkey'];
$timestamp = date('YmdHis');
return Yii::$app->daraja->stkPush([
'BusinessShortCode' => $shortCode,
'Password' => Yii::$app->daraja->generateStkPassword($shortCode, $passkey, $timestamp),
'Timestamp' => $timestamp,
'TransactionType' => 'CustomerPayBillOnline',
'Amount' => $this->amount,
'PartyA' => $this->phoneNumber,
'PartyB' => $shortCode,
'PhoneNumber' => $this->phoneNumber,
'CallBackURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/stk-callback'),
'AccountReference' => $this->accountReference,
'TransactionDesc' => $this->transactionDesc ? $this->transactionDesc : 'Payment',
]);
}
}
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
use app\models\StkPushForm;
class DarajaController extends Controller
{
public $enableCsrfValidation = false;
public function actionStkPush()
{
Yii::$app->response->format = Response::FORMAT_JSON;
$model = new StkPushForm();
$model->load(Yii::$app->request->post(), '');
if (!$model->validate()) {
return ['ok' => false, 'errors' => $model->getErrors()];
}
try {
return ['ok' => true, 'data' => $model->send()];
} catch (\Exception $e) {
Yii::error($e->getMessage(), __METHOD__);
return ['ok' => false, 'message' => $e->getMessage()];
}
}
public function actionStkCallback()
{
Yii::$app->response->format = Response::FORMAT_JSON;
$raw = Yii::$app->request->getRawBody();
$payload = json_decode($raw, true);
Yii::info($payload, 'daraja.stk.callback');
/*
* Save the callback to your database here.
* Common fields:
* $payload['Body']['stkCallback']['MerchantRequestID']
* $payload['Body']['stkCallback']['CheckoutRequestID']
* $payload['Body']['stkCallback']['ResultCode']
* $payload['Body']['stkCallback']['ResultDesc']
*/
return ['ResultCode' => 0, 'ResultDesc' => 'Accepted'];
}
}
$timestamp = date('YmdHis');
$shortCode = Yii::$app->params['daraja.shortCode'];
$password = Yii::$app->daraja->generateStkPassword($shortCode, Yii::$app->params['daraja.passkey'], $timestamp);
$response = Yii::$app->daraja->stkPush([
'BusinessShortCode' => $shortCode,
'Password' => $password,
'Timestamp' => $timestamp,
'TransactionType' => 'CustomerPayBillOnline',
'Amount' => 1,
'PartyA' => '254700000000',
'PartyB' => $shortCode,
'PhoneNumber' => '254700000000',
'CallBackURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/stk-callback'),
'AccountReference' => 'INV-1001',
'TransactionDesc' => 'Invoice payment',
]);
$response = Yii::$app->daraja->stkQuery([
'BusinessShortCode' => $shortCode,
'Password' => $password,
'Timestamp' => $timestamp,
'CheckoutRequestID' => 'ws_CO_...',
]);
$response = Yii::$app->daraja->c2bRegisterUrl([
'ShortCode' => Yii::$app->params['daraja.shortCode'],
'ResponseType' => 'Completed',
'ConfirmationURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/c2b-confirmation'),
'ValidationURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/c2b-validation'),
]);
$response = Yii::$app->daraja->c2bSimulate([
'ShortCode' => Yii::$app->params['daraja.shortCode'],
'CommandID' => 'CustomerPayBillOnline',
'Amount' => '10',
'Msisdn' => '254700000000',
'BillRefNumber' => 'INV-1001',
]);
public function actionC2bValidation()
{
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Yii::info(json_decode(Yii::$app->request->getRawBody(), true), 'daraja.c2b.validation');
return ['ResultCode' => 0, 'ResultDesc' => 'Accepted'];
}
public function actionC2bConfirmation()
{
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Yii::info(json_decode(Yii::$app->request->getRawBody(), true), 'daraja.c2b.confirmation');
return ['ResultCode' => 0, 'ResultDesc' => 'Accepted'];
}
$credential = Yii::$app->daraja->generateSecurityCredential(
Yii::$app->params['daraja.initiatorPassword'],
Yii::getAlias(Yii::$app->params['daraja.certificatePath'])
);
$response = Yii::$app->daraja->b2cPayment([
'InitiatorName' => Yii::$app->params['daraja.initiatorName'],
'SecurityCredential' => $credential,
'CommandID' => 'BusinessPayment',
'Amount' => '100',
'PartyA' => Yii::$app->params['daraja.shortCode'],
'PartyB' => '254700000000',
'Remarks' => 'Payout',
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
'Occasion' => 'Refund',
]);
$response = Yii::$app->daraja->b2bPayment([
'Initiator' => Yii::$app->params['daraja.initiatorName'],
'SecurityCredential' => $credential,
'CommandID' => 'BusinessPayBill',
'SenderIdentifierType' => '4',
'RecieverIdentifierType' => '4',
'Amount' => '100',
'PartyA' => Yii::$app->params['daraja.shortCode'],
'PartyB' => '600000',
'AccountReference' => 'INV-1001',
'Remarks' => 'Supplier payment',
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
]);
$response = Yii::$app->daraja->b2PochiPayment([
'OriginatorConversationID' => uniqid('b2pochi-', true),
'InitiatorName' => Yii::$app->params['daraja.initiatorName'],
'SecurityCredential' => $credential,
'CommandID' => 'BusinessPayment',
'Amount' => '100',
'PartyA' => Yii::$app->params['daraja.shortCode'],
'PartyB' => '254700000000',
'Remarks' => 'B2Pochi payment',
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
'Occasion' => 'Payment',
]);
$response = Yii::$app->daraja->reversal([
'Initiator' => Yii::$app->params['daraja.initiatorName'],
'SecurityCredential' => $credential,
'CommandID' => 'TransactionReversal',
'TransactionID' => 'ABC123XYZ',
'Amount' => '100',
'ReceiverParty' => Yii::$app->params['daraja.shortCode'],
'RecieverIdentifierType' => '4',
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
'Remarks' => 'Customer refund',
'Occasion' => 'Refund',
]);
$response = Yii::$app->daraja->transactionStatus([
'Initiator' => Yii::$app->params['daraja.initiatorName'],
'SecurityCredential' => $credential,
'CommandID' => 'TransactionStatusQuery',
'TransactionID' => 'ABC123XYZ',
'PartyA' => Yii::$app->params['daraja.shortCode'],
'IdentifierType' => '4',
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
'Remarks' => 'Status query',
'Occasion' => 'Status',
]);
$response = Yii::$app->daraja->accountBalance([
'Initiator' => Yii::$app->params['daraja.initiatorName'],
'SecurityCredential' => $credential,
'CommandID' => 'AccountBalance',
'PartyA' => Yii::$app->params['daraja.shortCode'],
'IdentifierType' => '4',
'Remarks' => 'Balance query',
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
]);
$response = Yii::$app->daraja->ratibaCreatePaybill([
'StandingOrderName' => 'Monthly fee',
'BusinessShortCode' => '174379',
'TransactionType' => 'Standing Order Customer Pay Bill',
'Amount' => '100',
'PartyA' => '254700000000',
'ReceiverPartyIdentifierType' => '4',
'CallBackURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/ratiba-callback'),
'AccountReference' => 'ACC-1001',
'TransactionDesc' => 'Monthly payment',
'Frequency' => '1',
'StartDate' => '20260716',
'EndDate' => '20270716',
]);
$response = Yii::$app->daraja->ratibaCreateBuyGoods([
'StandingOrderName' => 'Merchant subscription',
'BusinessShortCode' => '300584',
'TransactionType' => 'Standing Order Customer Pay Merchant',
'Amount' => '100',
'PartyA' => '254700000000',
'ReceiverPartyIdentifierType' => '2',
'CallBackURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/ratiba-callback'),
'AccountReference' => 'ACC-1001',
'TransactionDesc' => 'Merchant payment',
'Frequency' => '1',
'StartDate' => '20260716',
'EndDate' => '20270716',
]);
$response = Yii::$app->daraja->lipaNaBongaRedeemPaybill([
'msisdn' => '254700000000',
'amount' => 100,
'bongaPoints' => 500,
'conversionRate' => 0.2,
'shortCode' => Yii::$app->params['daraja.shortCode'],
'accountNumber' => 'ACC-1001',
]);
$response = Yii::$app->daraja->lipaNaBongaCalculatePoints([
'points' => '500',
]);
$response = Yii::$app->daraja->imsiCheckAti([
'customerNumber' => '254700000000',
]);
$response = Yii::$app->daraja->swapCheckAti([
'customerNumber' => '254700000000',
]);
$response = Yii::$app->daraja->pullRegister([
'ShortCode' => Yii::$app->params['daraja.shortCode'],
'RequestType' => 'Pull',
'NominatedNumber' => '254700000000',
'CallBackURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/pull-callback'),
]);
$response = Yii::$app->daraja->pullQuery([
'ShortCode' => Yii::$app->params['daraja.shortCode'],
'StartDate' => '2026-07-01 00:00:00',
'EndDate' => '2026-07-16 23:59:59',
'OffSetValue' => '0',
]);
use Safaricom\Daraja\EndpointCatalog;
$headers = [
'x-correlation-conversationid' => uniqid('', true),
'x-source-system' => 'web-portal',
'x-api-key' => getenv('DARAJA_IOT_API_KEY'),
'Accept-Language' => 'EN',
'X-MSISDN' => getenv('DARAJA_IOT_MSISDN'),
'X-App' => 'web-portal',
'X-MessageID' => uniqid('msg-', true),
];
$response = Yii::$app->daraja->iot(
EndpointCatalog::IOT_GET_ALL_MESSAGES,
['vpnGroup' => 'MY-GROUP'],
$headers,
['pageNo' => 1, 'pageSize' => 10]
);
$response = Yii::$app->daraja->iot(
EndpointCatalog::IOT_SEARCH_MESSAGES,
['searchValue' => 'hello', 'vpnGroup' => 'MY-GROUP', 'username' => 'admin'],
$headers,
['pageNo' => 1, 'pageSize' => 5]
);
$response = Yii::$app->daraja->iot(
EndpointCatalog::IOT_SEND_SINGLE_MESSAGE,
[
'msisdn' => '254700000000',
'message' => 'Test message',
'vpnGroup' => 'MY-GROUP',
'username' => 'admin',
],
$headers
);
$response = Yii::$app->daraja->iot(
EndpointCatalog::IOT_SIM_ACTIVATION,
['msisdn' => '254700000000', 'vpnGroup' => 'MY-GROUP', 'username' => 'admin'],
$headers
);
use Safaricom\Daraja\EndpointCatalog;
'CallBackURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/stk-callback'),
'ResultURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/result'),
'QueueTimeOutURL' => Yii::$app->daraja->buildCallbackUrl('/daraja/timeout'),
try {
$response = Yii::$app->daraja->accountBalance($payload);
} catch (\Safaricom\Daraja\DarajaException $e) {
Yii::error($e->getMessage(), 'daraja');
throw $e;
}