paiementfactory
Version:
Unified SDK for multiple payment gateways (Easebuzz, Razorpay, etc.)
242 lines (233 loc) • 9.02 kB
JavaScript
"use strict";
const PaymentGateway = require('../interfaces/PaymentGateway');
const {
URLSearchParams
} = require('url');
const {
GATEWAYS,
GATEWAY_STATUS
} = require('../utils/constants');
const sha512 = require('js-sha512');
const axios = require("axios");
class EasebuzzGateway extends PaymentGateway {
constructor(config) {
super();
this.initialize(config);
}
initialize(config) {
this.config = config;
}
async initiatePayment(data) {
let pgResponse = {};
// Payment Config
const {
EASEBUZZ_KEY,
EASEBUZZ_SALT,
EASEBUZZ_HOST
} = this.config;
// payload|data which user will send
const {
transactionID,
amount,
user,
furl,
surl,
productinfo,
udf1,
udf2,
udf3,
udf4,
udf5,
udf6,
udf7
} = data;
// parse amount in float (mandatory)
const amount_in_float = parseFloat(amount);
// extra data for encodedParams
const address1 = data !== null && data !== void 0 && data.address1 ? data === null || data === void 0 ? void 0 : data.address1 : '';
const address2 = data !== null && data !== void 0 && data.address2 ? data === null || data === void 0 ? void 0 : data.address2 : '';
const city = data !== null && data !== void 0 && data.city ? data === null || data === void 0 ? void 0 : data.city : '';
const state = data !== null && data !== void 0 && data.state ? data === null || data === void 0 ? void 0 : data.state : '';
const country = data !== null && data !== void 0 && data.country ? data === null || data === void 0 ? void 0 : data.country : '';
const zipcode = data !== null && data !== void 0 && data.zipcode ? data === null || data === void 0 ? void 0 : data.zipcode : '';
const show_payment_mode = data !== null && data !== void 0 && data.show_payment_mode ? data === null || data === void 0 ? void 0 : data.show_payment_mode : '';
const split_payments = data !== null && data !== void 0 && data.split_payments ? data === null || data === void 0 ? void 0 : data.split_payments : '';
const request_flow = data !== null && data !== void 0 && data.request_flow ? data === null || data === void 0 ? void 0 : data.request_flow : '';
const sub_merchant_id = data !== null && data !== void 0 && data.sub_merchant_id ? data === null || data === void 0 ? void 0 : data.sub_merchant_id : '';
const payment_category = data !== null && data !== void 0 && data.payment_category ? data === null || data === void 0 ? void 0 : data.payment_category : '';
const account_no = data !== null && data !== void 0 && data.account_no ? data === null || data === void 0 ? void 0 : data.account_no : '';
const ifsc = data !== null && data !== void 0 && data.ifsc ? data === null || data === void 0 ? void 0 : data.ifsc : '';
const unique_id = data !== null && data !== void 0 && data.unique_id ? data === null || data === void 0 ? void 0 : data.unique_id : '';
// Hasing
const hashArr = [EASEBUZZ_KEY, transactionID, amount_in_float, productinfo, user.name, user.email, udf1, udf2, udf3, udf4, udf5, udf6, udf7,,,, EASEBUZZ_SALT];
const hashString = hashArr.join('|');
const hash = sha512.sha512(hashString);
const encodedParams = new URLSearchParams();
encodedParams.set('key', EASEBUZZ_KEY);
encodedParams.set('txnid', transactionID);
encodedParams.set('amount', `${amount_in_float}`);
encodedParams.set('productinfo', productinfo);
encodedParams.set('firstname', user.name);
encodedParams.set('phone', user.phone_number);
encodedParams.set('email', user.email);
encodedParams.set('furl', furl);
encodedParams.set('surl', surl);
encodedParams.set('hash', hash);
if (address1) {
encodedParams.set('address1', address1);
}
if (address2) {
encodedParams.set('address2', address2);
}
if (city) {
encodedParams.set('city', city);
}
if (state) {
encodedParams.set('state', state);
}
if (country) {
encodedParams.set('country', country);
}
if (zipcode) {
encodedParams.set('zipcode', zipcode);
}
if (show_payment_mode) {
encodedParams.set('show_payment_mode', show_payment_mode);
}
if (split_payments) {
encodedParams.set('split_payments', split_payments);
}
if (request_flow) {
encodedParams.set('request_flow', request_flow);
}
if (sub_merchant_id) {
encodedParams.set('sub_merchant_id', sub_merchant_id);
}
if (payment_category) {
encodedParams.set('payment_category', payment_category);
}
if (account_no) {
encodedParams.set('account_no', account_no);
}
if (ifsc) {
encodedParams.set('ifsc', ifsc);
}
if (unique_id) {
encodedParams.set('unique_id', unique_id);
}
// request option
const options = {
method: 'POST',
url: `${EASEBUZZ_HOST}/payment/initiateLink`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json'
},
data: encodedParams
};
const response = await axios.request(options);
if (response.data.status === 1) {
const access_key = response.data.data;
// init pay route
pgResponse = {
success: true,
gateway: GATEWAYS.EASEBUZZ,
code: GATEWAY_STATUS.PAYMENT_INITIATED,
data: {
instrumentResponse: {
redirectInfo: {
url: `${EASEBUZZ_HOST}/pay/${access_key}`
}
}
},
err_msg: null
};
} else {
var _response$data, _response$data2;
pgResponse = {
success: false,
gateway: GATEWAYS.EASEBUZZ,
code: GATEWAY_STATUS.PAYMENT_INITIATE_FAILED,
error_desc: response === null || response === void 0 || (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.error_desc,
error_msg: response === null || response === void 0 || (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.data,
data: null
};
}
return pgResponse;
}
async checkPaymentStatus(data) {
try {
const {
EASEBUZZ_KEY,
EASEBUZZ_SALT,
EASEBUZZ_HOST_DASHBOARD
} = this.config;
const {
transactionID
} = data;
let checkPaymentResponse = {};
// Hash sequence: key|txnid|salt
const hashArr = [EASEBUZZ_KEY, transactionID, EASEBUZZ_SALT];
const hashString = hashArr.join("|");
const hash = sha512.sha512(hashString);
const encodedParams = new URLSearchParams();
encodedParams.set('txnid', transactionID);
encodedParams.set('key', EASEBUZZ_KEY);
encodedParams.set('hash', hash);
const options = {
method: 'POST',
url: `${EASEBUZZ_HOST_DASHBOARD}/transaction/v2.1/retrieve`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json'
},
data: encodedParams
};
const response = await axios.request(options);
if (response.data.status) {
var _response$data3;
checkPaymentResponse = {
success: true,
gateway: GATEWAYS.EASEBUZZ,
code: GATEWAY_STATUS.STATUS_FETCHED,
data: response === null || response === void 0 || (_response$data3 = response.data) === null || _response$data3 === void 0 ? void 0 : _response$data3.msg[0]
};
} else {
var _response$data4;
checkPaymentResponse = {
success: false,
gateway: GATEWAYS.EASEBUZZ,
code: GATEWAY_STATUS.STATUS_FETCH_FAILED,
error_desc: response === null || response === void 0 || (_response$data4 = response.data) === null || _response$data4 === void 0 ? void 0 : _response$data4.msg,
error_msg: 'Error',
data: null
};
}
return checkPaymentResponse;
} catch (error) {
return {
success: false,
gateway: GATEWAYS.EASEBUZZ,
code: GATEWAY_STATUS.STATUS_FETCH_FAILED,
error_desc: error.message,
error_msg: 'Error',
data: null
};
}
}
validateSignature(response) {
var _Object$keys;
if (response && ((_Object$keys = Object.keys(response)) === null || _Object$keys === void 0 ? void 0 : _Object$keys.length) == 0) {
return false;
}
const {
EASEBUZZ_SALT,
EASEBUZZ_KEY
} = this.config;
const hashArr = [EASEBUZZ_SALT, response.status, response.udf10, response.udf9, response.udf8, response.udf7, response.udf6, response.udf5, response.udf4, response.udf3, response.udf2, response.udf1, response.email, response.firstname, response.productinfo, response.amount, response.txnid, EASEBUZZ_KEY];
const hashString = hashArr.join("|");
let hash_key = sha512.sha512(hashString);
return hash_key === response.hash;
}
}
module.exports = EasebuzzGateway;