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.
Update 27 Oktober 2026: Sinkronisasi bank/Jago memakai metode gabungan di admin/payments/digimanain_gateway; metode transfer_bank lama tidak perlu diaktifkan. Kedua ZIP menyertakan cron HTTP bertoken untuk instalasi berlisensi yang menolak CLI. Di admin/notif_rules, pilih HTTP/cURL, gunakan Channel Key dan Webhook Secret channel aktif, salin perintah cron, dan lihat hasil sinkronisasi terakhir. Pasang jadwal setiap menit di hosting.
v3.9.5

Webpulsa W38S v3.9.5 (Standar)

ZIP integrasi Gateway Digimana untuk Webpulsa engine W38S tema bawaan/standar.

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

Webpulsa W38S v3.9.6 (Standar)

ZIP integrasi Gateway Digimana untuk Webpulsa engine W38S tema bawaan/standar.

Download gateway_digimana_w38s_v396.zip SHA-256: 51c08744247077330e47ff0fb1049ca0b98e437ffd8c3f0b8443e24e8826eeec
v3.9.5 (SFKios)

Webpulsa v3.9.5 (Tema SFKios)

Khusus tema SFKios (viewsf.php): scoped styling, SVG mandiri, dan Tag 62 alfanumerik bersih.

Download gateway_digimana_v395_sfkios.zip SHA-256: 7cbae27286b345a72dddceb03f42a5be9258f4d0c9f0f81624c21b095d604b4d
v3.9.6 (SFKios)

Webpulsa v3.9.6 (Tema SFKios)

Khusus tema SFKios (viewsf.php): scoped styling, SVG mandiri, dan Tag 62 alfanumerik bersih.

Download gateway_digimana_v396_sfkios.zip SHA-256: 0df0dffa2e4a7c136037891486bf3e4605cfe3416558f55341da26347b5624d2
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.
amount_is_uniqueOpsional, true bila amount sudah memuat kode unik dari sistem Anda. Gateway memakai nominal apa adanya (+ fee) dan baru menambah kode unik bila total bentrok dengan tagihan lain.
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