Satu API untuk semua payment gateway Indonesia. Daftar 1x, langsung bisa pake Duitku, Midtrans, iPaymu, dan QRIS.
https://paygate.prayana.idSetiap request memerlukan header x-api-key.
curl -X GET https://paygate.prayana.id/api/v1/health \
-H "x-api-key: your_platform_api_key"curl -X POST https://paygate.prayana.id/api/v1/transactions \
-H "Content-Type: application/json" \
-H "x-api-key: your_api_key" \
-d '{
"orderId": "TEST-001",
"gateway": "duitku",
"amount": 10000,
"paymentMethod": "BC",
"customerName": "Test",
"customerEmail": "test@mail.com"
}'Daftarkan endpoint Anda di dashboard untuk menerima notifikasi real-time.
// Next.js App Router
export async function POST(request: Request) {
const { event, data } = await request.json()
if (event === 'payment.success') {
// Update order status
await updateOrderStatus(data.orderId, 'PAID')
}
return Response.json({ received: true })
}Setiap platform memiliki satu API Key unik. Kirim di header x-api-key setiap request.
HEADER FORMAT
x-api-key: prayana_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5px-api-keyCookie (authjs.session-token)ENDPOINT
POST /api/v1/transactionsHEADERS
Content-Type: application/jsonx-api-key: your_api_key{
"orderId": "INV-001", // required - unique from your system
"gateway": "duitku", // required - "duitku" | "midtrans" | "ipaymu"
"amount": 100000, // required - amount without fee
"fee": 4000, // optional - admin fee
"totalAmount": 104000, // optional - amount + fee (auto if empty)
"paymentMethod": "BC", // required - channel code
"customerName": "John Doe", // optional
"customerEmail": "john@...", // optional
"customerPhone": "08123...", // optional
"productDetails": "Paket Basic", // optional
"expiryPeriod": 1440, // optional - minutes (default 1440 = 24h)
"metadata": { "orderId": "abc123" } // optional - extra data
}{
"data": {
"id": "clx...",
"orderId": "INV-001",
"gateway": "duitku",
"amount": 100000,
"totalAmount": 104000,
"status": "PENDING",
"paymentUrl": "https://app.duitku.com/payment/REF123",
"vaNumber": "881234567890", // Virtual Account (for VA channels)
"qrString": null, // QRIS string (for QRIS channels)
"reference": "REF123456" // Gateway reference
}
}POST /api/v1/transactions/{id}/check-status
{
"data": {
"status": "SUCCESS",
"gatewayStatus": "settlement"
}
}Prayana PayGate mengirim webhook ke URL Anda ketika status transaksi berubah. Daftarkan webhook URL di dashboard > Edit Platform.
WEBHOOK EVENTS
| Event | Description |
|---|---|
| transaction.created | Transaksi baru dibuat |
| payment.success | Pembayaran berhasil |
| payment.failed | Pembayaran gagal |
| payment.expired | Transaksi kadaluarsa |
{
"event": "payment.success",
"data": {
"transactionId": "clx...",
"orderId": "INV-001",
"gateway": "duitku",
"amount": 100000,
"status": "SUCCESS",
"reference": "REF123456",
"paidAt": "2024-01-01T12:05:00.000Z"
}
}const crypto = require('crypto')
const body = JSON.stringify(req.body) // raw JSON
const expected = crypto
.createHmac('sha256', webhookSecret)
.update(body)
.digest('hex')
const isValid = (expected === req.headers['x-webhook-signature'])| Code | Channel | Type |
|---|---|---|
| BC | BCA Virtual Account | va |
| M2 | Mandiri Virtual Account | va |
| I1 | BNI Virtual Account | va |
| BR | BRI Virtual Account | va |
| OV | OVO | ewallet |
| DA | DANA | ewallet |
| SA | ShopeePay | ewallet |
| FT | Alfamart | retail |
| IR | Indomaret | retail |
| VC | Kartu Kredit | credit_card |
| SP | QRIS (ShopeePay) | qris |
| Code | Channel | Type |
|---|---|---|
| bca_va | BCA Virtual Account | va |
| bni_va | BNI Virtual Account | va |
| bri_va | BRI Virtual Account | va |
| mandiri_bill | Mandiri Bill | va |
| gopay | GoPay | ewallet |
| shopeepay | ShopeePay | ewallet |
| dana | DANA | ewallet |
| qris | QRIS | qris |
| indomaret | Indomaret | retail |
| alfamart | Alfamart | retail |
| credit_card | Kartu Kredit | credit_card |
| Code | Channel | Type |
|---|---|---|
| va | VA (Auto Routing) | va |
| bca | BCA Virtual Account | va |
| mandiri | Mandiri VA | va |
| bni | BNI VA | va |
| bri | BRI VA | va |
| qris | QRIS | qris |
| alfamart | Alfamart | retail |
| indomaret | Indomaret | retail |
| kartu_kredit | Kartu Kredit | credit_card |
GET /api/v1/gateways?gateway=duitku untuk mendapatkan daftar channel terkini.Sistem kode unik (2/3 digit) ditambahkan ke nominal pembayaran. Ketika user membayar, sistem mencocokkan jumlah yang dibayar dengan kode unik.
Contoh Flow
POST /api/v1/qris/generate
{
"qrisString": "000201010211...",
"baseAmount": 100000,
"type": "ORDER",
"referenceId": "INV-001"
}
{
"data": {
"dynamicQrisString": "000201010212...",
"uniqueAmount": 100523,
"code": 523,
"codeFormatted": "523"
}
}POST /api/v1/unique-codes/generate
{
"type": "ORDER",
"referenceId": "INV-001",
"amount": 100000
}
{
"data": {
"code": 523,
"uniqueAmount": 100523,
"codeFormatted": "523",
"note": "Bayar tepat Rp 100.523"
}
}POST /api/v1/unique-codes/verify
{ "amount": 100523 }
{
"matched": true,
"data": {
"code": 523,
"type": "ORDER",
"referenceId": "INV-001",
"amount": 100000,
"uniqueAmount": 100523
}
}Semua gateway credentials dienkripsi sebelum disimpan ke database. Format:
iv_hex:auth_tag_hex:ciphertext_hex| Status | Keterangan |
|---|---|
| PENDING | Menunggu pembayaran |
| SUCCESS | Pembayaran berhasil |
| FAILED | Pembayaran gagal |
| EXPIRED | Transaksi kadaluarsa |
| REFUNDED | Transaksi di-refund |
| HTTP | Arti | Penyebab |
|---|---|---|
| 201 | Created | Transaksi berhasil |
| 400 | Bad Request | Parameter kurang / tidak valid |
| 401 | Unauthorized | API Key salah |
| 404 | Not Found | Transaksi tidak ditemukan |
| 409 | Conflict | Order ID sudah pernah dipakai |
| 502 | Bad Gateway | Error dari payment gateway |
Semua error response format: { "error": "deskripsi error" }
Siap integrasi?
Daftar Sekarang