Generator QRIS dengan fingerprint in-QR berbasis FastAPI (Python 3.11). ⚡
- Python 3.11 (disarankan via pyenv atau installer resmi)
- Git
- (Opsional) Docker 24+
- 🐍 Python 3.11 (disarankan via pyenv atau installer resmi)
- 🌀 Git
- 🐳 (Opsional) Docker 24+
- Python 3.11 (disarankan via pyenv atau installer resmi)
- Git
- (Opsional) Docker 24+
git clone https://github.com/moccalatte/qriscuy.git
cd qriscuy- Rekomendasi: gunakan pyenv
pyenv install 3.11.9 # jika belum ada
pyenv local 3.11.9Atau pastikan python3.11 --version mengembalikan 3.11.x
- Salin file contoh:
cp .env.example .env
- Edit
.envsesuai kebutuhan (ganti semua nilai rahasia sebelum ke produksi).
PYTHON_BIN=$(pyenv which python3.11 2>/dev/null || command -v python3.11)
QRISCUY_MODE=SAFE ./run.shPerintah di atas otomatis:
- Membuat virtualenv
.venv - Install dependensi dari
requirements.txt - Menjalankan Uvicorn di
http://0.0.0.0:8000
curl http://localhost:8000/healthJika sukses, akan mendapat response status OK.
app/— kode utama FastAPI, encoder, renderer, dsbservices/— logika generator, scan, errorrun.sh— script utama jalankan server.gitignore— sudah disiapkan, aman untuk push ke GitHub
docker build -t qriscuy .
docker run --rm -p 8000:8000 --env-file .env qriscuy- Semua error/log dicatat jelas (lihat
project_rules.md) 📝 - Tidak ada perubahan besar tanpa permintaan eksplisit 🚫
- File/fungsi harus single responsibility 🧩
- Rollback mudah: cukup checkout commit sebelumnya ⏪
-
Cek status server
curl -H "X-API-Key: ubah-api-key" http://localhost:8000/healthJika sukses, akan mendapat response status OK.
-
Jelajahi API
- Dokumentasi interaktif: http://localhost:8000/docs
- Endpoint metrics Prometheus: http://localhost:8000/metrics
-
Hentikan server
- Tekan
Ctrl+Cpada terminal yang menjalankanrun.sh.
- Tekan
Catatan: Jika
PYTHON_BINtidak mengarah ke Python 3.11, script akan berhenti dan meminta Anda memasang versi yang benar.
| Nama | Keterangan |
|---|---|
API_KEY |
Digunakan untuk header X-API-Key (WAJIB diganti di produksi) |
HMAC_SECRET |
Kunci HMAC untuk tanda tangan fingerprint (WAJIB diganti) |
QRISCUY_MODE |
FAST atau SAFE |
DATABASE_URL |
Default SQLite lokal (sqlite+aiosqlite:///./qriscuy.db). Untuk Docker: /app/data/qriscuy.db |
ALLOWED_ORIGINS |
Daftar CORS (JSON array) jika menggunakan frontend berbeda domain |
POST /v1/qr— generate invoice + QR baru dengan Tag 62 fingerprint & signaturePOST /v1/scan— callback ketika QR discan oleh client terkendaliGET /v1/invoices/{id}— cek status invoicePOST /v1/invoices/{id}/confirm— konfirmasi manual (mode SAFE) menjadiSUCCESSatauREJECTEDGET /health— health check sederhana
- User kirim payload QRIS asli ke
/v1/qr→ sistem menyisipkan Tag 62 (FP,SIG,TS,ALG) - Client pemindai mengirim
/v1/scandengan fingerprint & signature - Mode
FAST→ invoice otomatisSUCCESS. ModeSAFE→ status tetapSCANNEDhingga konfirmasi manual
POST /v1/qr→ pastikan respons memuatpayload,qr_png_base64,fingerprint_b64,signature_hex,crc- Decode
payloaddan cek Tag 62 berisi sub-tag01..05, CRC valid POST /v1/scandengan data respons tahap 1 → status berubah (SCANNEDatauSUCCESStergantung mode)- Mode
SAFE: panggil/v1/invoices/{id}/confirmdengan{"action":"SUCCESS"}→ statusSUCCESS - Uji TTL: tunggu >
settings.ttl_secondslalu ulangi/v1/scan→ respon errorERR_FP_EXPIRED - Uji replay: kirim
/v1/scandua kali berturut → panggilan kedua mengembalikanERR_REPLAY
- Hentikan proses
uvicornberjalan - Restore backup file konfigurasi dan database
qriscuy.db(atau hapus untuk reset) - Jalankan ulang
./run.shuntuk memastikan semua dependensi bersih
- Semua request dicatat dalam log JSON (
loggerqriscuy.httpdanqriscuy.api) beserta status kode dan durasi - Kesalahan layanan (
ServiceError) serta exception lain otomatis tercatat dengan stack trace - Endpoint
GET /metricsmengekspor metrik Prometheus (qriscuy_http_requests_total,qriscuy_http_request_duration_seconds,qriscuy_service_errors_total). Integrasikan dengan Prometheus atau cek cepat viacurl localhost:8000/metrics
- Build image
docker build -t qriscuy:latest . - Menjalankan container
docker run -d \ --name qriscuy \ -p 8000:8000 \ -e API_KEY="ubah-api-key" \ -e HMAC_SECRET="ubah-hmac-secret" \ -e QRISCUY_MODE="SAFE" \ -e DATABASE_URL="sqlite+aiosqlite:///data/qriscuy.db" \ -v $(pwd)/data:/app/data \ qriscuy:latest
- Direktori
$(pwd)/datamenyimpan database SQLite secara persisten. - Untuk mengaktifkan CORS khusus, set
ALLOWED_ORIGINS, misal['https://qriscuy.potion.my.id'].
- Direktori
Misal Anda ingin mengarahkan https://qriscuy.potion.my.id ke container lokal melalui Cloudflare Tunnel:
docker run -d \
--name cloudflared \
--network host \
-v $HOME/.cloudflared:/etc/cloudflared \
cloudflare/cloudflared:latest tunnel run <NAMA_TUNNEL>- Pastikan tunnel mem-forward ke
http://localhost:8000(atau host/port sesuaidocker run). - Atur CNAME di Cloudflare dashboard untuk
qriscuy.potion.my.id→<UUID>.cfargotunnel.com. - Setelah tunnel aktif, domain akan proxy ke layanan FastAPI yang berjalan di container.