Dokumentasi Developer
Onboarding produk baru menerima pembayaran dalam kurang dari 30 menit: daftar, tanda tangani request, panggil Charge API, terima webhook.
Quickstart (< 30 menit)
1. Daftarkan produk
Buat produk di dashboard PaySwitch. Kamu menerima product_id, api_key, dan webhook_secret. Daftarkan juga callback URL (harus HTTPS).
2. Tanda tangani request
Setiap panggilan API ditandatangani HMAC (lihat panduan Signature di bawah). Kirim header `X-Product-Id`, `X-Timestamp`, dan `X-Signature`.
3. Buat charge
Panggil `POST /v1/charges` dengan header `Idempotency-Key`. Respons berisi `checkout_url` / VA / token sesuai provider yang dipilih routing.
4. Terima webhook
PaySwitch mengirim satu webhook seragam ber-signature ke callback URL-mu untuk tiap perubahan status. Verifikasi `X-PaySwitch-Signature` dengan resep yang sama, lalu balas `200` cepat.
Panduan Signature
Semua request ditandatangani agar tak bisa di-replay. Bangun signing string:
```
<X-Timestamp>.<METHOD>.<path>.<rawBody>
```
lalu `X-Signature = hex( HMAC-SHA256(webhook_secret, signing string) )`. Server menolak signature yang salah (`401`) atau di luar jendela waktu (skew). `METHOD` huruf besar; `path` tanpa query; `rawBody` byte mentah persis seperti dikirim.
Contoh signing
X-Product-Id: prod_demo
X-Timestamp: 1700000000
Signing string: 1700000000.POST./v1/charges.{"amount":10000,"currency":"IDR"}
X-Signature: a2953244d422279bbb4eed79f2db72b1232d5ebf3c812f55e9656e056e3a32caimport { createHmac } from 'node:crypto';
const ts = String(Math.floor(Date.now() / 1000));
const signingString = `${ts}.${'POST'}.${'/v1/charges'}.${body}`;
const sig = createHmac('sha256', webhookSecret).update(signingString).digest('hex');
// headers: X-Product-Id, X-Timestamp: ts, X-Signature: sigSandbox (test mode)
Gunakan kredensial test untuk memakai sandbox di `https://sandbox.api.payswitch.efolusi.com`. Transaksi mode test terisolasi dari data live dan tidak memindahkan dana nyata. Header dan resep signature identik dengan production. Lihat referensi lengkap di OpenAPI: [/openapi.json](/openapi.json).