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 Rp 5.000 per transaksi, dipotong otomatis. Saldo dibekukan saat pengajuan dan dikembalikan penuh jika ditolak.

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
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
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

Butuh bantuan integrasi? Hubungi kami via Telegram: @gudang168_bot ยท Syarat & Ketentuan