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