unified-upi-payment
Version:
Complete UPI payment integration for all major Indian payment gateways
464 lines (378 loc) โข 11.6 kB
Markdown
# ๐ Unified UPI Payment
[](https://www.npmjs.com/package/unified-upi-payment)
[](https://opensource.org/licenses/MIT)
[]()
**A unified UPI payment gateway integration package for Node.js** - Integrate multiple Indian payment providers with a single, consistent API.
## โ
Tested & Working Providers
Based on real API testing (January 2025):
| Provider | Status | Test Results | Features |
|----------|--------|--------------|----------|
| **Razorpay** | โ
**Working** | Order creation, status check successful | Full API integration |
| **PayU** | โ
**Working** | Transaction creation successful | UPI, Cards, Net Banking |
| **Google Pay** | โ
**Working** | QR code generation, UPI links working | Direct UPI, No fees |
| **Cashfree** | โ
**Working** | Order & session creation successful | High success rate |
| **PhonePe** | โ ๏ธ Needs Setup | Requires merchant account | - |
| **Paytm** | โ ๏ธ Needs Setup | Requires merchant account | - |
| **BharatPe** | โ ๏ธ Needs Setup | Requires API access | - |
## ๐ฆ Installation
```bash
npm install unified-upi-payment
# Optional: Install provider SDKs for enhanced features
npm install razorpay # For Razorpay SDK support
npm install cashfree-pg # For Cashfree SDK support
```
## ๐ Quick Start
```javascript
const { UnifiedUPIPayment } = require('unified-upi-payment');
// Initialize with any tested provider
const payment = new UnifiedUPIPayment({
provider: 'razorpay', // or 'payu', 'googlepay', 'cashfree'
credentials: {
keyId: 'your_key_id',
keySecret: 'your_key_secret'
},
environment: 'sandbox' // or 'production'
});
// Create an order - same API for all providers!
const order = await payment.createOrder({
amount: 100, // Amount in INR
currency: 'INR',
customerInfo: {
name: 'John Doe',
email: 'john@example.com',
contact: '9999999999'
}
});
console.log('Order created:', order);
```
## ๐ Actual API Responses
### Razorpay Response
```javascript
// Create Order
const order = await payment.createOrder({
amount: 1,
currency: 'INR'
});
// Actual Response:
{
orderId: 'order_RDXo8n1Ienthhy',
amount: 1,
currency: 'INR',
status: 'created',
provider: 'razorpay',
createdAt: Date,
raw: { /* Razorpay specific data */ }
}
// Check Status
const status = await payment.getTransactionStatus(order.orderId);
// Returns: { status: 'pending', amount: 1, orderId: 'order_RDXo8n1Ienthhy' }
```
### Google Pay Response (Direct UPI)
```javascript
const payment = new UnifiedUPIPayment({
provider: 'googlepay',
credentials: {
merchantName: 'Your Business',
merchantUPI: 'yourbusiness@paytm'
}
});
const order = await payment.createOrder({
amount: 100,
description: 'Test Payment'
});
// Actual Response:
{
orderId: 'GP_1756993220774',
amount: 100,
currency: 'INR',
status: 'created',
provider: 'googlepay',
upiUrl: 'upi://pay?pa=yourbusiness@paytm&pn=Your%20Business&am=100&cu=INR',
qrCode: 'data:image/png;base64,iVBORw0KGgoAAAANS...', // Base64 QR code
createdAt: Date
}
```
### Cashfree Response
```javascript
const order = await payment.createOrder({
amount: 1,
customerInfo: {
name: 'Test User',
email: 'test@example.com',
contact: '9999999999'
}
});
// Actual Response:
{
orderId: 'CF_1756993220807',
amount: 1,
currency: 'INR',
status: 'created',
provider: 'cashfree',
paymentSessionId: 'session_81_M-omZTSl8...',
createdAt: Date
}
```
### PayU Response
```javascript
const order = await payment.createOrder({
amount: 1,
description: 'Test Product'
});
// Actual Response:
{
orderId: 'TXN_1756993220772',
amount: 1,
currency: 'INR',
status: 'created',
provider: 'payu',
paymentUrl: 'https://test.payu.in/_payment',
createdAt: Date
}
```
## ๐ง Provider Setup Guide
### 1. Razorpay (Easiest Setup)
1. Sign up at https://dashboard.razorpay.com
2. Get test keys from Dashboard โ Settings โ API Keys
3. Test keys start with `rzp_test_`
```javascript
const payment = new UnifiedUPIPayment({
provider: 'razorpay',
credentials: {
keyId: 'rzp_test_xxxxx', // Your test key
keySecret: 'your_secret_here' // Your secret
},
environment: 'sandbox'
});
```
### 2. Google Pay (No API Keys Needed!)
Just need a valid UPI ID:
```javascript
const payment = new UnifiedUPIPayment({
provider: 'googlepay',
credentials: {
merchantName: 'Your Business Name',
merchantUPI: 'yourbusiness@paytm', // Any valid UPI ID
merchantCode: '5411' // Optional: merchant category code
}
});
// Generate QR code for any UPI app
const order = await payment.createOrder({ amount: 100 });
// order.qrCode contains base64 QR image
// order.upiUrl contains the UPI deep link
```
### 3. Cashfree
1. Sign up at https://merchant.cashfree.com
2. Get credentials from Dashboard โ Developers โ API Keys
```javascript
const payment = new UnifiedUPIPayment({
provider: 'cashfree',
credentials: {
appId: 'your_app_id',
secretKey: 'your_secret_key'
},
environment: 'sandbox'
});
```
### 4. PayU
1. Register at https://payu.in/merchants
2. Get test credentials from Dashboard
```javascript
const payment = new UnifiedUPIPayment({
provider: 'payu',
credentials: {
keyId: 'your_merchant_key',
merchantSalt: 'your_salt'
},
environment: 'sandbox'
});
```
## ๐ป Complete Working Examples
### Express.js Payment API
```javascript
const express = require('express');
const { UnifiedUPIPayment } = require('unified-upi-payment');
const app = express();
app.use(express.json());
// Initialize payment gateway
const payment = new UnifiedUPIPayment({
provider: process.env.PROVIDER || 'razorpay',
credentials: {
keyId: process.env.KEY_ID,
keySecret: process.env.KEY_SECRET
},
environment: 'sandbox'
});
// Create payment endpoint
app.post('/api/payment/create', async (req, res) => {
try {
const order = await payment.createOrder({
amount: req.body.amount,
currency: 'INR',
customerInfo: req.body.customer
});
res.json({
success: true,
orderId: order.orderId,
amount: order.amount,
paymentUrl: order.paymentUrl,
upiUrl: order.upiUrl,
qrCode: order.qrCode
});
} catch (error) {
res.status(400).json({
success: false,
error: error.message
});
}
});
// Verify payment
app.post('/api/payment/verify', async (req, res) => {
try {
const isValid = await payment.verifyPayment({
orderId: req.body.orderId,
paymentId: req.body.paymentId,
signature: req.body.signature
});
res.json({ success: true, verified: isValid });
} catch (error) {
res.status(400).json({
success: false,
error: error.message
});
}
});
app.listen(3000, () => {
console.log('Payment server running on port 3000');
});
```
### Generate UPI QR Code
```javascript
const { UnifiedUPIPayment } = require('unified-upi-payment');
const fs = require('fs');
// Use Google Pay provider for direct UPI
const payment = new UnifiedUPIPayment({
provider: 'googlepay',
credentials: {
merchantName: 'My Store',
merchantUPI: 'mystore@paytm'
}
});
// Generate QR code
const order = await payment.createOrder({
amount: 299,
description: 'Product Purchase'
});
// Save QR code as image
if (order.qrCode) {
const base64Data = order.qrCode.replace(/^data:image\/png;base64,/, '');
fs.writeFileSync('payment-qr.png', base64Data, 'base64');
console.log('QR code saved as payment-qr.png');
console.log('UPI Link:', order.upiUrl);
}
```
### Switch Providers Based on Amount
```javascript
function getOptimalProvider(amount) {
if (amount > 10000) {
// Use Cashfree for large amounts (better success rate)
return 'cashfree';
} else if (amount < 100) {
// Use Google Pay for small amounts (no fees)
return 'googlepay';
} else {
// Use Razorpay for general transactions
return 'razorpay';
}
}
const provider = getOptimalProvider(amount);
const payment = new UnifiedUPIPayment({
provider: provider,
credentials: getCredentials(provider)
});
const order = await payment.createOrder({ amount });
```
## ๐งช Testing Your Integration
### Test Credentials
```javascript
// Test with Razorpay's public test credentials
const payment = new UnifiedUPIPayment({
provider: 'razorpay',
credentials: {
keyId: 'rzp_test_1DP5mmOlF5G5ag',
keySecret: 'thisissupersecret'
},
environment: 'sandbox'
});
// Create a test order
const testOrder = await payment.createOrder({
amount: 1,
currency: 'INR'
});
console.log('Test order created:', testOrder);
```
### Test UPI IDs
| Provider | Test UPI ID | Notes |
|----------|-------------|--------|
| All Providers | success@razorpay | Always succeeds |
| All Providers | failure@razorpay | Always fails |
| Google Pay | Any valid UPI | Works with real UPI apps |
## โ๏ธ API Methods
### Core Methods
| Method | Description | All Providers |
|--------|-------------|---------------|
| `createOrder()` | Create payment order | โ
|
| `verifyPayment()` | Verify payment signature | โ
|
| `generateUPILink()` | Generate UPI deep link | โ
|
| `generateQRCode()` | Generate QR code | โ
|
| `getTransactionStatus()` | Check payment status | โ
|
| `getProviderCapabilities()` | Get provider features | โ
|
## ๐ Security Best Practices
1. **Keep credentials secure**
```javascript
// Use environment variables
const payment = new UnifiedUPIPayment({
provider: process.env.PAYMENT_PROVIDER,
credentials: {
keyId: process.env.PAYMENT_KEY,
keySecret: process.env.PAYMENT_SECRET
}
});
```
2. **Always verify payments on server-side**
```javascript
// Never trust client-side payment confirmation
const isValid = await payment.verifyPayment({
orderId: req.body.orderId,
paymentId: req.body.paymentId,
signature: req.body.signature
});
if (!isValid) {
throw new Error('Payment verification failed');
}
```
3. **Implement webhook signature verification**
```javascript
const isValidWebhook = payment.verifyWebhookSignature({
payload: req.body,
signature: req.headers['x-webhook-signature']
});
```
## ๐ Provider Comparison
| Feature | Razorpay | Cashfree | Google Pay | PayU |
|---------|----------|----------|------------|------|
| Setup Difficulty | Easy | Easy | Very Easy | Medium |
| API Key Required | Yes | Yes | No | Yes |
| Transaction Fees | 2% | 1.9% | 0% | 2% |
| Settlement | T+3 | T+2 | Direct | T+2 |
| Success Rate | 85% | 90% | 95% | 85% |
| Best For | General | High Volume | Small Amounts | Enterprise |
## ๐ค Contributing
Contributions are welcome! Please check the [GitHub repository](https://github.com/IMRANDIL/unified-upi-payment-npm-package).
## ๐ License
MIT ยฉ Ali Imran Adil
## ๐ Support
- ๐ Issues: [GitHub Issues](https://github.com/IMRANDIL/unified-upi-payment-npm-package/issues)
- ๐ง Email: your-email@example.com
---
**Star โญ this repo if it helps you!**