modify-qris
v0.0.3
Published
Modify QRIS Generator is a javascript based libraries that enabling flexible payments with customizable amounts for improved efficiency and user experience
Downloads
10
Maintainers
Readme
QRIS Dynamic JS
A robust JavaScript/TypeScript library for generating dynamic QRIS (QR Code Indonesian Standard) codes. This library enables easy creation, modification, and validation of QRIS QR codes with comprehensive error handling.
Features
- ✅ Dynamic QRIS QR code generation
- ✅ Static QRIS QR code support
- ✅ Multiple output formats (string, terminal, base64, PNG file)
- ✅ Comprehensive error handling
- ✅ QRIS validation according to ASPI standards
- ✅ Fee calculations (fixed and percentage)
- ✅ TypeScript support with complete type definitions
- ✅ CRC validation and generation
Installation
npm install modify-qrisQuick Start
Basic Usage
import { QRIS, SourceType, PaymentFeeCategory } from 'modify-qris';
import path from 'path';
// Initialize QRIS with configuration
const qris = new QRIS({
sourceType: SourceType.CODE, // Directly use a QRIS code string
sourceValue: '00020101021226...', // Your QRIS string
merchantAddress: 'Jakarta',
merchantPostalCode: '12345',
amount: 25000, // In the smallest currency unit (e.g., IDR)
feeCategory: PaymentFeeCategory.FIXED,
fee: 1000,
terminalLabel: 'A01',
});
// Generate QR code and save to file
qris.generateQRFile('output.png')
.then(filePath => {
console.log(`QR code saved to: ${filePath}`);
})
.catch(error => {
console.error('Error generating QR code:', error.message);
});Reading from an Existing QR Image
import { QRIS, SourceType } from 'modify-qris';
import path from 'path';
// Initialize QRIS from an image
const qris = new QRIS({
sourceType: SourceType.IMAGE_PATH,
sourceValue: path.join(__dirname, 'existing-qr.png'),
merchantAddress: 'New Merchant Address', // Override merchant address
amount: 50000, // Set a fixed amount
});
// Generate different outputs
async function generateOutputs() {
try {
// Get QRIS as a string
const qrString = await qris.generateQR();
console.log('QRIS string:', qrString);
// Get QRIS as base64 for web display
const qrBase64 = await qris.generateQRBase64();
console.log('QRIS base64:', qrBase64.substring(0, 50) + '...');
// Get QRIS as terminal-friendly ASCII art
const qrTerminal = await qris.generateQRTerminal();
console.log('QRIS terminal output:', qrTerminal);
// Save QRIS to a file
const filePath = await qris.generateQRFile('modified-qr.png');
console.log('QRIS saved to:', filePath);
} catch (error) {
console.error('Error processing QRIS:', error);
}
}
generateOutputs();Error Handling
The library provides robust error handling with detailed error codes and messages:
import { QRIS, SourceType, PaymentFeeCategory } from 'modify-qris';
// Example with proper error handling
try {
const qris = new QRIS({
sourceType: SourceType.IMAGE_PATH,
sourceValue: 'non-existent-file.png',
merchantAddress: 'BANDUNG',
feeCategory: PaymentFeeCategory.PERCENT,
fee: 200, // Will cause an error (over 100%)
});
await qris.generateQRFile('output.png');
} catch (error) {
// Check for specific error types
if (error.message.includes('fee may not exceed 100')) {
console.error('Fee percentage must be 100 or lower');
} else if (error.message.includes('no such file')) {
console.error('Source file not found');
} else {
console.error('Error generating QR code:', error.message);
}
}Custom Error Handling
For more advanced error handling, you can create a custom error handler function:
// Custom error handler function
function handleQRISError(error) {
// Extract error details
const code = error.code || 'UNKNOWN_ERROR';
const message = error.message || 'An unknown error occurred';
// Handle specific error types
switch (code) {
case 'FEE_EXCEEDED':
console.error('Fee Error: The percentage fee cannot exceed 100%');
// Take corrective action
break;
case 'SOURCE_NOT_FOUND':
console.error('File Error: The source QR file could not be found');
// Suggest alternative file paths
break;
case 'VALIDATION_FAILED':
console.error('Validation Error:', message);
// Log detailed validation errors
if (error.details) {
console.error('Validation details:', error.details);
}
break;
default:
console.error(`QRIS Error (${code}):`, message);
}
// Log error for diagnostic purposes
console.debug('Error details:', error);
}
// Use the custom handler
try {
const qris = new QRIS({/*...*/});
await qris.generateQRFile('output.png');
} catch (error) {
handleQRISError(error);
}Configuration Options
| sourceType | string | Source type (CODE or IMAGE_PATH) | CODE |
| sourceValue | string | QRIS code string or image path | - |
| merchantAddress | string | Merchant address/city | - |
| merchantPostalCode | string | Merchant postal code | - |
| amount | number | Transaction amount (0 for dynamic amount) | 0 |
| feeCategory | string | Fee category (FIXED or PERCENT) | - |
| fee | number | Fee amount (max 100 if PERCENT) | 0 |
| terminalLabel | string | Custom terminal label | - |
API Reference
The library provides a simple API for working with QRIS codes:
Methods
Generation Methods
generateQR(): Generates QRIS code as a stringgenerateQRBase64(): Generates QRIS code as base64 imagegenerateQRTerminal(): Generates QRIS code as ASCII art for terminal displaygenerateQRFile(output: string): Generates and saves QRIS code to a file
Configuration Setters
setMerchantAddress(address: string)setMerchantPostalCode(postalCode: string)setAmount(amount: number)setFeeCategory(feeCategory: string)setFee(fee: number)setTerminalLabelCategory(label: string)
For detailed API documentation, please refer to API.md.
Important Note
⚠️ Use Responsibly
QRIS (QR Code Indonesian Standard) is governed by standards and regulations set by Bank Indonesia and ASPI (Asosiasi Sistem Pembayaran Indonesia). This library is provided for legitimate business and development purposes only.
Please use this library responsibly and ensure that any QRIS codes you generate comply with relevant regulations and standards. The library creators are not responsible for any misuse or for QR codes that do not conform to the official QRIS specifications.
When implementing this in production environments, always:
- Test thoroughly with small transaction amounts
- Validate your QRIS implementations with your payment service provider
- Follow security best practices when handling payment information
- Ensure your implementation complies with the latest QRIS standards
- Do not use this library for fraudulent or misleading purposes
Known Limitations
- The library currently supports QRIS specification version 1.0
- Some advanced QRIS features like loyalty programs may not be fully implemented
- Not all QRIS acquirer-specific extensions are supported
- QR code reading capabilities depend on the quality of the source image
Contributing
Contributions are welcome! Please feel free to submit a Pull Request or open an issue for discussion.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
MIT License
Copyright (c) 2025 Ferdhika Yudira
