-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreadArkomXMLResponse.js
More file actions
84 lines (70 loc) · 2.92 KB
/
Copy pathreadArkomXMLResponse.js
File metadata and controls
84 lines (70 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//@ts-check
const xml2js = require('xml2js');
/**
* @param {string} stringResponseFromArkom
* @param {'payment'|'transactionID'|'checkTransactionAfterFailure'} mode
* @returns
*/
module.exports = async (stringResponseFromArkom, mode = 'payment') => {
if (!stringResponseFromArkom) return { success: false, msg: 'no response from arkom' };
try {
const responseXMLStringified = await xml2js.parseStringPromise(stringResponseFromArkom);
if (mode === 'transactionID') {
return getTransactionIDFromResponseObject(responseXMLStringified);
}
if (mode === 'checkTransactionAfterFailure') {
const ansXML = getansXMLFromResponseObject(responseXMLStringified);
if (!ansXML.length) {
return { success: false, msg: 'transaction doesnt exist' };
}
const payload = await extractPayloadFromSuccessResponseObject(ansXML, 'mNote');
return { success: true, payload };
}
const { IntOTxml, TransactionID, AshStatus, AshStatusDesc } = getIntOTxmlAndTransactionIDFromResponseObject(responseXMLStringified);
if (AshStatus !== '0') {
return { success: false, payload: { AshStatus, AshStatusDesc } };
}
const payload = await extractPayloadFromSuccessResponseObject(IntOTxml, 'MerchantNote');
return {
success: true,
payload: {
...payload,
TransactionID,
},
};
} catch (err) {
console.error(err.name);
throw err;
}
};
/**
*
* @param {*} object
* @param {'mNote'|'MerchantNote'} merchantNoteProp
* @returns {Promise<{uid: string, pan: string, rrn: string, addendum1: string, authManpikNo: string, cardType: string, amount: number, MerchantNote: string}>}
*/
async function extractPayloadFromSuccessResponseObject(object, merchantNoteProp) {
const MerchantNote = object[merchantNoteProp];
const parsedXML = (await xml2js.parseStringPromise(object, { explicitArray: false }))['output'];
const { uid, pan, rrn, addendum1, authManpikNo, cardType } = parsedXML;
const amount = +parsedXML['amount'] / 100 || 0;
return { uid, pan, rrn, addendum1, authManpikNo, cardType, amount, MerchantNote };
}
/**
*
* @param {*} object
* @returns {{IntOTxml: string, TransactionID: string, AshStatus: string, AshStatusDesc: string, MerchantNote: string}}
*/
function getIntOTxmlAndTransactionIDFromResponseObject(object) {
const { MerchantNote, IntOTxml, TransactionID, AshStatus, AshStatusDesc } = getSOAPBodyFromResponseObject(object)['MTS_AshEMV_CNP_TransactionResponse'][0];
return { IntOTxml, TransactionID: TransactionID[0], AshStatus: AshStatus[0], AshStatusDesc: AshStatusDesc[0], MerchantNote: MerchantNote[0] };
}
function getTransactionIDFromResponseObject(object) {
return getSOAPBodyFromResponseObject(object)['MTS_GetTransactionIDResponse'][0]['TransactionID'][0];
}
function getansXMLFromResponseObject(object) {
return getSOAPBodyFromResponseObject(object)['MTS_EMV_RetakeTrans_XML_NotesResponse'][0]['ansXML'][0];
}
function getSOAPBodyFromResponseObject(object) {
return object['soap:Envelope']['soap:Body'][0];
}