API REST untuk mengubah QRIS Statis menjadi QRIS Dinamis dengan nominal yang dapat disesuaikan. Cocok untuk UMKM, e-commerce, atau aplikasi yang membutuhkan pembayaran QRIS dengan nominal yang fleksibel.
- π Mengubah QRIS Statis menjadi QRIS Dinamis melalui REST API
- π° Mengatur nominal pembayaran sesuai kebutuhan
- π± Mendukung upload gambar QRIS dalam berbagai format
- πΌοΈ Menghasilkan QRIS dalam bentuk file gambar atau buffer
- β° Otomatis mengelola masa berlaku QRIS Dinamis
- π Endpoint untuk memeriksa informasi QRIS yang telah dibuat
- π CORS enabled untuk integrasi frontend
- Node.js versi 16 atau lebih baru
- npm atau yarn
- Clone repository ini:
git clone <repository-url>
cd qris-dinamis-api
- Install dependencies:
npm install
- Buat file
.env
dan konfigurasi environment variables:
PORT=3000
- Jalankan server:
# Mode development (dengan auto-reload)
npm run dev
# Mode production
npm start
Server akan berjalan di http://localhost:3000
http://localhost:3000/api
Memeriksa status server API.
Endpoint: GET /api/health
Response:
{
"status": "OK",
"message": "QRIS Dynamic API is running",
"timestamp": "2024-01-01T12:00:00.000Z"
}
Upload gambar QRIS statis untuk diproses.
Endpoint: POST /api/qris/upload
Content-Type: multipart/form-data
Body:
qris
(file): File gambar QRIS statis (JPG, PNG, dll.)
Contoh Request:
curl -X POST \
http://localhost:3000/api/qris/upload \
-F "qris=@path/to/qris-image.jpg"
Response:
{
"success": true,
"data": {
"qrisId": "uuid-generated-id",
"qrisString": "00020101021126...",
"message": "QRIS statis berhasil diproses"
}
}
Membuat QRIS dinamis dengan nominal tertentu dan menyimpannya sebagai file.
Endpoint: POST /api/qris/generate
Content-Type: application/json
Body:
{
"qrisId": "uuid-from-upload-response",
"nominal": 50000
}
Contoh Request:
curl -X POST \
http://localhost:3000/api/qris/generate \
-H "Content-Type: application/json" \
-d '{
"qrisId": "your-qris-id",
"nominal": 50000
}'
Response:
{
"success": true,
"data": {
"qrisId": "generated-qris-id",
"nominal": 50000,
"expirationTime": 1704110400000,
"message": "QRIS dinamis berhasil dibuat"
}
}
Membuat QRIS dinamis dan langsung mengembalikan file gambar.
Endpoint: POST /api/qris/generate-buffer
Content-Type: application/json
Body:
{
"qrisId": "uuid-from-upload-response",
"nominal": 75000
}
Response: File gambar PNG (binary data)
Contoh Request:
curl -X POST \
http://localhost:3000/api/qris/generate-buffer \
-H "Content-Type: application/json" \
-d '{
"qrisId": "your-qris-id",
"nominal": 75000
}' \
--output qris-dinamis.png
Mengunduh file QRIS yang telah dibuat sebelumnya.
Endpoint: GET /api/qris/:id
Response: File gambar QRIS
Contoh Request:
curl -X GET \
http://localhost:3000/api/qris/your-qris-id \
--output downloaded-qris.png
Mendapatkan informasi QRIS tanpa mengunduh file.
Endpoint: GET /api/qris/:id/info
Response:
{
"success": true,
"data": {
"qrisId": "your-qris-id",
"nominal": 50000,
"expirationTime": 1704110400000,
"generatedAt": 1704108600000,
"isExpired": false
}
}
- Upload QRIS Statis:
curl -X POST \
http://localhost:3000/api/qris/upload \
-F "qris=@qris-statis.jpg"
- Generate QRIS Dinamis:
curl -X POST \
http://localhost:3000/api/qris/generate \
-H "Content-Type: application/json" \
-d '{
"qrisId": "hasil-dari-upload",
"nominal": 100000
}'
// Upload QRIS Statis
const uploadQRIS = async (file) => {
const formData = new FormData();
formData.append('qris', file);
const response = await fetch('/api/qris/upload', {
method: 'POST',
body: formData
});
return await response.json();
};
// Generate QRIS Dinamis
const generateDynamicQRIS = async (qrisId, nominal) => {
const response = await fetch('/api/qris/generate-buffer', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ qrisId, nominal })
});
return await response.blob(); // Untuk mendapatkan gambar
};
import requests
# Upload QRIS Statis
def upload_qris(file_path):
with open(file_path, 'rb') as f:
files = {'qris': f}
response = requests.post('http://localhost:3000/api/qris/upload', files=files)
return response.json()
# Generate QRIS Dinamis
def generate_dynamic_qris(qris_id, nominal):
data = {'qrisId': qris_id, 'nominal': nominal}
response = requests.post('http://localhost:3000/api/qris/generate', json=data)
return response.json()
File qrDinamis.js
adalah modul inti yang menyediakan fungsi-fungsi untuk mengubah QRIS statis menjadi dinamis:
qrisDinamis(qrstring, nominal, path)
: Membuat QRIS dinamis dan menyimpan sebagai fileqrisDinamisBuffer(qrstring, nominal)
: Membuat QRIS dinamis dalam bentuk buffertoCRC16(str)
: Fungsi helper untuk menghitung checksum CRC16
- Mengambil string QRIS statis
- Mengubah format dari statis (010211) menjadi dinamis (010212)
- Menambahkan informasi nominal ke dalam string QRIS
- Menghitung ulang checksum CRC16
- Menghasilkan QR Code baru dengan nominal yang ditentukan
- Format Input: Pastikan gambar QRIS yang diupload jelas dan tidak blur
- Nominal: Masukkan nominal dalam bentuk angka (contoh: 50000 untuk Rp 50.000)
- Masa Berlaku: QRIS dinamis memiliki masa berlaku sesuai konfigurasi server
- File Management: Server akan otomatis membersihkan file temporary yang sudah kadaluarsa
- Error Handling: Semua endpoint dilengkapi dengan error handling yang informatif
- Validasi input pada semua endpoint
- Sanitasi file upload untuk mencegah malicious files
- Rate limiting (dapat dikonfigurasi)
- CORS configuration untuk kontrol akses
npm install -g pm2
pm2 start server.js --name "qris-api"
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Kontribusi sangat diterima! Silakan:
- Fork repository ini
- Buat branch untuk fitur baru (
git checkout -b feature/fitur-baru
) - Commit perubahan (
git commit -am 'Menambah fitur baru'
) - Push ke branch (
git push origin feature/fitur-baru
) - Buat Pull Request
Proyek telah diorganisir dengan struktur yang lebih rapi dan terstruktur:
Qris-Dinamis/
βββ src/ # Source code utama
β βββ controllers/ # Route controllers (untuk pengembangan future)
β βββ middleware/ # Express middleware
β β βββ errorHandler.js # Error handling middleware
β β βββ upload.js # File upload middleware
β βββ routes/ # API routes
β β βββ qris.js # QRIS endpoints
β βββ services/ # Business logic
β β βββ qrisService.js # QRIS processing service
β β βββ qrReaderService.js # QR code reader service
β βββ utils/ # Utility functions
β β βββ qris.js # QRIS generation utilities (sebelumnya qrDinamis.js)
β βββ config/ # Configuration files (untuk pengembangan future)
βββ public/ # Static files
β βββ test.html # Test page untuk API (dipindahkan dari root)
βββ uploads/ # File upload directory
β βββ .gitkeep # Keep directory in git
βββ .env.example # Environment variables template
βββ .gitignore # Git ignore rules (diperbarui)
βββ package.json # Node.js dependencies
βββ server.js # Main server file
βββ README.md # Project documentation
- Organisasi yang lebih baik: Semua source code dipindahkan ke folder
src/
- Pemisahan concerns: Middleware, routes, services, dan utilities dipisahkan ke folder masing-masing
- Static files: File
test.html
dipindahkan ke folderpublic/
- Utilities: File
qrDinamis.js
dipindahkan kesrc/utils/qris.js
- Environment template: Ditambahkan
.env.example
untuk template konfigurasi - Improved gitignore: File
.gitignore
diperbarui dengan rules yang lebih lengkap
- Maintainability: Kode lebih mudah dipelihara dan dikembangkan
- Scalability: Struktur siap untuk pengembangan fitur yang lebih kompleks
- Best Practices: Mengikuti standar industri untuk proyek Node.js
- Team Development: Memudahkan kolaborasi tim dengan struktur yang jelas
Jika mengalami masalah atau memiliki pertanyaan, silakan buat issue di repository ini.