A robust, TypeScript-ready library for generating NPCI-compliant UPI QR codes with intent URLs
Generate UPI QR codes (BASE64) along with UPI intent links for seamless payments through any UPI-enabled app. Perfect for merchants, developers, and payment integrations.
-
🚀 UPI QR Code Generator
- 📋 Table of Contents
⚠️ Important Disclaimer- ✨ Features
- 📋 Requirements
- 📦 Installation
- 🚀 Quick Start
- 💡 Advanced Usage
- 📖 API Reference
- 🎯 Supported UPI Apps
- 🛠️ Development
- 🔧 Error Handling
- 📱 Frontend Integration
- 🔐 Security & Compliance
- ❓ Frequently Asked Questions
- 📚 Resources
- 🤝 Contributing
- 📄 License
- 👨💻 Author
- 💖 Support
🚨 PERSONAL PROJECT NOTICE
This is a personal open-source project and is NOT officially associated with:
- 🏛️ National Payments Corporation of India (NPCI)
- 🏦 Any financial institutions or banks
- 💳 UPI service providers
- 🏢 Any government organizations
This library follows publicly available UPI specifications for educational and development purposes. Users are responsible for compliance with applicable regulations and should conduct proper testing before production use.
- 🎯 NPCI Compliant - Follows official UPI linking specifications
- 📱 Universal Support - Works with all major UPI apps (PhonePe, GPay, Paytm, etc.)
- 🔧 TypeScript Ready - Full type definitions included
- 🌐 Cross-Platform - Works in Node.js and browser environments
- ⚡ Fast & Lightweight - Minimal dependencies, maximum performance (~50KB)
- 🔒 Secure - No external API calls, everything processed locally
- ✅ Well Tested - Comprehensive test suite included
- 📖 Great Documentation - Detailed examples and API reference
- 🔄 Promise-based - Modern async/await support
- 🛠️ Developer Friendly - Easy integration with existing projects
- Node.js: 18.0.0 or later
- Package Manager: pnpm (recommended), npm, yarn, or bun
# Using pnpm (recommended)
pnpm add upiqrcode
# Using bun
bun add upiqrcode
# Using npm
npm install upiqrcode
# Using yarn
yarn add upiqrcode
import upiqrcode from "upiqrcode";
// Basic UPI QR code generation
const upiData = await upiqrcode({
payeeVPA: "merchant@upi",
payeeName: "Your Store Name"
});
console.log(upiData.qr); // Base64 PNG image: data:image/png;base64,iVBOR...
console.log(upiData.intent); // UPI intent: upi://pay?pa=merchant@upi&pn=Your%20Store%20Name
import upiqrcode from "upiqrcode";
const paymentQR = await upiqrcode({
payeeVPA: "shop@paytm",
payeeName: "Coffee Shop",
amount: "299.00",
currency: "INR",
transactionNote: "Cappuccino and pastry",
transactionId: "ORDER_" + Date.now()
});
// Use the QR code in your app
document.getElementById('qr-image').src = paymentQR.qr;
import upiqrcode from "upiqrcode";
const createPaymentQR = async (amount: string, note: string) => {
return await upiqrcode({
payeeVPA: "business@upi",
payeeName: "My Business",
amount: amount,
currency: "INR",
transactionNote: note,
transactionId: `TXN_${Date.now()}`,
minimumAmount: amount // Ensure exact amount
});
};
// Generate QR for ₹150
const qr150 = await createPaymentQR("150.00", "Product purchase");
Parameter | Type | Required | Description |
---|---|---|---|
payeeVPA |
string |
✅ Yes | UPI Virtual Payment Address (e.g., merchant@paytm ) |
payeeName |
string |
✅ Yes | Merchant/Payee name (min 4 chars) |
amount |
string |
❌ No | Payment amount in decimal format (e.g., "299.50" ) |
currency |
string |
❌ No | Currency code (default: "INR" ) |
transactionNote |
string |
❌ No | Payment description/note |
transactionId |
string |
❌ No | Unique transaction identifier |
transactionRef |
string |
❌ No | Alternative transaction reference |
minimumAmount |
string |
❌ No | Minimum amount to be paid |
payeeMerchantCode |
string |
❌ No | Merchant category code |
transactionRefUrl |
string |
❌ No | Reference URL for the transaction |
interface UpiqrcodeResult {
qr: string; // Base64 encoded PNG image with data URI
intent: string; // UPI intent URL for app integration
}
{
qr: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
intent: "upi://pay?pa=merchant@upi&pn=Store%20Name&am=100.00&cu=INR"
}
# Clone the repository
git clone https://github.com/Pratyay360/upiqrcode.git
cd upiqrcode
# Install dependencies
npm install
# Run the example
npm run example
# Run tests
npm test
# Build the project
npm run build
Script | Description |
---|---|
npm run build |
Compile TypeScript to JavaScript |
npm test |
Run the test suite |
npm run example |
Execute usage examples |
import upiqrcode from "upiqrcode";
try {
const result = await upiqrcode({
payeeVPA: "invalid", // Too short
payeeName: "Test"
});
} catch (error) {
console.error("QR Generation failed:", error.message);
// Handle validation errors gracefully
}
- Validation Error: VPA or payee name too short/missing
- Generation Error: QR code creation failed (rare)
import React, { useState } from 'react';
import upiqrcode from 'upiqrcode';
const PaymentQR: React.FC = () => {
const [qrCode, setQrCode] = useState<string>('');
const generateQR = async () => {
try {
const result = await upiqrcode({
payeeVPA: 'store@upi',
payeeName: 'My Store',
amount: '500.00'
});
setQrCode(result.qr);
} catch (error) {
console.error('Failed to generate QR:', error);
}
};
return (
<div>
<button onClick={generateQR}>Generate Payment QR</button>
{qrCode && <img src={qrCode} alt="UPI QR Code" />}
</div>
);
};
<script type="module">
import upiqrcode from 'https://unpkg.com/upiqrcode@latest/lib/index.js';
const result = await upiqrcode({
payeeVPA: 'merchant@upi',
payeeName: 'Online Store'
});
document.getElementById('qr-image').src = result.qr;
</script>
- Local Processing: All QR code generation happens locally - no data sent to external servers
- No API Dependencies: Works completely offline after installation
- Input Validation: Built-in validation for UPI parameters
- Type Safety: Full TypeScript support prevents common errors
- Follows publicly available UPI linking specifications
- Users must ensure compliance with local financial regulations
- Recommended for development, testing, and educational purposes
- Production use requires proper validation and testing
- Consider consulting with financial compliance experts for commercial implementations
Yes, the library processes everything locally and doesn't send data to external servers. However, ensure you validate all inputs and test thoroughly before production use.
This is an open-source library under GPL v3 license. You can use it for commercial projects, but you must comply with the license terms and ensure regulatory compliance.
Yes, the generated QR codes follow standard UPI specifications and work with all major UPI-enabled applications like PhonePe, Google Pay, Paytm, etc.
This library generates standard UPI QR codes based on publicly available specifications. For commercial payment processing, consult with your legal and compliance teams.
The library follows NPCI's publicly available UPI linking specifications. However, always test with your target UPI apps before production deployment.
- 📖 NPCI UPI Linking Specs - Official UPI documentation
- 📝 Usage Blog Post - Detailed tutorial by the author
- 💻 Examples Directory - Additional code examples
- 🐛 Report Issues - Bug reports and feature requests
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Ensure all changes maintain the educational and open-source nature of this project
- Add tests for new features
- Update documentation as needed
- Follow existing code style and conventions
- Fork the repository
- Clone your fork:
git clone https://github.com/yourusername/upiqrcode.git
- Install dependencies:
npm install
- Make your changes
- Run tests:
npm test
- Build the project:
npm run build
- Create a Pull Request
This project is licensed under the GPL v3 License - see the LICENSE file for details.
Pratyay Mitra Mustafi
- Website: pratyay.vercel.app
- Email: pratyaymustafi@outlook.com
- GitHub: @Pratyay360
If this project helped you, please consider:
- ⭐ Starring the repository on GitHub
- 🐛 Reporting bugs and issues
- 💡 Suggesting new features
- 📝 Contributing to the codebase
- 📢 Sharing with others who might find it useful
- 📦 Bundle Size: ~50KB minified
- 🧪 Test Coverage: Comprehensive test suite
- 📈 Performance: Generates QR codes in ~50ms (Node.js)
- 🔧 Dependencies: Minimal footprint with only essential deps
NOT affiliated with NPCI, banks, or financial institutions
Made with ❤️ for the developer community
Use responsibly • Test thoroughly • Follow regulations