PHP code example of elgibor-solution / laravel-payment-bni
1. Go to this page and download the library: Download elgibor-solution/laravel-payment-bni 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/ */
elgibor-solution / laravel-payment-bni example snippets
return [
'hostname' => env('BNI_HOSTNAME', 'api.bni-ecollection.com'),
'hostname_staging' => env('BNI_HOSTNAME_STAGING', 'apibeta.bni-ecollection.com'),
'port' => (int) env('BNI_PORT', 443),
'origin' => env('BNI_ORIGIN', 'your-origin'),
'client_id' => env('BNI_CLIENT_ID', '320'),
'timeout' => (int) env('BNI_TIMEOUT', 15),
'verify_ssl' => (bool) env('BNI_VERIFY_SSL', true),
'debug' => (bool) env('BNI_DEBUG', false),
'snap' => [
'base_url' => env('BNI_SNAP_BASE_URL', 'https://merchant-api.qris-bni.com/apisnap'),
'base_url_staging' => env('BNI_SNAP_BASE_URL_STAGING', 'https://qris-merchant-api.spesandbox.com/apisnap'),
'version' => env('BNI_SNAP_VERSION', 'v1.0'),
'client_id' => env('BNI_SNAP_CLIENT_ID', env('BNI_CLIENT_ID')),
'client_key' => env('BNI_SNAP_CLIENT_KEY', env('BNI_CLIENT_ID')),
'client_secret' => env('BNI_SNAP_CLIENT_SECRET', ''),
'partner_id' => env('BNI_SNAP_PARTNER_ID', ''),
'private_key_path' => env('BNI_SNAP_PRIVATE_KEY_PATH', storage_path('app/bni/snap_private_key.pem')),
'public_key_path' => env('BNI_SNAP_PUBLIC_KEY_PATH', storage_path('app/bni/snap_public_key.pem')),
'signature_type' => (int) env('BNI_SNAP_SIGNATURE_TYPE', 1),
'timeout' => (int) env('BNI_SNAP_TIMEOUT', env('BNI_TIMEOUT', 15)),
'verify_ssl' => (bool) env('BNI_SNAP_VERIFY_SSL', env('BNI_VERIFY_SSL', true)),
],
'routes' => [
'prefix' => env('BNI_ROUTE_PREFIX', ''),
'middleware' => ['api'],
],
'qris' => [
'merchant_id' => env('BNI_QRIS_MERCHANT_ID', ''),
'terminal_id' => env('BNI_QRIS_TERMINAL_ID', ''),
'path_access_token' => env('BNI_QRIS_PATH_ACCESS_TOKEN', '/access-token/b2b'),
'path_generate_qr' => env('BNI_QRIS_PATH_GENERATE_QR', '/v1.0/debit/payment-qr/qr-mpm'),
'path_query_payment' => env('BNI_QRIS_PATH_QUERY_PAYMENT', '/v1.0/debit/payment-qr/qr-mpm/status'),
// fallback lama
'path_create_dynamic' => '/qris/create',
'path_inquiry_status' => '/qris/inquiry',
],
'schedule' => [
'enabled' => env('BNI_SCHEDULE_ENABLED', false),
'cron' => env('BNI_SCHEDULE_CRON', '*/5 * * * *'),
],
];
'bni_va' => [
'client_id' => env('BNI_VA_CLIENT_ID', env('BNI_CLIENT_ID')),
'secret' => env('BNI_VA_SECRET', ''),
'prefix' => env('BNI_VA_PREFIX', ''),
],
use ESolution\BNIPayment\Clients\BniVaClient;
$clientId = config('services.bni_va.client_id'); // atau config('bni.client_id')
$secret = config('services.bni_va.secret');
$prefix = config('services.bni_va.prefix', '');
$client = app(BniVaClient::class);
$response = $client->createVa([
'type' => 'createbilling',
'client_id' => $clientId,
'trx_id' => 'INV-2025-0001', // unique per invoice
'trx_amount' => '150000', // tanpa desimal
'billing_type' => 'c', // 'c' = closed / fixed amount
'customer_name' => 'PT Pelanggan Makmur',
'customer_email' => '[email protected] ',
'customer_phone' => '08123456789',
'datetime_expired' => '2025-12-31 23:59:00',
'description' => 'Tagihan langganan SaaS bulan Desember 2025',
], $clientId, $prefix, $secret);
$response = $client->updateVa([
'type' => 'updatebilling',
'client_id' => $clientId,
'trx_id' => 'INV-2025-0001',
'trx_amount' => '200000',
'customer_name' => 'PT Pelanggan Makmur',
'customer_email' => '[email protected] ',
'customer_phone' => '08123456789',
'billing_type' => 'c',
'description' => 'Update nominal tagihan',
'datetime_expired' => '2026-01-15 23:59:00',
], $clientId, $prefix, $secret);
$response = $client->inquiryVa('INV-2025-0001', $clientId, $prefix, $secret);
// Contoh akses data:
$status = $response['status'] ?? null;
$paidAmt = $response['payment_amount'] ?? null;
protected $listen = [
\ESolution\BNIPayment\Events\BniPaymentReceived::class => [
\App\Listeners\HandleBniPaymentReceived::class,
],
];
namespace App\Listeners;
use ESolution\BNIPayment\Events\BniPaymentReceived;
class HandleBniPaymentReceived
{
public function handle(BniPaymentReceived $event)
{
$payload = $event->payload;
// contoh: tandai invoice sebagai paid
$trxId = $payload['trx_id'] ?? null;
if ($trxId) {
// update invoice internal kamu di sini
}
}
}
protected function schedule(Schedule $schedule)
{
if (config('bni.schedule.enabled')) {
$schedule->command('bni:reconcile')->cron(config('bni.schedule.cron'));
}
}
use ESolution\BNIPayment\Clients\BniQrisClient;
$qris = new BniQrisClient();
$response = $qris->generateQr([
'partnerReferenceNo' => 'INV-2025-0001',
'amount' => [
'value' => '15000.00',
'currency' => 'IDR',
],
'merchantId' => config('bni.qris.merchant_id'),
'terminalId' => config('bni.qris.terminal_id'),
'validityPeriod'=> '2025-12-31T23:59:00+07:00',
'additionalInfo'=> [
'additionalData' => 'Tagihan SaaS Desember 2025',
],
]);
$qrContent = $response['qrContent'] ?? null;
// cukup dengan partnerReferenceNo
$response = $qris->queryPayment('INV-2025-0001');
// atau dengan payload lengkap
$response = $qris->queryPayment([
'partnerReferenceNo' => 'INV-2025-0001',
]);
$status = $response['responseCode'] ?? null;
use ESolution\BNIPayment\Services\BniSnapAuth;
$token = BniSnapAuth::getAccessToken();
bash
php artisan vendor:publish --provider="ESolution\BNIPayment\BNIPaymentServiceProvider"
php artisan vendor:publish --provider="ESolution\BNIPayment\BNIPaymentServiceProvider" --tag=bni-migrations
php artisan migrate
text
POST /bni/va/payment-notification
bash
php artisan bni:reconcile
bash
php artisan test
bash
php artisan tinker
>>> app(ESolution\BNIPayment\Clients\BniVaClient::class)->createVa([...]);
>>> app(ESolution\BNIPayment\Clients\BniQrisClient::class)->generateQr([...]);