API Reference v1

Satu gateway,
banyak website.

Base URL

https://gateway.digimana.in/api/v1
Plugin resmi

Plugin khusus Webpulsa engine W38S.

Pilih paket sesuai versi Webpulsa W38S yang digunakan. Paket berisi metode pembayaran Gateway Digimana untuk transfer bank dan QRIS. Backup file serta database website sebelum instalasi atau upgrade.

Kompatibilitas: Paket ini khusus untuk Webpulsa dengan engine W38S versi 3.9.5 atau 3.9.6. Jangan pasang pada engine atau versi lain.
v3.9.5

Webpulsa W38S v3.9.5

ZIP integrasi Gateway Digimana khusus Webpulsa engine W38S, lengkap dengan reservation nominal unik dan webhook auto-approve.

Download gateway_digimana_w38s_v395.zip SHA-256: efe6898a39252bfc011bb6ff1e0a940c349c2b349122a13260e785e4c9309748
v3.9.6

Webpulsa W38S v3.9.6

ZIP integrasi Gateway Digimana khusus Webpulsa engine W38S, lengkap dengan reservation nominal unik dan webhook auto-approve.

Download gateway_digimana_w38s_v396.zip SHA-256: 0003ca066986df4ab0663903e470d9fbf807424ea960dea1e8af4385a87e8298
Catatan: Paket lama transfer_bank_qris_395.zip bukan bagian dari rilis Webpulsa W38S ini. Gunakan salah satu paket Gateway Digimana di atas.
Website / Client onboarding

Hubungkan backend website ke Gateway.

Android bertugas mengirim mutasi pembayaran. Website/client bertugas membuat reservation, menampilkan instruksi pembayaran, dan memproses webhook. Integrasi channel harus dilakukan dari backend server—bukan JavaScript browser.

1. ChannelBuat channel di menu Channel Multi-Web dan salin key ch_live_....
2. Sumber danaAktifkan minimal satu QRIS atau rekening bank tujuan.
3. WebhookIsi callback HTTPS dan simpan whsec_... untuk verifikasi HMAC.
4. ReservationBuat tagihan dari backend menggunakan X-Channel-Key.
5. Tampilan bayarTampilkan qr_data_uri atau rekening beserta total_amount.
6. Uji end-to-endBayar nominal uji dan pastikan callback dibalas HTTP 200.
Dua kredensial berbeda: API Token/Bearer digunakan aplikasi Android. Website memakai X-Channel-Key, sedangkan callback diverifikasi menggunakan Webhook Secret.
Authentication

Kirim kredensial melalui header.

Endpoint aplikasi Android memakai Authorization: Bearer TOKEN. Endpoint website/channel memakai X-Channel-Key. Simpan key di server website, jangan di JavaScript browser atau query string.

Direkomendasikan

Reservation-first payment.

Buat pending payment sebelum pelanggan mentransfer. Gateway memberikan nominal unik global sehingga pembayaran hanya dapat diarahkan ke website pemilik reservation.

curl -X POST "https://gateway.digimana.in/api/v1/channels/pending-payment" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "external_reference": "DEP#101",
    "amount": 11000,
    "payment_method": "qris",
    "store_reference": "DIGITU",
    "customer_name": "Nama Pelanggan",
    "customer_email": "pelanggan@example.com",
    "expires_at": 1789970400
  }'
external_referenceWajib, unik per channel, maksimal 100 karakter. Contoh DEP#101.
amountWajib, nominal pokok order sebelum fee dan kode unik.
payment_methodqris, bank, atau bank_transfer.
expires_atOpsional, Unix timestamp masa berlaku order sumber.
store_referenceOpsional, identitas toko maksimal 25 karakter untuk referensi QRIS.
customer_*Nama, email, dan telepon opsional untuk audit serta callback.

expires_at bersifat opsional dan paling aman dikirim sebagai Unix timestamp. Gateway dapat mempersingkat masa berlaku sesuai batas order sumber, tetapi tidak akan memperpanjang melebihi batas maksimum invoice.

{
  "success": true,
  "status": "pending",
  "external_reference": "DEP#101",
  "payment_method": "qris",
  "base_amount": 11000,
  "fee": 165,
  "unique_code": 27,
  "total_amount": 11192,
  "qr_data_uri": "data:image/png;base64,...",
  "dynamic_qris": "000201...",
  "expires_at": "2026-09-21 17:00:00"
}

Gunakan total_amount sebagai nominal yang wajib dibayar dan qr_data_uri untuk menampilkan QR. Jangan menghitung ulang fee atau kode unik di website. Untuk QRIS, gateway menyisipkan referensi transaksi ke EMVCo Tag 62 dan menghitung ulang CRC. Referensi serta nominal yang sama bersifat idempoten.

Payment lifecycle

Dari reservation sampai order selesai.

pendingTagihan aktif dan menunggu pembayaran dengan nominal hasil reservation.
paidMutasi cocok, pembayaran dikunci ke channel, dan webhook dikirim.
expiredBatas pembayaran lewat; reservation tidak boleh digunakan lagi.
cancelledWebsite membatalkan tagihan pending melalui endpoint DELETE.
# Polling status sebagai fallback webhook
curl "https://gateway.digimana.in/api/v1/channels/check-payment/DEP%23101" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY"

# Batalkan hanya ketika masih pending
curl -X DELETE "https://gateway.digimana.in/api/v1/channels/pending-payment/DEP%23101" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY"

Webhook adalah jalur utama. Polling dipakai sebagai fallback atau rekonsiliasi, bukan untuk menggantikan callback real-time.

# Rekonsiliasi beberapa order pending
curl -X POST "https://gateway.digimana.in/api/v1/channels/reconcile" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"references":["DEP#101","TRX#202"]}'

# Daftar pembayaran yang callback-nya belum diterima website
curl "https://gateway.digimana.in/api/v1/channels/undelivered-payments?hours=24" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY"
Fallback

Atomic claim untuk integrasi lama.

Gunakan hanya bila website belum dapat membuat reservation. Ambil mutasi tenant yang belum terpakai, lalu klaim berdasarkan ID gateway.

curl "https://gateway.digimana.in/api/v1/transactions/unclaimed?amount=11490&limit=20" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY"

curl -X POST "https://gateway.digimana.in/api/v1/transactions/claim" \
  -H "X-Channel-Key: YOUR_CHANNEL_KEY" \
  -H "Idempotency-Key: DEP-101-CLAIM" \
  -H "Content-Type: application/json" \
  -d '{
    "gateway_trx_id": 12345,
    "external_reference": "DEP#101"
  }'
Replay claim dengan channel dan referensi sama aman dan menghasilkan 200. Klaim berbeda terhadap transaksi yang sudah dimiliki menghasilkan 409.
Endpoints

REST API v1

Koneksi

GET /status

Memeriksa status gateway dan database.

Publik
POST /auth/register

Membuat akun trial dan menerima token pertama.

Publik
POST /auth/login

Memvalidasi akun dan menerbitkan token baru.

Publik
POST /auth/verify

Memvalidasi token dan mengambil profil serta limit paket.

Bearer token

Sinkronisasi

GET /rules

Mengambil master rule notifikasi aktif.

Bearer token
GET /accounts

Mengambil rekening bank dan QRIS milik pengguna.

Bearer token

Perangkat

POST /devices/register

Mendaftarkan atau memperbarui perangkat Android.

Bearer token
POST /devices/heartbeat

Memperbarui status aktif perangkat.

Bearer token
GET /devices/settings?device_id={device_id}

Mengambil konfigurasi listener perangkat.

Bearer token
PUT /devices/{id}/settings

Memperbarui konfigurasi listener perangkat.

Bearer token

Transaksi

POST /transactions

Mengirim satu transaksi hasil parsing notifikasi.

Bearer token
POST /transactions/bulk

Mengirim maksimal 100 transaksi offline sekaligus.

Bearer token
GET /transactions?page=1&per_page=20

Mengambil riwayat transaksi bertahap.

Bearer token

Multi-channel

GET /transactions/unclaimed?limit=20

Mengambil mutasi tenant yang belum pernah diklaim. Gunakan hanya untuk integrasi legacy.

X-Channel-Key
POST /transactions/claim

Mengklaim satu mutasi secara atomik dan idempotent.

X-Channel-Key

Langganan

GET /subscription/status

Mengambil status dan limit paket aktif.

Bearer token
GET /subscription/plans

Mengambil paket dan harga aktif.

Bearer token

Channel

GET /channels/health

Memeriksa channel, sumber pembayaran, dan kesiapan integrasi.

X-Channel-Key
POST /channels/pending-payment

Membuat tagihan transfer atau QRIS dinamis.

X-Channel-Key
GET /channels/check-payment/{reference}

Memeriksa status tagihan eksternal.

X-Channel-Key
DELETE /channels/pending-payment/{reference}

Membatalkan tagihan yang masih pending.

X-Channel-Key
GET /channels/bank-accounts

Mengambil rekening tujuan yang tersedia untuk channel.

X-Channel-Key
POST /channels/redeliver-webhook/{reference}

Mengirim ulang webhook pembayaran untuk satu referensi.

X-Channel-Key
GET /channels/undelivered-payments

Mengambil pembayaran yang webhook-nya belum terkirim atau gagal.

X-Channel-Key
POST /channels/reconcile

Memeriksa status beberapa referensi pembayaran sekaligus.

X-Channel-Key

Owner

POST /owner/payment-received

Meneruskan notifikasi pembayaran dari perangkat owner.

Bearer owner
Webhook verification

Verifikasi sebelum menambah saldo.

Gateway mengirim X-Gateway-Event-Id, X-Gateway-Timestamp, dan X-Gateway-Signature. Hitung HMAC-SHA256 dari {timestamp}.{raw_json_body}, bandingkan secara constant-time, dan tolak timestamp lebih lama dari lima menit.

X-Gateway-Event-Id: evt_abc123
X-Gateway-Timestamp: 1789448400
X-Gateway-Signature: sha256=HMAC_HEX

{
  "event": "payment.matched",
  "event_id": "evt_abc123",
  "data": {
    "gateway_trx_id": 12345,
    "payment_id": 678,
    "external_reference": "DEP#101",
    "amount": 11490,
    "base_amount": 11000,
    "unique_code": 27,
    "fee_amount": 463,
    "net_amount": 11000,
    "status": "paid"
  }
}

Simpan event_id atau gateway_trx_id dengan unique index dan proses perubahan status deposit serta saldo dalam satu database transaction. Gunakan net_amount ketika order sumber sudah tidak ada dan pembayaran harus dialihkan ke saldo deposit. Event duplikat harus mengembalikan HTTP 200 tanpa kredit ulang.

// PHP — verifikasi signature dari RAW request body
$raw       = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_GATEWAY_TIMESTAMP'] ?? '';
$received  = $_SERVER['HTTP_X_GATEWAY_SIGNATURE'] ?? '';
$expected  = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $raw, WEBHOOK_SECRET);

if (abs(time() - (int) $timestamp) > 300 || !hash_equals($expected, $received)) {
    http_response_code(401);
    exit('Invalid signature');
}
Balas HTTP 200 hanya setelah event tersimpan aman. Jika callback gagal, gunakan Webhook Console atau endpoint redelivery/reconciliation tanpa menambah saldo dua kali.
Production security

Checklist sebelum go-live.

Server-side onlySimpan Channel Key dan Webhook Secret di environment/config backend.
HTTPS wajibWebhook production harus memakai TLS dan sertifikat valid.
HMAC + timestampGunakan raw body, hash_equals, dan toleransi maksimal lima menit.
IdempotencyBeri unique index pada event ID/gateway transaction ID.
Atomic updatePerbarui order dan saldo dalam satu database transaction.
ObservabilityPantau antrean gagal, lakukan redelivery, dan jalankan reconcile terjadwal.

Jangan panggil endpoint channel langsung dari browser atau aplikasi publik karena X-Channel-Key dapat dicuri. Browser hanya berkomunikasi dengan backend website milik Anda.

Response contract

Status HTTP dapat diprediksi.

200/201Berhasil atau replay idempotent
401Key/token tidak valid
403Paket atau tenant tidak diizinkan
404Resource tidak tersedia
409Claim/referensi konflik
422Payload tidak valid
429Rate limit/kuota habis
503Layanan sementara tidak tersedia