PHP code example of monnify / monnify-laravel

1. Go to this page and download the library: Download monnify/monnify-laravel 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/ */

    

monnify / monnify-laravel example snippets


use Monnify\MonnifyLaravel\Facades\Monnify;

// In your checkout controller
$response = Monnify::transactions()->initialise([
    'amount'           => 5000.00,
    'customerEmail'    => '[email protected]',
    'paymentReference' => 'ORDER-' . uniqid(),   // must be unique per transaction
    'currencyCode'     => 'NGN',
    'contractCode'     => config('monnify.contract_code'),
    'redirectUrl'      => route('payment.callback'),
]);

return redirect($response['body']['responseBody']['checkoutUrl']);

// In your callback controller
public function callback(Request $request)
{
    $reference = $request->query('paymentReference');

    $result = Monnify::transactions()->statusByReference($reference, 'payment');
    $status = $result['body']['responseBody']['paymentStatus'] ?? null;

    if ($status === 'PAID') {
        // Payment confirmed server-side — safe to fulfil the order
    }
}

[
    'status' => 200,       // HTTP status code from Monnify
    'body'   => [ ... ],   // The parsed response data from Monnify
]

[
    'status' => 400,
    'error'  => [ ... ],   // Error details returned by Monnify
]

$response = Monnify::transactions()->initialise($data);

if ($response['status'] === 200) {
    $checkoutUrl = $response['body']['responseBody']['checkoutUrl'];
    return redirect($checkoutUrl);
}

// Something went wrong
logger()->error('Monnify error', $response['error'] ?? []);

use Exception;
use Monnify\MonnifyLaravel\Facades\Monnify;

try {
    $response = Monnify::transactions()->initialise($data);
} catch (InvalidArgumentException $e) {
    // A json(['message' => 'Payment service unavailable'], 503);
}

$signature = $request->header('monnify-signature');
$expected  = hash_hmac('sha512', $request->getContent(), config('monnify.secret_key'));

if (! hash_equals($expected, $signature)) {
    return response()->json(['message' => 'Invalid signature'], 401);
}



namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MonnifyWebhookController extends Controller
{
    public function handle(Request $request)
    {
        // Verify the signature
        $signature = $request->header('monnify-signature');
        $expected  = hash_hmac('sha512', $request->getContent(), config('monnify.secret_key'));

        if (! hash_equals($expected, $signature)) {
            return response()->json(['message' => 'Invalid signature'], 401);
        }

        $eventType = $request->input('eventType');
        $eventData = $request->input('eventData');

        // Return 200 immediately, then process — prevents Monnify from resending
        // due to a timeout caused by slow downstream logic.
        match ($eventType) {
            'SUCCESSFUL_TRANSACTION'  => ProcessPayment::dispatch($eventData),
            'SUCCESSFUL_DISBURSEMENT' => ProcessDisbursement::dispatch($eventData),
            'FAILED_DISBURSEMENT'     => HandleFailedDisbursement::dispatch($eventData),
            'SUCCESSFUL_REFUND'       => ProcessRefund::dispatch($eventData),
            'SETTLEMENT'              => ProcessSettlement::dispatch($eventData),
            default                   => null,
        };

        return response()->json(['message' => 'Webhook received'], 200);
    }
}

// routes/web.php
Route::post('/webhooks/monnify', [MonnifyWebhookController::class, 'handle'])
    ->name('monnify.webhook');

// Laravel 11+ — bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'webhooks/monnify',
    ]);
})

// Laravel 10 and below — app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
    'webhooks/monnify',
];

use Monnify\MonnifyLaravel\Facades\Monnify;

Monnify::transactions()->initialise($data);
Monnify::transactions()->payWithBankTransfer($data);
Monnify::transactions()->chargeCard($data);
Monnify::transactions()->authorizeOTP($data);
Monnify::transactions()->authorizeThreeDSCard($data);
Monnify::transactions()->all($parameters);
Monnify::transactions()->status($transactionReference);
Monnify::transactions()->statusByReference($reference, $referenceType);

$response = Monnify::transactions()->initialise([
    'amount'             => 5000.00,
    'customerName'       => 'Jane Doe',
    'customerEmail'      => '[email protected]',
    'paymentReference'   => 'ORDER-' . uniqid(),   // must be unique per transaction, you can also change the prefix from ORDER- to anything else.
    'paymentDescription' => 'Payment for Order #1042',
    'currencyCode'       => 'NGN',
    'contractCode'       => config('monnify.contract_code'),
    'redirectUrl'        => 'https://yoursite.com/payment/callback', //this tells the package where to redirect on successful completion
    'paymentMethods'     => ['CARD', 'ACCOUNT_TRANSFER'],  // optional
]);

// Redirect the customer to Monnify's checkout page
return redirect($response['body']['responseBody']['checkoutUrl']);

$response = Monnify::transactions()->payWithBankTransfer([
    'transactionReference' => 'MONNIFY_TXN_REF',  // from initialise() response
    'bankCode'             => '058',               // optional — specific bank
]);

$response = Monnify::transactions()->chargeCard([
    'transactionReference' => 'MONNIFY_TXN_REF',
    'collectionChannel'    => 'API_NOTIFICATION',
    'card' => [
        'number'      => '4111111111111111',
        'pin'         => '1234',
        'expiryMonth' => '10',
        'expiryYear'  => '2029',
        'cvv'         => '123',
    ],
]);

$response = Monnify::transactions()->authorizeOTP([
    'transactionReference' => 'MONNIFY_TXN_REF',
    'collectionChannel'    => 'API_NOTIFICATION',
    'tokenId'              => 'TOKEN_ID_FROM_CHARGE_RESPONSE',
    'token'                => '123456',
]);

$response = Monnify::transactions()->authorizeThreeDSCard([
    'transactionReference' => 'MONNIFY_TXN_REF',
    'collectionChannel'    => 'API_NOTIFICATION',
    'card' => [
        'number'      => '4111111111111111',
        'pin'         => '1234',
        'expiryMonth' => '10',
        'expiryYear'  => '31',
        'cvv'         => '100',
    ],
    'apiKey'            => config('monnify.api_key'),
    'deviceInformation' => [
        // Collect these from the customer's browser using JavaScript
        'httpBrowserLanguage'          => 'en-US',       // navigator.language
        'httpBrowserJavaEnabled'       => false,          // navigator.javaEnabled()
        'httpBrowserJavaScriptEnabled' => true,           // always true if JS is running
        'httpBrowserColorDepth'        => '24',           // screen.colorDepth
        'httpBrowserScreenHeight'      => '900',          // screen.height
        'httpBrowserScreenWidth'       => '1440',         // screen.width
        'httpBrowserTimeDifference'    => '-60',          // new Date().getTimezoneOffset()
        'userAgentBrowserValue'        => 'Mozilla/5.0', // navigator.userAgent
    ],
]);

$response = Monnify::transactions()->all([
    'page'             => 0,
    'size'             => 20,
    'paymentStatus'    => 'PAID',       // optional filter
    'customerEmail'    => '[email protected]', // optional filter
]);

// By Monnify transaction reference
$response = Monnify::transactions()->status('MONNIFY_TXN_REF');

// By your own payment or transaction reference
$response = Monnify::transactions()->statusByReference('ORDER-123', 'payment');
// $referenceType is either 'transaction' (default) or 'payment'

Monnify::customerReservedAccount()->createGeneralAccount($data);
Monnify::customerReservedAccount()->createInvoiceAccount($data);
Monnify::customerReservedAccount()->get($accountReference);
Monnify::customerReservedAccount()->addLinkedAccounts($accountReference, $data);
Monnify::customerReservedAccount()->updateBVN($accountReference, $bvn);
Monnify::customerReservedAccount()->updateKYCInfo($accountReference, $data);
Monnify::customerReservedAccount()->allowedPaymentSource($accountReference, $data);
Monnify::customerReservedAccount()->updateSplitConfig($accountReference, $data);
Monnify::customerReservedAccount()->deallocateAccount($accountReference);
Monnify::customerReservedAccount()->transactions($accountReference, $parameters);

$response = Monnify::customerReservedAccount()->createGeneralAccount([
    'accountReference'    => 'CUSTOMER-001',        // your unique reference for this account
    'accountName'         => 'Jane Doe',
    'currencyCode'        => 'NGN',
    'contractCode'        => config('monnify.contract_code'),
    'customerEmail'       => '[email protected]',
    'customerName'        => 'Jane Doe',
    'getAllAvailableBanks' => true,
    // 'preferredBanks'   => ['035', '058'],         // optional — pick specific banks
    // 'bvn'              => '12345678901',           // optional
]);

$response = Monnify::customerReservedAccount()->createInvoiceAccount([
    'contractCode'        => config('monnify.contract_code'),
    'accountName'         => 'Jane Doe',
    'currencyCode'        => 'NGN',
    'accountReference'    => 'INVOICE-ACCT-001',
    'customerEmail'       => '[email protected]',
    'reservedAccountType' => 'INVOICE',
    // 'customerName'     => 'Jane Doe',             // optional
    // 'bvn'              => '12345678901',           // optional
]);

$response = Monnify::customerReservedAccount()->get('CUSTOMER-001');

$response = Monnify::customerReservedAccount()->addLinkedAccounts('CUSTOMER-001', [
    'getAllAvailableBanks' => true,
    // 'preferredBanks'   => ['044'],   // optional
]);

$response = Monnify::customerReservedAccount()->updateBVN('CUSTOMER-001', '12345678901');

$response = Monnify::customerReservedAccount()->updateKYCInfo('CUSTOMER-001', [
    'bvn' => '12345678901',
    'nin' => '00000000000',   // optional if bvn is provided
]);

$response = Monnify::customerReservedAccount()->allowedPaymentSource('CUSTOMER-001', [
    'restrictPaymentSource' => true,
    'allowedPaymentSources' => [
        'bvns' => ['12345678901', '09876543210'],
    ],
]);

$response = Monnify::customerReservedAccount()->updateSplitConfig('CUSTOMER-001', [
    [
        'subAccountCode'        => 'MFY_SUB_305040939040',
        'feePercentage'         => 10.50,
        'splitPercentage'       => 30.00,
        'feeBearer'             => true,
    ],
]);

$response = Monnify::customerReservedAccount()->transactions('CUSTOMER-001', [
    'page' => 0,
    'size' => 10,
]);

$response = Monnify::customerReservedAccount()->deallocateAccount('CUSTOMER-001');

Monnify::invoice()->create($data);
Monnify::invoice()->get($invoiceReference);
Monnify::invoice()->all();
Monnify::invoice()->cancel($invoiceReference);
Monnify::invoice()->attachReservedAccount($data);

$response = Monnify::invoice()->create([
    'amount'           => 15000.00,
    'customerName'     => 'Jane Doe',
    'customerEmail'    => '[email protected]',
    'expiryDate'       => '2025-12-31 23:59:59',
    'invoiceReference' => 'INV-' . uniqid(),
    'description'      => 'Subscription - Pro Plan',
    'currencyCode'     => 'NGN',
    'contractCode'     => config('monnify.contract_code'),
    // 'redirectUrl'   => 'https://yoursite.com/invoice/callback',  // optional
    // 'incomeSplitConfig' => [],                                    // optional
]);

$response = Monnify::invoice()->get('INV-6630abc');

$response = Monnify::invoice()->all();

$response = Monnify::invoice()->cancel('INV-6630abc');

$response = Monnify::invoice()->attachReservedAccount([
    'amount'           => 15000.00,
    'invoiceReference' => 'INV-6630abc',
    'accountReference' => 'CUSTOMER-001',
    'description'      => 'Subscription - Pro Plan',
    'currencyCode'     => 'NGN',
    'contractCode'     => config('monnify.contract_code'),
    'customerEmail'    => '[email protected]',
    'customerName'     => 'Jane Doe',
    'expiryDate'       => '2025-12-31 23:59:59',
]);

Monnify::transfer()->single($data, $asynchronous);
Monnify::transfer()->authoriseSingle($data);
Monnify::transfer()->resendOTP($reference);
Monnify::transfer()->singleStatus($reference);
Monnify::transfer()->bulk($data);
Monnify::transfer()->authoriseBulk($data);
Monnify::transfer()->bulkResendOTP($reference);
Monnify::transfer()->bulkStatus($batchReference, $pageSize, $pageNumber);
Monnify::transfer()->bulkBatchSummary($batchReference);
Monnify::transfer()->bulkTransaction($batchReference, $pageSize, $pageNumber);
Monnify::transfer()->all($type, $pageSize, $pageNumber);
Monnify::transfer()->search($sourceAccountNumber, $pageSize, $pageNumber);
Monnify::transfer()->walletBalance($accountNumber);

$response = Monnify::transfer()->single([
    'amount'                  => 5000.00,
    'reference'               => 'TXN-' . uniqid(),      // your unique reference
    'narration'               => 'Salary - May 2025',
    'destinationBankCode'     => '058',
    'destinationAccountNumber'=> '0123456789',
    'destinationAccountName'  => 'John Doe',
    'currency'                => 'NGN',
    'sourceAccountNumber'     => config('monnify.account_number'),
], $asynchronous = false);

$response = Monnify::transfer()->authoriseSingle([
    'reference'         => 'TXN-abc123',
    'authorizationCode' => '123456',     // OTP sent to your registered email
]);

$response = Monnify::transfer()->resendOTP('TXN-abc123');

$response = Monnify::transfer()->singleStatus('TXN-abc123');

$response = Monnify::transfer()->bulk([
    'title'               => 'May 2025 Salaries',
    'batchReference'      => 'BATCH-' . uniqid(),
    'narration'           => 'Monthly salary payment',
    'sourceAccountNumber' => config('monnify.account_number'),
    'onValidationFailure' => 'CONTINUE',  // CONTINUE or BREAK
    'notificationInterval'=> 25,          // notify after every 25% of transactions
    'transactionList'     => [
        [
            'amount'                   => 50000.00,
            'reference'                => 'SAL-EMP001',
            'narration'                => 'Salary - John',
            'destinationBankCode'      => '058',
            'destinationAccountNumber' => '0123456789',
            'currency'                 => 'NGN',
        ],
        [
            'amount'                   => 75000.00,
            'reference'                => 'SAL-EMP002',
            'narration'                => 'Salary - Mary',
            'destinationBankCode'      => '033',
            'destinationAccountNumber' => '9876543210',
            'currency'                 => 'NGN',
        ],
    ],
]);

$response = Monnify::transfer()->authoriseBulk([
    'reference'         => 'BATCH-abc123',
    'authorizationCode' => '123456',
]);

$response = Monnify::transfer()->bulkResendOTP('BATCH-abc123');

$response = Monnify::transfer()->bulkStatus('BATCH-abc123', $pageSize = 10, $pageNumber = 0);

$response = Monnify::transfer()->bulkBatchSummary('BATCH-abc123');

// List single transfers
$response = Monnify::transfer()->all('single', $pageSize = 10, $pageNumber = 0);

// List bulk transfers
$response = Monnify::transfer()->all('bulk', $pageSize = 10, $pageNumber = 0);

$response = Monnify::transfer()->search(
    config('monnify.account_number'),
    $pageSize = 10,
    $pageNumber = 0
);

$response = Monnify::transfer()->walletBalance(config('monnify.account_number'));

Monnify::wallet()->create($data);
Monnify::wallet()->get($customerEmail, $pageSize, $pageNumber);
Monnify::wallet()->balance($accountNumber);
Monnify::wallet()->transactions($accountNumber, $pageSize, $pageNumber);

$response = Monnify::wallet()->create([
    'customerEmail' => '[email protected]',
    'customerName'  => 'Jane Doe',
    'bvnDetails'    => [
        'bvn'            => '22222222226',
        'bvnDateOfBirth' => '1994-09-07',
    ],
]);

$response = Monnify::wallet()->get('[email protected]', $pageSize = 10, $pageNumber = 0);

$response = Monnify::wallet()->balance('0123456789');

$response = Monnify::wallet()->transactions('0123456789', $pageSize = 10, $pageNumber = 0);

Monnify::verificationAPI()->bankAccount($accountNumber, $bankCode);
Monnify::verificationAPI()->bvnInformation($data);
Monnify::verificationAPI()->matchBVNAndBankAccount($bvn, $bankCode, $accountNumber);
Monnify::verificationAPI()->nin($nin);

$response = Monnify::verificationAPI()->bankAccount('0123456789', '058');

$accountName = $response['body']['responseBody']['accountName'];

$response = Monnify::verificationAPI()->bvnInformation([
    'bvn'         => '12345678901',
    'name'        => 'Jane Doe',
    'dateOfBirth' => '1990-01-15',    // YYYY-MM-DD
    'mobileNo'    => '08012345678',
]);

$response = Monnify::verificationAPI()->matchBVNAndBankAccount(
    '12345678901',   // BVN
    '058',           // bank code
    '0123456789'     // account number
);

$response = Monnify::verificationAPI()->nin('00000000000');

Monnify::subAccount()->create($data);
Monnify::subAccount()->all();
Monnify::subAccount()->update($data);
Monnify::subAccount()->delete($subAccountCode);

$response = Monnify::subAccount()->create([
    [
        'bankCode'               => '058',
        'accountNumber'          => '0123456789',
        'email'                  => '[email protected]',
        'currencyCode'           => 'NGN',
        'defaultSplitPercentage' => 20.00,
    ],
]);

$response = Monnify::subAccount()->all();

$response = Monnify::subAccount()->update([
    'subAccountCode'         => 'MFY_SUB_305040939040',
    'bankCode'               => '033',
    'accountNumber'          => '9876543210',
    'email'                  => '[email protected]',
    'currencyCode'           => 'NGN',
    'defaultSplitPercentage' => 25.00,
]);

$response = Monnify::subAccount()->delete('MFY_SUB_305040939040');

Monnify::refund()->initialise($data);
Monnify::refund()->status($refundReference);
Monnify::refund()->all($pageSize, $pageNumber);

$response = Monnify::refund()->initialise([
    'transactionReference' => 'MONNIFY_TXN_REF',       // original transaction
    'refundReference'      => 'REFUND-' . uniqid(),     // your unique refund reference
    'refundReason'         => 'Customer request',
    'refundAmount'         => 5000.00,
    'customerNote'         => 'Refund processed within 3 business days',
    // 'destinationAccountNumber' => '0123456789',       // optional — defaults to original payer
    // 'destinationAccountBankCode' => '058',            // optional
]);

$response = Monnify::refund()->status('REFUND-abc123');

$response = Monnify::refund()->all($pageSize = 10, $pageNumber = 0);

Monnify::settlements()->transactions($settlementReference, $pageSize, $pageNumber);
Monnify::settlements()->getByTransaction($transactionReference);

$response = Monnify::settlements()->transactions('SETTLEMENT-REF', $pageSize = 10, $pageNumber = 0);

$response = Monnify::settlements()->getByTransaction('MONNIFY_TXN_REF');

Monnify::limitProfile()->all();
Monnify::limitProfile()->create($data);
Monnify::limitProfile()->update($limitProfileCode, $data);
Monnify::limitProfile()->reserveAccount($data);
Monnify::limitProfile()->updateReserveAccount($accountReference, $limitProfileCode);

$response = Monnify::limitProfile()->all();

$response = Monnify::limitProfile()->create([
    'limitProfileName'      => 'Tier 1 - Unverified',
    'singleTransactionLimit'=> 50000.00,
    'dailyTransactionLimit' => 200000.00,
    'dailyTransactionVolume'=> 5,
]);

$response = Monnify::limitProfile()->update('LIMIT-PROFILE-CODE', [
    'limitProfileName'      => 'Tier 1 - Upgraded',
    'singleTransactionLimit'=> 100000.00,
    'dailyTransactionLimit' => 500000.00,
    'dailyTransactionVolume'=> 10,
]);

$response = Monnify::limitProfile()->reserveAccount([
    'accountReference' => 'CUSTOMER-001',
    'limitProfileCode' => 'LIMIT-PROFILE-CODE',
    'contractCode'     => config('monnify.contract_code'),
    'accountName'      => 'Jane Doe',
]);

$response = Monnify::limitProfile()->updateReserveAccount('CUSTOMER-001', 'LIMIT-PROFILE-CODE');

Monnify::payCodeAPI()->create($data);
Monnify::payCodeAPI()->get($payCodeReference);
Monnify::payCodeAPI()->getUnMasked($payCodeReference);
Monnify::payCodeAPI()->history($parameters);
Monnify::payCodeAPI()->delete($payCodeReference);

$response = Monnify::payCodeAPI()->create([
    'amount'           => 10000.00,
    'paycodeReference' => 'PAYCODE-' . uniqid(),
    'beneficiaryName'  => 'John Doe',
    'clientId'         => 'YOUR_CLIENT_ID',
    'expiryDate'       => '2025-12-31',
]);

// Masked (safe to display)
$response = Monnify::payCodeAPI()->get('PAYCODE-abc123');

// Unmasked (full code — handle with care)
$response = Monnify::payCodeAPI()->getUnMasked('PAYCODE-abc123');

$response = Monnify::payCodeAPI()->history([
    'transactionReference' => '',       // optional
    'beneficiaryName'      => '',       // optional
    'transactionStatus'    => 'PAID',   // optional
    'from'                 => '2025-01-01',
    'to'                   => '2025-05-31',
]);

$response = Monnify::payCodeAPI()->delete('PAYCODE-abc123');

Monnify::directDebitMandate()->create($data);
Monnify::directDebitMandate()->get($mandateReference);
Monnify::directDebitMandate()->debit($data);
Monnify::directDebitMandate()->status($paymentReference);
Monnify::directDebitMandate()->cancel($mandateCode);

$response = Monnify::directDebitMandate()->create([
    'contractCode'           => config('monnify.contract_code'),
    'mandateReference'       => 'MANDATE-' . uniqid(),
    'customerName'           => 'Jane Doe',
    'customerPhoneNumber'    => '08012345678',
    'customerEmailAddress'   => '[email protected]',
    'customerAddress'        => '12 Example Street, Lagos',
    'customerAccountNumber'  => '0123456789',
    'customerAccountBankCode'=> '058',
    'mandateDescription'     => 'Monthly subscription fee',
    'mandateStartDate'       => '2025-06-01T00:00:00',
    'mandateEndDate'         => '2026-06-01T00:00:00',
    // 'autoRenew'           => false,  // optional
    // 'customerCancellation'=> true,   // optional — allow customer to cancel
    // 'customerAccountName' => 'Jane Doe',  // optional
]);

$response = Monnify::directDebitMandate()->get('MANDATE-abc123');

$response = Monnify::directDebitMandate()->debit([
    'mandateCode'      => 'MONNIFY_MANDATE_CODE',  // from create response
    'amount'           => 5000.00,
    'paymentReference' => 'PAY-' . uniqid(),
    'narration'        => 'June 2025 subscription',
    'customerEmail'    => '[email protected]',
]);

$response = Monnify::directDebitMandate()->status('PAY-abc123');

$response = Monnify::directDebitMandate()->cancel('MONNIFY_MANDATE_CODE');

Monnify::recurringPayment()->chargeCardToken($data);

$response = Monnify::recurringPayment()->chargeCardToken([
    'cardToken'          => 'MNFY_TOKEN_FROM_REQUERY',   // stored from requery after first charge
    'amount'             => 5000.00,
    'customerEmail'      => '[email protected]',
    'paymentReference'   => 'RECUR-' . uniqid(),
    'contractCode'       => config('monnify.contract_code'),
    'apiKey'             => config('monnify.api_key'),
    // 'customerName'       => 'Jane Doe',        // optional
    // 'paymentDescription' => 'Monthly plan',    // optional
    // 'currencyCode'       => 'NGN',             // optional
]);

Monnify::billsPayment()->categories($pageSize, $pageNumber);
Monnify::billsPayment()->billers($categoryCode, $pageSize, $pageNumber);
Monnify::billsPayment()->products($billerCode, $pageSize, $pageNumber);
Monnify::billsPayment()->validateCustomer($data);
Monnify::billsPayment()->vend($data);
Monnify::billsPayment()->requery($vendReference);

$response = Monnify::billsPayment()->categories();

// Example categories: ELECTRICITY, CABLE_TV, AIRTIME, DATA, BETTING, EDUCATION

// All billers
$response = Monnify::billsPayment()->billers();

// Billers in a specific category
$response = Monnify::billsPayment()->billers('ELECTRICITY');

$response = Monnify::billsPayment()->products('IKEDC');
// Returns the available payment packages/plans for that biller

$validation = Monnify::billsPayment()->validateCustomer([
    'productCode' => 'IKEDC_PREPAID',     // from products() response
    'customerId'  => '1234567890',         // meter number / decoder ID / betting ID
]);

$customerName        = $validation['body']['responseBody']['customerName'];
$

$response = Monnify::billsPayment()->vend([
    'productCode'   => 'IKEDC_PREPAID',
    'customerId'    => '1234567890',
    'vendAmount'    => 5000.00,
    'vendReference' => 'BILL-' . uniqid(),      // your unique reference for this transaction

    // Include this only if validateCustomer() returned 

$response = Monnify::billsPayment()->requery('BILL-abc123');

use Monnify\MonnifyLaravel\Facades\Monnify;

// 1. Validate the customer's meter number
$validation = Monnify::billsPayment()->validateCustomer([
    'productCode' => 'IKEDC_PREPAID',
    'customerId'  => '45210012345',
]);

if ($validation['status'] !== 200) {
    return response()->json(['message' => 'Invalid meter number'], 422);
}

$validationBody      = $validation['body']['responseBody'];
$validationReference = $validationBody['validationReference'] ?? null;

// 2. Process the payment
$vend = Monnify::billsPayment()->vend([
    'productCode'         => 'IKEDC_PREPAID',
    'customerId'          => '45210012345',
    'vendAmount'          => 5000.00,
    'vendReference'       => 'BILL-' . uniqid(),
    'validationReference' => $validationReference,
]);

$status = $vend['body']['responseBody']['vendStatus'];

// 3. Handle IN_PROGRESS status
if ($status === 'IN_PROGRESS') {
    // The vend is still processing. In production, dispatch a queued job
    // that calls requery() after a short delay instead of blocking here.
    $vend   = Monnify::billsPayment()->requery($vend['body']['responseBody']['vendReference']);
    $status = $vend['body']['responseBody']['vendStatus'];
}

if ($status === 'SUCCESSFUL') {
    $token = $vend['body']['responseBody']['token'];   // electricity token to give the customer
    return response()->json(['token' => $token]);
}

return response()->json(['message' => 'Bill payment failed'], 400);

Monnify::helper()->banks();          // All banks supported by Monnify
Monnify::helper()->banksWithUSSD();  // Banks that support USSD payment collection
bash
php artisan vendor:publish --provider="Monnify\MonnifyLaravel\MonnifyServiceProvider"