PHPackages                             abdasis/laravel-duitku - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. abdasis/laravel-duitku

ActiveLibrary[Payment Processing](/categories/payments)

abdasis/laravel-duitku
======================

Laravel payment gateway integration for Duitku with polymorphic payable support.

08↓33.3%PHP

Since Apr 4Pushed 1mo agoCompare

[ Source](https://github.com/abdasis/laravel-duitku)[ Packagist](https://packagist.org/packages/abdasis/laravel-duitku)[ RSS](/packages/abdasis-laravel-duitku/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Laravel Duitku
==============

[](#laravel-duitku)

Package Laravel untuk integrasi payment gateway **Duitku** dengan dukungan **polymorphic payable** — model apapun (User, Team, Order) bisa punya pembayaran.

Fitur
-----

[](#fitur)

- **Polymorphic Payable** — Tidak hardcode ke User/Order, model apapun bisa bayar
- **POP (Popup) &amp; Direct API** — Support VA, QRIS, retail outlet, dan popup payment
- **Event-Driven** — `PaymentSuccess`, `PaymentFailed`, `PaymentExpired` otomatis dispatch saat callback
- **Auto-Registered Webhook** — Route `POST /duitku/callback` langsung aktif
- **Facade Support** — `Duitku::createPayment()`, `Duitku::checkStatus()`
- **Signature Verification Middleware** — Validasi otomatis callback dari Duitku
- **Configurable** — Table name, route prefix, expiry period bisa disesuaikan

Persyaratan
-----------

[](#persyaratan)

- PHP 8.2+
- Laravel 11 atau 12

Instalasi
---------

[](#instalasi)

### Via GitHub (Private/Local)

[](#via-github-privatelocal)

Tambahkan repository di `composer.json` project kamu:

```
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/abdasis/laravel-duitku"
        }
    ]
}
```

Lalu install:

```
composer require abdasis/laravel-duitku:dev-main
```

### Via Path (Development Lokal)

[](#via-path-development-lokal)

```
{
    "repositories": [
        {
            "type": "path",
            "url": "packages/abdasis/laravel-duitku"
        }
    ]
}
```

```
composer require abdasis/laravel-duitku:@dev
```

Konfigurasi
-----------

[](#konfigurasi)

### 1. Publish Config

[](#1-publish-config)

```
php artisan vendor:publish --tag=duitku-config
```

File `config/duitku.php` akan muncul:

```
return [
    'merchant_code' => env('DUITKU_MERCHANT_CODE'),
    'api_key'       => env('DUITKU_API_KEY'),
    'sandbox'       => env('DUITKU_SANDBOX', true),
    'expiry_period' => env('DUITKU_EXPIRY_PERIOD', 60),
    'base_url'      => env('DUITKU_SANDBOX', true)
        ? 'https://api-sandbox.duitku.com'
        : 'https://api-prod.duitku.com',
    'route_prefix'  => 'duitku',
    'table_name'    => 'payments',
];
```

### 2. Environment Variables

[](#2-environment-variables)

Tambahkan ke file `.env`:

```
DUITKU_MERCHANT_CODE=your_merchant_code
DUITKU_API_KEY=your_api_key
DUITKU_SANDBOX=true
DUITKU_EXPIRY_PERIOD=60
```

### 3. Jalankan Migrasi

[](#3-jalankan-migrasi)

Migrasi otomatis di-load dari package. Cukup jalankan:

```
php artisan migrate
```

Jika ingin kustomisasi migration:

```
php artisan vendor:publish --tag=duitku-migrations
```

Penggunaan
----------

[](#penggunaan)

### Membuat Pembayaran (POP/Popup)

[](#membuat-pembayaran-poppopup)

```
use Abdasis\Duitku\Facades\Duitku;

$payment = Duitku::createPayment($user, [
    'amount'          => 150000,
    'product_details' => 'Langganan Premium',
    'customer_name'   => $user->name,
    'customer_email'  => $user->email,
    'customer_phone'  => '081234567890',
    'callback_url'    => route('duitku.callback'),
    'return_url'      => route('payment.success'),
    'metadata'        => ['plan_id' => 3],
]);

// Redirect user ke halaman pembayaran Duitku
return redirect($payment->payment_url);
```

### Membuat Pembayaran Direct (VA/QRIS/Retail)

[](#membuat-pembayaran-direct-vaqrisretail)

```
$payment = Duitku::createDirectPayment($user, [
    'amount'          => 200000,
    'payment_method'  => 'VA', // kode metode pembayaran Duitku
    'product_details' => 'Langganan Gold',
    'customer_name'   => $user->name,
    'customer_email'  => $user->email,
    'callback_url'    => route('duitku.callback'),
    'return_url'      => route('payment.success'),
]);
```

### Mendapatkan Daftar Metode Pembayaran

[](#mendapatkan-daftar-metode-pembayaran)

```
$methods = Duitku::getPaymentMethods(100000);

// Contoh response:
// [
//     ['paymentMethod' => 'VA', 'paymentName' => 'Virtual Account', 'totalFee' => 4000],
//     ['paymentMethod' => 'QR', 'paymentName' => 'QRIS', 'totalFee' => 1500],
// ]
```

### Cek Status Pembayaran

[](#cek-status-pembayaran)

```
use Abdasis\Duitku\Models\Payment;

$payment = Payment::find(1);
$payment = Duitku::checkStatus($payment);

echo $payment->status->label(); // "Berhasil", "Menunggu Pembayaran", dll.
```

### Polymorphic Payable

[](#polymorphic-payable)

Model apapun bisa jadi "pemilik" pembayaran:

```
// User bayar
Duitku::createPayment($user, [...]);

// Team bayar
Duitku::createPayment($team, [...]);

// Order bayar
Duitku::createPayment($order, [...]);

// Akses relasi
$payment->payable; // returns User, Team, atau Order
```

Event Handling
--------------

[](#event-handling)

Package ini dispatch event otomatis saat menerima callback dari Duitku. Kamu tinggal listen di aplikasi host.

### Event yang Tersedia

[](#event-yang-tersedia)

EventKapan Dispatch`Abdasis\Duitku\Events\PaymentSuccess``resultCode` = `00``Abdasis\Duitku\Events\PaymentFailed``resultCode` selain `00`, `01`, `02``Abdasis\Duitku\Events\PaymentExpired``resultCode` = `02`### Contoh Listener

[](#contoh-listener)

Buat listener:

```
// app/Listeners/HandlePaymentSuccess.php

namespace App\Listeners;

use Abdasis\Duitku\Events\PaymentSuccess;

class HandlePaymentSuccess
{
    public function handle(PaymentSuccess $event): void
    {
        $payment = $event->payment;
        $payable = $payment->payable;

        // Aktivasi langganan, kirim email, update status order, dll.
    }
}
```

Register di `AppServiceProvider`:

```
use Abdasis\Duitku\Events\PaymentSuccess;
use Abdasis\Duitku\Events\PaymentFailed;
use App\Listeners\HandlePaymentSuccess;
use App\Listeners\HandlePaymentFailed;
use Illuminate\Support\Facades\Event;

public function boot(): void
{
    Event::listen(PaymentSuccess::class, HandlePaymentSuccess::class);
    Event::listen(PaymentFailed::class, HandlePaymentFailed::class);
}
```

Callback Route
--------------

[](#callback-route)

Package otomatis mendaftarkan route:

```
POST /duitku/callback  →  duitku.callback

```

Route ini **tidak pakai CSRF** karena dipanggil server-to-server oleh Duitku. Prefix bisa diubah via config `duitku.route_prefix`.

Verifikasi route sudah terdaftar:

```
php artisan route:list --path=duitku
```

Payment Model
-------------

[](#payment-model)

### Status Enum

[](#status-enum)

```
use Abdasis\Duitku\Enums\PaymentStatus;

PaymentStatus::Pending;  // 'pending'  - Menunggu Pembayaran (yellow)
PaymentStatus::Success;  // 'success'  - Berhasil (green)
PaymentStatus::Failed;   // 'failed'   - Gagal (red)
PaymentStatus::Expired;  // 'expired'  - Kedaluarsa (gray)

$status->label();  // "Menunggu Pembayaran"
$status->color();  // "yellow"
```

### Helper Methods

[](#helper-methods)

```
$payment->isPending();  // bool
$payment->isSuccess();  // bool
$payment->isFailed();   // bool
$payment->isExpired();  // bool
```

### Query Scopes

[](#query-scopes)

```
use Abdasis\Duitku\Models\Payment;

Payment::query()->pending()->get();
Payment::query()->success()->count();
Payment::query()->failed()->where('payable_type', User::class)->get();
```

### Metadata

[](#metadata)

Kolom `metadata` (JSON) bisa dipakai untuk menyimpan data tambahan:

```
$payment = Duitku::createPayment($user, [
    'amount' => 100000,
    'metadata' => [
        'subscription_plan_id' => 5,
        'coupon_code' => 'DISC10',
    ],
    // ...
]);

$payment->metadata['subscription_plan_id']; // 5
```

Skema Database
--------------

[](#skema-database)

Tabel `payments` (nama bisa dikonfigurasi):

KolomTipeKeterangan`id`bigintPrimary key`payable_type`stringMorph class (e.g. `App\Models\User`)`payable_id`bigintMorph ID`merchant_order_id`stringUnique, generated otomatis`duitku_order_id`string (nullable)ID dari Duitku`payment_url`string (nullable)URL redirect pembayaran`amount`integerJumlah pembayaran`product_details`string (nullable)Deskripsi produk`payment_method`string (nullable)Kode metode bayar`status`stringpending/success/failed/expired`result_code`string (nullable)Response code dari Duitku`reference`string (nullable)Reference number`metadata`json (nullable)Data tambahan`created_at`timestamp`updated_at`timestampMiddleware (Opsional)
---------------------

[](#middleware-opsional)

Jika ingin verifikasi signature di route custom:

```
use Abdasis\Duitku\Http\Middleware\VerifyDuitkuSignature;

Route::post('/custom-webhook', CustomController::class)
    ->middleware(VerifyDuitkuSignature::class);
```

Arsitektur Package
------------------

[](#arsitektur-package)

```
src/
├── Client/DuitkuClient.php        # Low-level HTTP calls + signature
├── DuitkuService.php              # High-level API (Facade target)
├── DuitkuServiceProvider.php      # Register bindings, config, routes
├── Facades/Duitku.php             # Facade
├── Enums/PaymentStatus.php        # Status enum dengan label & color
├── Models/Payment.php             # Eloquent model (polymorphic)
├── Events/
│   ├── PaymentSuccess.php
│   ├── PaymentFailed.php
│   └── PaymentExpired.php
├── Exceptions/
│   ├── DuitkuApiException.php
│   └── InvalidSignatureException.php
└── Http/
    ├── Controllers/DuitkuCallbackController.php
    └── Middleware/VerifyDuitkuSignature.php

```

Testing
-------

[](#testing)

Package dilengkapi 66 test (141 assertions) menggunakan Pest:

```
php artisan test packages/abdasis/laravel-duitku/tests
```

Lisensi
-------

[](#lisensi)

MIT License.

###  Health Score

21

—

LowBetter than 19% of packages

Maintenance61

Regular maintenance activity

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/8faab912cbce66498f4d25247b5a340a5ed4b1645cc30ffda61cdb10fb1e2fb8?d=identicon)[abdasis](/maintainers/abdasis)

---

Top Contributors

[![abdasis](https://avatars.githubusercontent.com/u/34927165?v=4)](https://github.com/abdasis "abdasis (2 commits)")

### Embed Badge

![Health badge](/badges/abdasis-laravel-duitku/health.svg)

```
[![Health](https://phpackages.com/badges/abdasis-laravel-duitku/health.svg)](https://phpackages.com/packages/abdasis-laravel-duitku)
```

###  Alternatives

[omnipay/paypal

PayPal gateway for Omnipay payment processing library

3156.8M53](/packages/omnipay-paypal)[eduardokum/laravel-boleto

Biblioteca com boletos para o laravel

626351.9k2](/packages/eduardokum-laravel-boleto)[tbbc/money-bundle

This is a Symfony bundle that integrates moneyphp/money library (Fowler pattern): https://github.com/moneyphp/money.

1961.9M](/packages/tbbc-money-bundle)[2checkout/2checkout-php

2Checkout PHP Library

83740.3k2](/packages/2checkout-2checkout-php)[smhg/sepa-qr-data

Generate QR code data for SEPA payments

61717.2k5](/packages/smhg-sepa-qr-data)[omnipay/dummy

Dummy driver for the Omnipay payment processing library

271.2M33](/packages/omnipay-dummy)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
