Files
2026-03-10 03:45:00 +09:00

141 lines
4.2 KiB
JavaScript

const asyncErrorHandler = require('../middlewares/helpers/asyncErrorHandler');
// const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const paytm = require('paytmchecksum');
const https = require('https');
const Payment = require('../models/paymentModel');
const ErrorHandler = require('../utils/errorHandler');
const { v4: uuidv4 } = require('uuid');
const axios = require('axios');
exports.processPayment = asyncErrorHandler(async (req, res, next) => {
const { amount, email, phoneNo } = req.body;
var params = {};
/* initialize an array */
params["MID"] = process.env.PAYTM_MID;
params["WEBSITE"] = process.env.PAYTM_WEBSITE;
params["CHANNEL_ID"] = process.env.PAYTM_CHANNEL_ID;
params["INDUSTRY_TYPE_ID"] = process.env.PAYTM_INDUSTRY_TYPE;
params["ORDER_ID"] = "oid" + uuidv4();
params["CUST_ID"] = process.env.PAYTM_CUST_ID;
params["TXN_AMOUNT"] = JSON.stringify(amount);
// params["CALLBACK_URL"] = `${req.protocol}://${req.get("host")}/api/v1/callback`;
params["CALLBACK_URL"] = `https://${req.get("host")}/api/v1/callback`;
params["EMAIL"] = email;
params["MOBILE_NO"] = phoneNo;
let paytmChecksum = paytm.generateSignature(params, process.env.PAYTM_MERCHANT_KEY);
paytmChecksum.then(function (checksum) {
let paytmParams = {
...params,
"CHECKSUMHASH": checksum,
};
res.status(200).json({
paytmParams
});
}).catch(function (error) {
console.log(error);
});
});
// Paytm Callback
exports.paytmResponse = (req, res, next) => {
// console.log(req.body);
let paytmChecksum = req.body.CHECKSUMHASH;
delete req.body.CHECKSUMHASH;
let isVerifySignature = paytm.verifySignature(req.body, process.env.PAYTM_MERCHANT_KEY, paytmChecksum);
if (isVerifySignature) {
// console.log("Checksum Matched");
var paytmParams = {};
paytmParams.body = {
"mid": req.body.MID,
"orderId": req.body.ORDERID,
};
paytm.generateSignature(JSON.stringify(paytmParams.body), process.env.PAYTM_MERCHANT_KEY).then(function (checksum) {
paytmParams.head = {
"signature": checksum
};
/* prepare JSON string for request */
var post_data = JSON.stringify(paytmParams);
var options = {
/* for Staging */
hostname: 'securegw-stage.paytm.in',
/* for Production */
// hostname: 'securegw.paytm.in',
port: 443,
path: '/v3/order/status',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': post_data.length
}
};
// Set up the request
var response = "";
var post_req = https.request(options, function (post_res) {
post_res.on('data', function (chunk) {
response += chunk;
});
post_res.on('end', function () {
let { body } = JSON.parse(response);
// let status = body.resultInfo.resultStatus;
// res.json(body);
addPayment(body);
// res.redirect(`${req.protocol}://${req.get("host")}/order/${body.orderId}`)
res.redirect(`https://${req.get("host")}/order/${body.orderId}`)
});
});
// post the data
post_req.write(post_data);
post_req.end();
});
} else {
console.log("Checksum Mismatched");
}
}
const addPayment = async (data) => {
try {
await Payment.create(data);
} catch (error) {
console.log("Payment Failed!");
}
}
exports.getPaymentStatus = asyncErrorHandler(async (req, res, next) => {
const payment = await Payment.findOne({ orderId: req.params.id });
if (!payment) {
return next(new ErrorHandler("Payment Details Not Found", 404));
}
const txn = {
id: payment.txnId,
status: payment.resultInfo.resultStatus,
}
res.status(200).json({
success: true,
txn,
});
});