QrisKu API Documentation
Ubah QRIS statis menjadi dinamis dengan nominal berapa pun — cukup kirim string QRIS dan jumlah nominal.
A. Pendahuluan
QrisKu adalah API converter yang mengubah QRIS statis (QR code merchant dengan nominal tetap) menjadi QRIS dinamis (dengan nominal yang bisa ditentukan). Cocok untuk bot Telegram, website, atau aplikasi yang membutuhkan pembayaran QRIS dengan nominal dinamis.
💡 Cara Kerja: API menerima string QRIS statis + nominal → melakukan parsing EMVCo → inject nominal → hitung ulang CRC16-CCITT → generate QR code baru → return base64.
Kenapa QrisKu?
| 💰 Dana langsung ke rekening lo | ✅ Instant, tanpa kliring 3 hari |
| 📱 Bisa pake QRIS GoPay / bank mana pun | ✅ Tinggal copy string QR |
| 🔌 API sederhana | ✅ Satu endpoint, JSON in/out |
| 🤖 Cocok buat Telegram bot | ✅ Return base64, tinggal kirim |
B. Cara Dapat String QRIS Statis
QRIS statis bisa lo dapatkan dari QR code merchant (GoPay Merchant, QRIS bank, dll):
B.1. Via Aplikasi QR Scanner
| Langkah | Keterangan |
|---|---|
| 1 | Buka aplikasi QR Scanner di HP (QR & Barcode Scanner, atau bawaan HP) |
| 2 | Scan QR code merchant GoPay / QRIS lo |
| 3 | Copy teks hasil scan — biasanya formatnya: 00020101021126580011ID.CO.QRIS... |
| 4 | Paste string tersebut ke parameter qris_statis |
⚠️ Penting: Pastikan string QRIS dimulai dengan
000201 atau 000202 (format EMVCo). Jika hasil scan cuma angka/nomor, bukan itu — cari scanner yang menampilkan "Teks" atau "Raw Data".
B.2. Contoh String QRIS
00020101021126580011ID.CO.QRIS.WWW01189360091800216005230208216005230303UME51440014ID.CO.QRIS.WWW0215ID10243228429300303UME5204792953033605409100003.005802ID5907TOKO ANDA6012KAB. KEBUMEN61055439262230519SP25RZRATEQI2HQ65Q46304A079
C. API Endpoint
Satu endpoint untuk mengonversi QRIS statis ke dinamis.
POST
https://qrisku.xstore1.my.id/api.php
Content-Type: application/json
Base URL (alternatif): http://113.29.232.163:8080/api.php
Request Body
| Parameter | Tipe | Req | Deskripsi |
|---|---|---|---|
amount |
number | wajib | Nominal pembayaran (min 1, maks 5.000.000) |
qris_statis |
string | wajib | String QRIS statis (format EMVCo, hasil scan QR) |
unique_code |
bool/int | opsional | Kode unik biar ga tabrakan pas cek mutasi. true (auto random Rp 1-999), angka manual (contoh: 777), atau false/dikosongkan (0). |
Contoh Request
{
"amount": 50000,
"qris_statis": "00020101021126580011ID.CO.QRIS.WWW0118936009180021600523...",
"unique_code": true
}
💡 unique_code: true auto-generate kode unik Rp 1-999 biar ga tabrakan pas cek mutasi
Response Sukses (200)
{
"status": "success",
"message": "QRIS berhasil dihasilkan",
"qris_base64": "iVBORw0KGgoAAAANSUhEUgAA...",
"qris_string": "00020101021126580011ID.CO.QRIS.WWW...540850225.006304713C",
"amount": 50000,
"unique_code": 225,
"total_amount": 50225
}
| Field | Deskripsi |
|---|---|
qris_base64 | Gambar QR dalam base64 — lo tinggal render sebagai data:image/png;base64,... |
qris_string | String QRIS dinamis — bisa di-scan manual atau digenerate ulang |
amount | Nominal asli tanpa unique code |
unique_code | Kode unik (0 jika tidak dipakai) |
total_amount | Nominal total yang harus dibayar (amount + unique code) |
D. Contoh Kode
curl -X POST 'https://qrisku.xstore1.my.id/api.php' \
-H 'Content-Type: application/json' \
-d '{
"amount": 50000,
"qris_statis": "00020101021126580011ID.CO.QRIS.WWW..."
}'
<?php
$url = 'https://qrisku.xstore1.my.id/api.php';
$data = [
'amount' => 50000,
'qris_statis' => '00020101021126580011ID.CO.QRIS.WWW...'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result['status'] === 'success') {
// Kirim QR ke user Telegram
$qrBase64 = $result['qris_base64'];
bot('sendPhoto', [
'chat_id' => $chatId,
'photo' => 'data:image/png;base64,' . $qrBase64,
'caption' => "💳 *Pembayaran QRIS*\nRp " . number_format($result['amount']) . "\n\nScan QRIS untuk membayar"
]);
} else {
echo "Error: " . $result['message'];
}
?>
import requests
import base64
url = "https://qrisku.xstore1.my.id/api.php"
payload = {
"amount": 50000,
"qris_statis": "00020101021126580011ID.CO.QRIS.WWW..."
}
res = requests.post(url, json=payload)
data = res.json()
if data["status"] == "success":
# Simpan QR sebagai file
with open("qris.png", "wb") as f:
f.write(base64.b64decode(data["qris_base64"]))
print(f"QRIS Rp {data['amount']} berhasil dibuat")
else:
print(f"Error: {data['message']}")
const axios = require('axios');
const payload = {
amount: 50000,
qris_statis: '00020101021126580011ID.CO.QRIS.WWW...'
};
axios.post('https://qrisku.xstore1.my.id/api.php', payload)
.then(res => {
if (res.data.status === 'success') {
console.log('QRIS berhasil:', res.data.amount);
// res.data.qris_base64 -> kirim ke user
}
})
.catch(err => console.error(err));
// Untuk browser / fetch API
const payload = {
amount: 50000,
qris_statis: '00020101021126580011ID.CO.QRIS.WWW...'
};
fetch('https://qrisku.xstore1.my.id/api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
})
.then(r => r.json())
.then(data => {
if (data.status === 'success') {
// Tampilkan QR
document.getElementById('qris-img').src =
'data:image/png;base64,' + data.qris_base64;
document.getElementById('info').textContent =
'Rp ' + data.amount.toLocaleString();
}
});
E. Error Handling
| HTTP Status | Response | Penyebab |
|---|---|---|
| 400 | {"status":"error","message":"Jumlah dan QRIS Statis diperlukan"} | Parameter amount atau qris_statis kosong |
| 400 | {"status":"error","message":"Jumlah minimal Rp 1"} | Nominal kurang dari 1 |
| 400 | {"status":"error","message":"Jumlah maksimal Rp 5.000.000"} | Nominal lebih dari 5 juta |
| 405 | {"status":"error","message":"Method not allowed"} | Method selain POST |
| 500 | {"status":"error","message":"Gagal memproses QRIS: ..."} | String QRIS tidak valid atau error server |
❌ String QRIS tidak valid: Pastikan string dimulai dengan
000201 atau 000202 dan memiliki CRC (Tag 63) di akhir. Jika tidak, API akan mengembalikan error.
F. Catatan Penting
⚠️ Tidak ada callback otomatis! QrisKu hanya mengonversi QR statis → dinamis. Kami tidak memproses pembayaran. Untuk deteksi pembayaran masuk, Anda harus:
Opsi 1: Cron job tiap 30-60 detik cek mutasi rekening/bank
Opsi 2: Integrasikan dengan payment gateway resmi (TriPay, Xendit) untuk webhook otomatis
Opsi 3: Manual — user kirim bukti transfer
Opsi 1: Cron job tiap 30-60 detik cek mutasi rekening/bank
Opsi 2: Integrasikan dengan payment gateway resmi (TriPay, Xendit) untuk webhook otomatis
Opsi 3: Manual — user kirim bukti transfer
💡 Tips untuk Bot Telegram:
• Simpan
• Set QRIS expired 1 jam — hapus dari memory bot
• Gunakan nominal unik (ex: 50050) biar gampang dicocokin pas cek mutasi
• Simpan
qris_string di database — untuk verifikasi nanti• Set QRIS expired 1 jam — hapus dari memory bot
• Gunakan nominal unik (ex: 50050) biar gampang dicocokin pas cek mutasi
Batasan
| Min nominal | Rp 1 |
| Maks nominal | Rp 5.000.000 |
| Format QRIS | EMVCo (000201...) — QR statis / merchant QRIS |
| Output QR | PNG base64 (400x400) |
| Rate limit | 60 request/menit per IP |
Changelog
| Tanggal | Versi | Keterangan |
|---|---|---|
| 21 Jul 2026 | v1.0 | Rilis awal — QRIS statis → dinamis + generate QR base64 |
QrisKu v1.0 — API Documentation