Dokumentasi API Merchant

Integrasikan pembayaran QRIS, DANA, OVO, dan ShopeePay ke website atau aplikasi Anda. Semua request memakai POST (form-urlencoded atau JSON), dan setiap request wajib ditandatangani.

1. Informasi Dasar

ItemNilai
Base URLhttps://idragonpay.com/pay/api
Format RequestPOST — application/x-www-form-urlencoded atau JSON
Format Responseapplication/json
Kredensialmerchant_id + secret_key (diberikan saat pendaftaran)

2. Skema Signature

Setiap request API harus menyertakan parameter sign yang dihitung dengan algoritma:

1. Ambil semua parameter (KECUALI "sign")
2. Urutkan key secara ascending (ksort)
3. Gabung: key=value&key=value&...
   (abaikan parameter yang kosong/null)
4. Tambahkan: key=SECRET_KEY di akhir
5. sign = MD5(string) dalam HURUF BESAR

Contoh dengan secret key MySecret123:

params = {merchant_id: "MER01", merchant_no: "INV-001", amount: "50000", channel: "QRIS"}
urutan: amount=50000&channel=QRIS&merchant_id=MER01&merchant_no=INV-001
string: amount=50000&channel=QRIS&merchant_id=MER01&merchant_no=INV-001&key=MySecret123
sign  : strtoupper(md5(string))

Contoh PHP

function sign(array $params, string $key): string {
    ksort($params);
    $str = '';
    foreach ($params as $k => $v) {
        if ($v === '' || $v === null) continue;
        $str .= $k . '=' . $v . '&';
    }
    $str .= 'key=' . $key;
    return strtoupper(md5($str));
}

3. Endpoint

3.1 Buat Order Pembayaran — POST /create.php

Membuat order deposit baru dan mengembalikan URL pembayaran (cashier) untuk pelanggan.

ParameterWajibKeterangan
merchant_idYaID merchant Anda
merchant_noYaNomor order unik dari sistem Anda (tidak boleh duplikat)
amountYaJumlah dalam IDR, minimal 10.000
channelTidakQRIS (default), DANA, OVO, SHOPEEPAY, LINKAJA
phoneTidakNomor HP pelanggan (opsional)
nameTidakNama pelanggan (opsional)
emailTidakEmail pelanggan (opsional)
product_infoTidakDeskripsi produk
signYaSignature (lihat bagian 2)

Contoh request:

curl -X POST https://idragonpay.com/pay/api/create.php \
  -d "merchant_id=MER01" \
  -d "merchant_no=INV-20260811-001" \
  -d "amount=50000" \
  -d "channel=QRIS" \
  -d "sign=ABC123..."

Contoh respons sukses:

{
  "code": 0,
  "msg": "success",
  "data": {
    "order_id": "R260811A1B2C3D4E5F6",
    "merchant_no": "INV-20260811-001",
    "amount": 50000,
    "channel": "QRIS",
    "qr_code": "",
    "pay_url": "https://pre-g-idn-cashier.bestpay.uk/payment/idn/cashier/redirect?sn=...",
    "status": "pending"
  }
}
💡 Arahkan pelanggan ke pay_url (halaman cashier) atau tampilkan qr_code untuk scan.

3.2 Cek Status Order — POST /query.php

ParameterWajibKeterangan
merchant_idYaID merchant
order_id*Order ID dari sistem kami (atau pakai merchant_no)
merchant_no*Nomor order Anda (atau pakai order_id)
signYaSignature

Respons: status = pending | paid | failed

3.3 Verifikasi Kebenaran — POST /verify.php

Sama seperti query, tapi hasilnya diverifikasi langsung ke upstream BestPay (sumber kebenaran). Berguna saat ada pelanggan mengklaim sudah bayar — sistem akan membuktikan status aslinya. Parameter sama dengan query.

3.4 Penarikan Saldo — POST /withdraw.php

ParameterWajibKeterangan
merchant_idYaID merchant
amountYaJumlah ditarik (min 10.000)
bank_nameYaNama bank, contoh: BCA
bank_accountYaNomor rekening
bank_holderYaAtas nama rekening
typeTidakbankcard (default) atau ewallet
signYaSignature

Biaya penarikan DANA flat Rp 3.000 per transaksi, bank/e-wallet lain Rp 5.000 + 0,3%, dipotong otomatis. Saldo dibekukan saat pengajuan dan dikembalikan penuh jika ditolak.

3.5 Cek Saldo — POST /balance.php

Mengecek saldo merchant yang tersedia (belum termasuk penarikan yang diproses).

ParameterWajibKeterangan
merchant_idYaID merchant Anda
signYaSignature (lihat bagian 2)

Contoh request:

curl -X POST https://idragonpay.com/pay/api/balance.php \
  -d "merchant_id=MER01" \
  -d "sign=ABC123..."

Contoh respons sukses:

{
  "code": 0,
  "msg": "sukses",
  "merchant_id": "MER01",
  "nama": "Nama Merchant",
  "balance": "150000.00",
  "balance_formatted": "Rp 150.000",
  "today": {
    "paid_amount": "50000.00",
    "pending_amount": "0.00",
    "paid_count": 2
  }
}
💡 balance = saldo tersedia (Rp). today = rekap transaksi hari ini (opsional, bisa diabaikan).

Contoh kode PHP:

<?php
$merchant_id = 'Zonksyn99';
$secret_key  = 'RAHASIA_ANDA';

// buat sign: urutkan parameter, gabung key=val&, tambah key=SECRET, md5 uppercase
$params = ['merchant_id' => $merchant_id];
ksort($params);
$str = '';
foreach ($params as $k => $v) { if ($v === '' || $v === null) continue; $str .= $k . '=' . $v . '&'; }
$str .= 'key=' . $secret_key;
$sign = strtoupper(md5($str));

$ch = curl_init('https://idragonpay.com/pay/api/balance.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['merchant_id' => $merchant_id, 'sign' => $sign]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch); curl_close($ch);
$data = json_decode($res, true);
if ($data['code'] === 0) {
    echo 'Saldo Anda: ' . $data['balance_formatted'];
} else {
    echo 'Error: ' . $data['msg'];
}
?>

3.6 Terima Crypto (USDT) — POST /create_crypto.php

Buat tagihan yang dibayar dengan USDT (jaringan BEP20 / BNB Smart Chain atau TRC20 / Tron). Nominal tetap dalam IDR — pelanggan membayar USDT sejumlah ekuivalennya, saldo IDR Anda dikredit otomatis saat pembayaran terkonfirmasi.

💠 Cara mengaktifkan (self-service):
  1. Login ke portal merchant Anda.
  2. Buka menu 💠 Crypto USDT → klik "Aktifkan Terima USDT".
  3. Selesai — endpoint /create_crypto.php langsung bisa dipakai (bisa dimatikan kapan saja).
Pastikan callback_url Anda sudah diisi agar notifikasi pembayaran terkirim. Auth & sign sama seperti endpoint lain. Fee ditanggung merchant (1,5%).
ParameterWajibKeterangan
merchant_idYaID merchant Anda
merchant_noYaNomor order unik dari sistem Anda
amountYaJumlah dalam IDR, minimal 10.000
networkTidakBEP20 (default) atau TRC20
phone / name / email / product_infoTidakData pelanggan (opsional)
signYaSignature (lihat bagian 2)

Contoh request:

curl -X POST https://idragonpay.com/pay/api/create_crypto.php \
  -d "merchant_id=MER01" \
  -d "merchant_no=INV-20260811-050" \
  -d "amount=50000" \
  -d "network=BEP20" \
  -d "sign=ABC123..."

Contoh respons sukses:

{
  "code": 0,
  "msg": "success",
  "data": {
    "crypto_no": "CX261007A9A140EEB0",
    "merchant_no": "INV-20260811-050",
    "amount_idr": 50000,
    "charge_idr": 50000,
    "pay_currency": "USDT",
    "network": "BEP20",
    "network_name": "Binance Smart Chain",
    "pay_amount": 2.8514457,
    "address": "0x1ac420D5...",
    "qr_code": "https://...",
    "rate_idr_usdt": 0.000056,
    "expire_at": "2026-10-08 01:00:00",
    "status": "new",
    "checkout_url": "https://idragonpay.com/pay/crypto_pay.php?no=CX261007A9A140EEB0"
  }
}
💡 Tampilkan qr_code + address di halaman Anda, atau arahkan pelanggan ke checkout_url. Pelanggan mengirim USDT ke alamat tsb via jaringan network. Jangan kirim setelah expire_at.

Fee: fee merchant 1,5% (ditanggung Anda) + margin kurs 2% (ditanggung pembeli). Contoh: tagihan Rp50.000 → pembeli bayar Rp51.000, fee Rp750, saldo Anda masuk Rp49.250.

3.7 Saldo Belanja (Wallet) — Portal

Selain menarik saldo (WD), merchant bisa membelanjakan saldo langsung dari portal merchant → menu 💰 Saldo Belanja. Semua fitur di Fase ini via portal (belum ada endpoint API).

FiturKeterangan
Belanja produkBeli produk/layanan (mis. paket Credit Jamiahlabs) pakai saldo. Fee 0% (tanpa biaya QRIS).
Transfer saldoKirim saldo ke merchant iDragonPay lain via member_id tujuan.
QR TransferMerchant punya QR berisi link transfer (Member ID-nya). Pengirim scan → form transfer terisi otomatis (anti salah ketik). Bisa juga QR tagihan (nominal terisi). Link: index.php?page=wallet&to=MEMBERID&amt=NOMINAL
PIN transaksiSet PIN 4–8 digit di portal. Setiap belanja/transfer wajib PIN. Salah 5× → terkunci 15 menit.
MutasiRiwayat semua pergerakan saldo dompet.
🔒 Transaksi bersifat atomik (anti double-spend) & setiap transaksi mengirim notifikasi Telegram.

Catatan: fitur ini closed-loop (hanya di dalam ekosistem iDragonPay). Belanja pakai saldo di QRIS merchant luar belum termasuk (butuh izin penerbit uang elektronik).

4. Callback (Notifikasi Pembayaran)

Setelah pelanggan membayar, kami mengirim notifikasi POST ke callback_url merchant Anda (didaftarkan saat pembuatan akun).

ParameterKeterangan
orderIdOrder ID sistem kami
merchantNoNomor order Anda
amountJumlah pembayaran (IDR)
channelChannel pembayaran (QRIS, DANA, dst. · CRYPTO untuk USDT)
statuspaid | failed
tradeTimeWaktu transaksi
signSignature — verifikasi dengan algoritma di bagian 2 (pakai secret key Anda)
⚠️ PENTING: Selalu verifikasi sign callback sebelum memproses — ini mencegah notifikasi palsu. Balas dengan teks OK atau SUCCESS. Jika callback gagal, kami retry otomatis hingga 5 kali.

Contoh verifikasi callback (PHP)

$raw = file_get_contents('php://input');
parse_str($raw, $p);
$sign = $p['sign'];
unset($p['sign']);
$calc = sign($p, $SECRET_KEY);
if (!hash_equals($calc, strtoupper($sign))) {
    http_response_code(403); exit('bad sign');
}
// sign valid — proses order sesuai status
echo 'OK';

5. Kode Error

CodeKeterangan
0Sukses
1411Fitur crypto belum diaktifkan untuk merchant
1401merchant_id & sign wajib
1402Parameter tidak valid / amount minimal 10.000
1403Signature tidak valid
1404Merchant tidak ditemukan / nonaktif
1406Order duplikat (merchant_no sudah dipakai)
1407Order tidak ditemukan
1429Terlalu banyak request (rate limit)
1501Saldo tidak cukup (penarikan)

6. Batas & Kebijakan

6.1 Whitelist IP (Opsional)

Untuk keamanan ekstra, Anda bisa mendaftarkan whitelist IP ke admin. Setelah diaktifkan, hanya request dari IP terdaftar yang bisa memanggil API pay-in (create) dan payout (withdraw) — IP lain ditolak dengan kode 1410.

Format yang didukung (pisahkan dengan koma):

Contoh: 103.138.189.69, 114.122.0.0/16, 202.62.*

💡 Whitelist kosong = semua IP diizinkan (default). Hubungi admin via Telegram @Jamiahfiver untuk mengatur whitelist IP Anda.

0. Mulai Cepat — 5 Menit

Integrasi iDragonPay paling singkat: 4 langkah. Tidak perlu kartu kredit — daftar dapat langsung member_id + secret_key.

  1. Daftar & ambil kunci — register.php → buka portal → menu API → salin member_id dan secret_key.
  2. Tes sandbox — kirim sandbox=1 di body. Sign tetap divalidasi, tapi tidak ada uang/order nyata; respons berisi "sandbox": true. Cocok untuk uji signature & parsing.
  3. Buat order asli — hapus sandbox dari body, lalu teruskan qr_code/pay_url ke pembeli.
  4. Terima callback — kami memanggil callback_url milikmu saat status berubah. Balas HTTP 200; jika tidak, kami kirim ulang otomatis.

🧪 Mode Sandbox

Tambah sandbox=1 (atau header X-Sandbox: 1) pada api/create.php / api/create_pg.php. Respons contoh:

{
  "code": 0,
  "msg": "success (SANDBOX — tidak ada order nyata)",
  "sandbox": true,
  "data": { "order_id": "SBX261012A1B2C3D4", "status": "pending", "pay_url": ".../docs.php#sandbox" }
}
✅ Sandbox tidak mengubah saldo, tidak membuat order nyata, dan tidak memanggil provider. Gunakan untuk memastikan sign benar sebelum produksi.

>> Coba langsung tanpa kode: buka Playground Sandbox — pilih channel, isi nominal, klik Coba, dan lihat respons JSON aslinya (pakai kredensial demo).

💻 Contoh 5 Menit (curl)

# 1) Siapkan kunci
MERCHANT_ID="MCH-xxxx"      # member_id kamu
SECRET="secret_key_kamu"

# 2) Susun sign: ksort param (tanpa sign) -> tambah key -> md5 -> UPPER
# Langkah ini biasanya dilakukan library kamu; lihat bagian "Skema Signature".

# 3) Uji SANDBOX (tidak ada uang nyata)
curl -s -X POST https://idragonpay.com/pay/api/create.php \
  -d "merchant_id=$MERCHANT_ID" -d "merchant_no=TEST-001" \
  -d "amount=10000" -d "channel=QRIS" -d "sandbox=1" -d "sign=$SIGN"

# 4) Kalau sukses -> hapus sandbox=1 -> order asli dibuat
📘 Sudah punya akun dan mau jadi agen/reseller? Buka halaman Jadi Agen — dapat komisi dari setiap transaksi merchant yang kamu rekrut.

Butuh bantuan integrasi? Hubungi kami via Telegram: @Jamiahfiver · Syarat & Ketentuan