Panduan Pemula
Belum pernah pakai payment gateway sebelumnya? Tenang, panduan ini menjelaskan dari nol dengan bahasa yang simpel.
Apa itu XentralPay?
XentralPay adalah layanan yang membantu Anda menerima pembayaran QRIS secara otomatis di aplikasi, bot Telegram, website, atau sistem apapun yang Anda bangun.
Tanpa XentralPay, Anda harus cek pembayaran manual. Dengan XentralPay, sistem otomatis memberi tahu Anda saat pelanggan sudah bayar.
Langkah-langkah dari Awal
Daftar Akun
Buka halaman pendaftaran. Isi nama, email, dan Telegram ID. Kode verifikasi dikirim via bot @xentralpaybot di Telegram.
Login dan Buat Project
Setelah akun terverifikasi, login ke dashboard. Klik menu Project, lalu klik "+ Project Baru". Isi nama project (contoh: "Toko Online Saya").
Simpan API Key
Setelah project dibuat, Anda akan mendapatkan API Key (kode panjang yang dimulai dengan cpay_live_). Simpan baik-baik! API Key ini hanya ditampilkan sekali dan tidak bisa dilihat lagi.
Buat Pembayaran QRIS
Kirim request ke API XentralPay dengan nominal pembayaran. Anda akan mendapatkan QR code dan link checkout yang bisa langsung dikirim ke pelanggan.
Pelanggan Bayar, Anda Dapat Notifikasi
Pelanggan scan QR atau buka link checkout. Setelah bayar, XentralPay otomatis mengirim notifikasi (webhook) ke server Anda. Atau Anda bisa cek status manual lewat API.
Tidak punya server? Anda tetap bisa pakai XentralPay! Gunakan checkout_url dari response API — itu adalah halaman pembayaran siap pakai yang otomatis menampilkan QR code, countdown timer, dan status pembayaran.
Quick Start
Integrasikan XentralPay ke aplikasi Anda dalam hitungan menit. REST API standar, response JSON. Tidak memerlukan SDK khusus.
Buat Project
Daftar di dashboard, buat project baru, dan salin API key yang dihasilkan.
Panggil API
Kirim POST ke /v1/qris/generate dengan nominal pembayaran.
Tampilkan QR
Render qr_content jadi gambar QR, atau arahkan pelanggan ke checkout_url.
Terima Webhook
Webhook dikirim otomatis saat pembayaran berhasil. Ditandatangani HMAC-SHA256 untuk keamanan.
Contoh Integrasi Lengkap
Contoh alur lengkap dari membuat pembayaran sampai menerima notifikasi. Copy-paste dan sesuaikan.
Skenario: User beli produk Rp 50.000
Cara paling mudah: Kalau kamu nggak punya server untuk terima webhook, cukup pakai checkout_url dan polling /v1/qris/status setiap beberapa detik untuk cek apakah sudah bayar.
calculate Fee Mode
Setiap project bisa memilih siapa yang menanggung fee transaksi.
store Mode: Merchant
Fee dipotong dari saldo merchant. Pelanggan bayar nominal asli.
person Mode: Buyer
Fee ditambahkan ke nominal. Merchant terima full harga produk.
Fee mode bisa diatur per project di menu Project > Edit di dashboard. Besaran fee (persentase + flat) diatur oleh admin dan berlaku untuk semua merchant.
dns Base URL
Semua endpoint API menggunakan base URL berikut:
https://api.xentralpay.com
Untuk halaman checkout dan dashboard, gunakan https://xentralpay.com. Base URL API khusus untuk pemanggilan endpoint.
lock Autentikasi
Seluruh request ke endpoint QRIS memerlukan API key. Kirimkan melalui header Authorization dengan format Bearer token.
API key berbeda dengan token login dashboard. Jangan pernah menyertakan API key di kode frontend/client-side. Selalu panggil dari server Anda.
Cara mendapatkan API key
- Daftar di dashboard XentralPay
- Verifikasi akun via Telegram bot
@xentralpaybot - Buat project baru di menu Project
- Salin API key yang ditampilkan (hanya ditampilkan sekali)
qr_code_2 Generate QRIS
Membuat transaksi QRIS baru. Order ID bisa custom atau auto-generate.
/v1/qris/generate
Request Parameters
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| amount | integer | Ya | Jumlah dalam Rupiah. Minimal 1, maksimal 10.000.000. |
| order_id | string | Tidak | ID transaksi custom. Huruf, angka, dash, underscore. Maks 50 karakter. Harus unik. Jika tidak diisi, otomatis di-generate dengan format CP-{timestamp}-{random}. |
| callback_url | string | Tidak | URL untuk menerima webhook khusus transaksi ini. Jika tidak diisi, menggunakan webhook URL default dari project. |
| metadata | object | Tidak | Data tambahan (bebas). Akan dikembalikan di webhook saat pembayaran berhasil. Contoh: {"user_id": "123"} |
Contoh Request
Response Sukses (201)
{
"success": true,
"message": "QRIS created successfully",
"data": {
"order_id": "INV-20240101-001",
"amount": 50000,
"status": "pending",
"qr_content": "00020101021226610014COM.GO-JEK.WWW...",
"qr_image_url": "https://xentralpay.com/qris/INV-20240101-001/qr.png",
"checkout_url": "https://xentralpay.com/pay/INV-20240101-001",
"expires_at": "2026-06-22T15:09:00.000Z",
"created_at": "2026-06-22T14:54:00.000Z"
}
}Response Fields
| Field | Tipe | Penjelasan |
|---|---|---|
| order_id | string | ID unik transaksi. Gunakan untuk cek status atau membatalkan. |
| amount | integer | Nominal pembayaran dalam Rupiah. |
| status | string | Status awal selalu pending. |
| qr_content | string | Raw QRIS payload. Render menjadi gambar QR pakai library seperti qrcode (Node.js) atau qrcode.react. |
| qr_image_url | string | URL gambar QR yang sudah di-render oleh server. Bisa langsung ditampilkan sebagai <img>. |
| checkout_url | string | Halaman checkout siap pakai. Arahkan pelanggan ke URL ini jika tidak ingin render QR sendiri. Halaman ini auto-polling status dan menampilkan confetti saat berhasil. |
| expires_at | string | Waktu kedaluwarsa transaksi (ISO 8601). Setelah waktu ini, status otomatis menjadi expire. |
Response Error
{
"success": false,
"message": "amount must be an integer between 1 and 10,000,000"
}search Cek Status Transaksi
Mengambil status terbaru dari sebuah transaksi. Jika masih pending, sistem otomatis sinkronisasi ke provider sebelum merespons.
/v1/qris/status
Request Parameters
| Parameter | Tipe | Deskripsi |
|---|---|---|
| order_id | string | Order ID dari XentralPay. Gunakan order_id atau transaction_id, salah satu wajib diisi. |
| transaction_id | string | Transaction ID dari provider (UUID). Alternatif dari order_id. |
Contoh Request
Response Sukses (200)
{
"success": true,
"data": {
"order_id": "INV-20240101-001",
"amount": 50000,
"net_amount": 49450,
"fee_amount": 550,
"status": "settlement",
"payment_method": "QRIS",
"created_at": "2026-06-22T14:54:00.000Z",
"settled_at": "2026-06-22T14:56:12.000Z"
}
}Nilai Status
| Status | Keterangan |
|---|---|
| settlement | Pembayaran berhasil. Dana masuk ke saldo tertunda merchant, cair otomatis setelah H+1. |
| pending | Menunggu pembayaran. Pelanggan belum scan/bayar. |
| expire | Waktu pembayaran habis tanpa transaksi masuk. |
| cancel | Dibatalkan melalui endpoint /v1/qris/cancel. |
cancel Batalkan Transaksi
Hanya transaksi berstatus pending yang dapat dibatalkan.
/v1/qris/cancel
Contoh Request
Response Sukses (200)
{
"success": true,
"data": {
"order_id": "INV-20240101-001",
"status": "cancel",
"cancelled_at": "2026-06-22T14:58:30.000Z"
}
}webhook Menerima Webhook
Saat transaksi berhasil dibayar, XentralPay mengirimkan POST request ke webhook URL yang diset di project Anda.
Payload yang Dikirim
{
"event": "payment.completed",
"timestamp": "2026-06-22T14:56:12.000Z",
"data": {
"order_id": "INV-20240101-001",
"amount": 50000,
"net_amount": 49450,
"fee_amount": 550,
"status": "settlement",
"payment_method": "QRIS",
"metadata": {"user_id": "U-123", "product": "Premium Plan"}
}
}Header yang Dikirim
| Header | Keterangan |
|---|---|
| X-XentralPay-Signature | HMAC-SHA256 dari raw body, ditandatangani menggunakan webhook_secret project Anda. |
| X-XentralPay-Timestamp | Unix timestamp saat webhook dikirim. Gunakan untuk mencegah replay attack. |
| Content-Type | application/json |
Server Anda harus mengembalikan HTTP 200 dalam 10 detik. Jika gagal, XentralPay akan retry otomatis hingga 5 kali dengan delay bertingkat: 0s, 5s, 30s, 2 menit, 10 menit.
Webhook Response Fields
| Field | Penjelasan |
|---|---|
| event | Selalu payment.completed untuk pembayaran berhasil. |
| data.order_id | Order ID yang sama dengan saat generate. |
| data.amount | Nominal asli transaksi (sebelum fee). |
| data.net_amount | Jumlah yang diterima merchant (setelah fee dipotong). |
| data.fee_amount | Total fee yang dipotong (persentase + flat). |
| data.metadata | Object metadata yang Anda kirim saat generate. Bisa dipakai untuk mencocokkan order di sistem Anda. |
verified_user Verifikasi Signature
Selalu verifikasi header X-XentralPay-Signature sebelum memproses webhook, agar tidak ada yang bisa mengirim notifikasi palsu.
Pastikan endpoint webhook Anda bersifat idempotent. Webhook dengan order_id yang sama mungkin dikirim lebih dari satu kali (retry). Cek apakah order sudah diproses sebelum mengupdate database.
error Kode Error
Semua response error menggunakan format konsisten:
{
"success": false,
"message": "Pesan error yang menjelaskan masalah"
}| Status | Keterangan | Contoh Message |
|---|---|---|
| 400 | Parameter tidak valid | "amount must be an integer between 1 and 10,000,000" |
| 401 | API key tidak valid atau tidak disertakan | "Invalid API key" |
| 403 | Akun merchant atau project suspended | "Merchant account is suspended" |
| 404 | Order ID tidak ditemukan atau bukan milik Anda | "Transaction not found" |
| 409 | Transaksi sudah final (tidak bisa di-cancel) | "Cannot cancel transaction in status settlement" |
| 429 | Terlalu banyak request (rate limited) | "Too many attempts. Try again in 15 minutes." |
| 500 | Kesalahan internal XentralPay | "Internal error generating QRIS" |
| 502 | Provider QRIS tidak merespons | "AutoGoPay rejected the request" |
Butuh bantuan?
Tim technical support kami siap membantu integrasi Anda. Hubungi di Telegram @cogil
help Pertanyaan Umum (FAQ)
Apa itu API Key dan di mana mendapatkannya? expand_more
Saya tidak punya server/website, bisa pakai XentralPay? expand_more
checkout_url — halaman pembayaran siap pakai dari XentralPay. Kirim link itu ke pelanggan lewat WhatsApp, Telegram, atau di mana saja. Halaman itu otomatis menampilkan QR code, countdown timer, dan status pembayaran real-time. Untuk cek status, polling endpoint /v1/qris/status tanpa perlu server webhook.
Berapa lama QRIS berlaku sebelum expired? expand_more
expires_at di response. Setelah expired, status otomatis berubah menjadi expire dan pembayaran tidak bisa dilakukan. Buat transaksi baru jika expired.
Apa bedanya fee mode "Merchant" dan "Buyer"? expand_more
Buyer: Fee ditambahkan ke nominal QRIS. Anda terima harga full. Contoh: produk Rp 100.000, pelanggan bayar Rp 100.900, Anda terima Rp 100.000.
Setting ini ada di menu Project > Edit > Fee dibebankan ke.
Kapan saldo saya bisa ditarik? expand_more
Apa itu webhook dan apakah wajib? expand_more
/v1/qris/status setiap beberapa detik untuk cek apakah pembayaran sudah masuk. Webhook lebih efisien untuk volume transaksi tinggi.
Bagaimana cara integrasi ke bot Telegram? expand_more
- Panggil
/v1/qris/generatesaat user mau bayar - Kirim QR image (
qr_image_url) atau checkout link ke chat user - Polling
/v1/qris/statussetiap 5 detik - Kalau status
settlement, kirim pesan "Pembayaran berhasil!" dan proses order
Lihat Contoh Integrasi Lengkap untuk kode yang siap pakai.
Order ID custom itu apa? Wajib diisi? expand_more
CP-timestamp-random). Kalau diisi, Anda bisa pakai ID sendiri (contoh: INV-001, ORDER-123) supaya mudah dicocokkan dengan data di sistem Anda. Aturan: huruf, angka, dash, underscore, maksimal 50 karakter, harus unik.