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

LangkahKeterangan
1Buka aplikasi QR Scanner di HP (QR & Barcode Scanner, atau bawaan HP)
2Scan QR code merchant GoPay / QRIS lo
3Copy teks hasil scan — biasanya formatnya: 00020101021126580011ID.CO.QRIS...
4Paste 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

ParameterTipeReqDeskripsi
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
}
FieldDeskripsi
qris_base64Gambar QR dalam base64 — lo tinggal render sebagai data:image/png;base64,...
qris_stringString QRIS dinamis — bisa di-scan manual atau digenerate ulang
amountNominal asli tanpa unique code
unique_codeKode unik (0 jika tidak dipakai)
total_amountNominal 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 StatusResponsePenyebab
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
💡 Tips untuk Bot Telegram:
• 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 nominalRp 1
Maks nominalRp 5.000.000
Format QRISEMVCo (000201...) — QR statis / merchant QRIS
Output QRPNG base64 (400x400)
Rate limit60 request/menit per IP

Changelog

TanggalVersiKeterangan
21 Jul 2026v1.0Rilis awal — QRIS statis → dinamis + generate QR base64
QrisKu v1.0 — API Documentation