putralangkat97/indopay-php

Framework-agnostic PHP payment gateway package for Indonesian payment providers.

Maintainers

Package info

github.com/putralangkat97/indopay-php

pkg:composer/putralangkat97/indopay-php

Transparency log

Statistics

Installs: 4

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v0.2.0-alpha-1 2026-06-04 08:02 UTC

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.
  • PaymentManager sebagai 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