Mulai di Sini
Dua cara integrasi
Base URL untuk semua endpoint di bawah:
https://h2hgasstopup.vercel.app
| Metode | Cocok untuk | Cara kerja |
|---|---|---|
| Transaksi Langsung | Sistem yang sudah punya saldo/pembayaran sendiri | Kirim satu request, transaksi diproses instan |
| Order + QRIS | Butuh sistem pembayaran juga | Customer scan QRIS, transaksi diproses otomatis setelah bayar |
Autentikasi
Endpoint yang ditandai butuh key minta parameter key yang cocok dengan secret yang disepakati bersama admin Fallshop.
!
Jangan bagikan key ke pihak yang tidak dipercaya — siapapun yang punya key ini bisa memproses transaksi langsung tanpa lewat pembayaran.
GETCek Harga / Daftar Produk
GET/api/produk
Tanpa autentikasi. Balikin semua produk yang tersedia beserta kodeproduk dan harga jual terbaru.
Response
{
"products": [
{
"kodeproduk": "TT5",
"nama": "Telkomsel Telepon Pas 5.000",
"harga": 4745
}
],
"synced_at": 1752033600000
}
"products": [
{
"kodeproduk": "TT5",
"nama": "Telkomsel Telepon Pas 5.000",
"harga": 4745
}
],
"synced_at": 1752033600000
}
| Field | Keterangan |
|---|---|
| kodeproduk | Dipakai di parameter kodeproduk saat transaksi |
| nama | Nama produk untuk ditampilkan ke customer |
| harga | Harga jual dalam Rupiah (integer) |
POSTTransaksi Langsungbutuh key
POST/api/h2h/trx
Proses transaksi H2H instan, tanpa lewat QRIS. Cocok kalau sistem kamu sudah handle pembayaran/saldo sendiri.
Body
| Parameter | Wajib | Contoh | Keterangan |
|---|---|---|---|
| key | Ya | abc123secret | Secret autentikasi |
| kodeproduk | Ya | TT5 | Kode produk dari endpoint Cek Produk |
| tujuan | Ya | 081234567890 | Nomor HP / ID pelanggan |
| idtrx | Tidak | ORD20250710001 | Reff ID dari sistem kamu, auto-generate kalau kosong |
Request
curl -X POST https://h2hgasstopup.vercel.app/api/h2h/trx \
-H "Content-Type: application/json" \
-d '{
"key": "abc123secret",
"kodeproduk": "TT5",
"tujuan": "081234567890"
}'
-H "Content-Type: application/json" \
-d '{
"key": "abc123secret",
"kodeproduk": "TT5",
"tujuan": "081234567890"
}'
Response sukses
{
"success": true,
"idtrx": "ORD20250710001",
"message": "TrxID#1285456 ReffID#ORD20250710001 BERHASIL..."
}
"success": true,
"idtrx": "ORD20250710001",
"message": "TrxID#1285456 ReffID#ORD20250710001 BERHASIL..."
}
Response gagal
{
"success": false,
"idtrx": "ORD20250710001",
"message": "Saldo tidak cukup. Butuh: 4.795"
}
"success": false,
"idtrx": "ORD20250710001",
"message": "Saldo tidak cukup. Butuh: 4.795"
}
i
Cek keberhasilan dari field
success (boolean) — isi message adalah teks asli dari provider, formatnya tidak selalu konsisten.
POSTBuat Order + QRISpublik
POST/api/h2h/order
Bikin order yang wajib dibayar lewat QRIS dulu. Transaksi diproses otomatis di sisi kami setelah pembayaran terverifikasi. Tidak butuh key.
Body
| Parameter | Wajib | Contoh | Keterangan |
|---|---|---|---|
| kodeproduk | Ya | TT5 | Kode produk |
| tujuan | Ya | 081234567890 | Nomor HP / ID pelanggan |
Response
{
"id": "1783576536488",
"amount": 4783,
"amount_asli": 4745,
"nama_produk": "Telkomsel Telepon Pas 5.000",
"qr": "data:image/png;base64,...",
"expired": 300
}
"id": "1783576536488",
"amount": 4783,
"amount_asli": 4745,
"nama_produk": "Telkomsel Telepon Pas 5.000",
"qr": "data:image/png;base64,...",
"expired": 300
}
| Field | Keterangan |
|---|---|
| id | ID order, dipakai untuk cek status |
| amount | Nominal PERSIS yang harus ditransfer (sudah + kode unik) |
| qr | Base64 data URL, siap dipasang ke <img> |
| expired | Batas waktu pembayaran dalam detik |
!
Customer wajib transfer nominal PERSIS di field
amount, bukan amount_asli. Kalau dibulatkan sendiri, sistem tidak bisa mencocokkan pembayaran otomatis.
GETCek Status Order
GET/api/qris/status?rrn={id}
Cek status pembayaran & transaksi H2H dari order yang dibuat lewat /api/h2h/order.
Response — masih menunggu
{ "status": "PENDING" }
Response — sudah dibayar & diproses
{
"status": "SUCCESS",
"data": {
"kodeproduk": "TT5",
"h2h_status": "SUKSES",
"h2h_response": "TrxID#1285456 BERHASIL..."
}
}
"status": "SUCCESS",
"data": {
"kodeproduk": "TT5",
"h2h_status": "SUKSES",
"h2h_response": "TrxID#1285456 BERHASIL..."
}
}
| Field | Keterangan |
|---|---|
| status | PENDING / SUCCESS / EXPIRED — status pembayaran |
| data.h2h_status | MENUNGGU_PEMBAYARAN / SUKSES / GAGAL / ERROR |
i
Polling tiap 3-5 detik selama
PENDING, berhenti begitu SUCCESS atau EXPIRED.
POSTCallback QRISinternal
POST/api/callbackqris/{secret}
!
Dipanggil oleh provider QRIS (SMP Payment), bukan untuk dipanggil sistem eksternal. Dicantumkan untuk referensi arsitektur saja.
Kode Respon
| Status | Keterangan |
|---|---|
200 | Diterima & diproses — cek success/status di body untuk hasil aslinya |
400 | Parameter tidak lengkap / tidak valid |
401 | Key tidak valid / tidak dikirim |
404 | Produk / data tidak ditemukan |
405 | Method HTTP salah |
500 | Kesalahan server / provider H2H |
503 | Sistem sibuk (jarang terjadi) |
Contoh Kode
PHP — Transaksi Langsung
<?php
$data = [
"key" => "abc123secret",
"kodeproduk" => "TT5",
"tujuan" => "081234567890"
];
$ch = curl_init("https://h2hgasstopup.vercel.app/api/h2h/trx");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
$data = [
"key" => "abc123secret",
"kodeproduk" => "TT5",
"tujuan" => "081234567890"
];
$ch = curl_init("https://h2hgasstopup.vercel.app/api/h2h/trx");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
JavaScript — Order + QRIS
const res = await fetch("https://h2hgasstopup.vercel.app/api/h2h/order", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ kodeproduk: "TT5", tujuan: "081234567890" })
});
const order = await res.json();
// order.amount = nominal persis yang harus ditransfer
// order.qr = base64 QR image
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ kodeproduk: "TT5", tujuan: "081234567890" })
});
const order = await res.json();
// order.amount = nominal persis yang harus ditransfer
// order.qr = base64 QR image