putralangkat97 / indopay-php
Framework-agnostic PHP payment gateway package for Indonesian payment providers.
Requires
- php: ^8.1
- ext-json: *
- guzzlehttp/guzzle: ^7.8
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
- squizlabs/php_codesniffer: ^3.10
This package is not auto-updated.
Last update: 2026-07-16 08:41:09 UTC
README
indopay-php adalah package payment gateway PHP yang framework-agnostic untuk integrasi pembayaran Indonesia.
Rilis v1 fokus ke Core PHP dan driver Xendit Payment Requests v3. Package ini memakai Guzzle untuk request HTTP langsung ke Xendit, tanpa bergantung pada SDK resmi Xendit.
Fitur v1
- Membuat Xendit payment request untuk satu channel pembayaran.
- Mengambil status pembayaran berdasarkan payment request ID.
- Memproses webhook payment request dari Xendit.
- Validasi webhook dengan header
x-callback-token. - DTO dan enum sederhana untuk response, webhook, refund, dan status.
PaymentManagersebagai wrapper opsional di atas gateway.
Refund Xendit Payment Requests belum didukung di v1. Method refund() sudah ada di contract, tetapi driver Xendit akan melempar NotSupportedException.
Requirement
- PHP
^8.1 - Composer
- Akun Xendit
- Xendit secret key
- Xendit callback token untuk validasi webhook
Instalasi
composer require putralangkat97/indopay-php
Jika project belum memuat Composer autoload, panggil autoloader lebih dulu:
<?php require __DIR__ . '/vendor/autoload.php';
Quick Start
1. Create Gateway
Simpan secret key dan callback token di environment variable.
<?php require __DIR__ . '/vendor/autoload.php'; use PutraLangkat\Indopay\Indopay; $gateway = Indopay::make('xendit', [ 'secret_key' => $_ENV['XENDIT_SECRET_KEY'], 'callback_token' => $_ENV['XENDIT_CALLBACK_TOKEN'] ?? null, ]);
2. Create Payment Response
<?php $response = $gateway->charge( externalId: 'order-1001', amount: 150000, payerEmail: 'buyer@example.com', description: 'Order #1001', paymentMethods: 'qris', successRedirectUrl: 'https://merchant.test/checkout/success', failureRedirectUrl: 'https://merchant.test/checkout/failed', callbackUrl: 'https://merchant.test/webhooks/xendit', metadata: ['order_id' => 'order-1001'], );
Xendit Payment Requests v3 membutuhkan satu channel per request. Kirim paymentMethods sebagai string atau array berisi satu item, misalnya qris, dana, ovo, shopee_pay, atau credit_card.
$response memakai struktur standar dari indopay-php. Data asli dari gateway tetap tersedia penuh di raw.
<?php $response->provider; // xendit $response->id; // payment request ID $response->externalId; // order-1001 $response->status; // PaymentStatus enum $response->amount; // 150000 $response->checkoutUrl; // checkout/payment link $response->raw; // full response asli Xendit $array = $response->toArray();
3. Webhook Result
<?php use PutraLangkat\Indopay\DTO\WebhookPayload; $result = $gateway->handleWebhook(new WebhookPayload( headers: getallheaders(), body: file_get_contents('php://input') ?: '' )); $array = $result->toArray();
WebhookResult::$raw berisi payload webhook mentah. Untuk webhook Payment dari Xendit seperti payment.capture, payment.authorization, dan payment.failure, $result->payment->raw berisi object payment di field data. Untuk payload lama tanpa envelope, $result->payment->raw tetap berisi payload yang sama dengan $result->raw.
Response Shape
ChargeResponse dan PaymentDetails punya top-level shape yang sama:
[
'provider' => 'xendit',
'id' => 'pr-...',
'externalId' => 'order-...',
'status' => 'pending',
'amount' => 150000,
'checkoutUrl' => 'https://...',
'raw' => [
// full response asli gateway
],
]
status di object adalah enum PaymentStatus. Di toArray(), status dikembalikan sebagai string value seperti pending, paid, atau settled.
Dokumentasi Detail
Development
composer install
composer validate --strict
composer test
composer lint