ibc-payment-gateway
Version:
A modular payment gateway for Node.js applications with PostgreSQL and Sequelize
70 lines (61 loc) • 1.83 kB
JavaScript
const Razorpay = require('razorpay');
const crypto = require('crypto');
class RazorpayProvider {
constructor(config) {
this.key_id = config.key_id;
this.key_secret = config.key_secret;
this.webhook_secret = config.webhook_secret;
this.razorpay = new Razorpay({
key_id: this.key_id,
key_secret: this.key_secret
});
}
async createOrder(orderData) {
try {
const options = {
amount: orderData.amount, // amount in paisa
currency: orderData.currency,
receipt: orderData.order_id,
payment_capture: 1,
notes: {
internal_order_id: orderData.order_id
}
};
const order = await this.razorpay.orders.create(options);
return order;
} catch (error) {
throw new Error(`Razorpay order creation failed: ${error.message}`);
}
}
verifyWebhook(signature, payload, secret) {
try {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return signature === expectedSignature;
} catch (error) {
console.error('Webhook verification error:', error);
return false;
}
}
async getPayment(paymentId) {
try {
const payment = await this.razorpay.payments.fetch(paymentId);
return payment;
} catch (error) {
throw new Error(`Failed to fetch payment: ${error.message}`);
}
}
async refundPayment(paymentId, amount) {
try {
const refund = await this.razorpay.payments.refund(paymentId, {
amount: amount
});
return refund;
} catch (error) {
throw new Error(`Refund failed: ${error.message}`);
}
}
}
module.exports = RazorpayProvider;