UNPKG

paiementfactory

Version:

Unified SDK for multiple payment gateways (Easebuzz, Razorpay, etc.)

242 lines (233 loc) 9.02 kB
"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;