Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var mysql = require('mysql');
- var socket = require('net').Socket();
- var fs = require('fs');
- function removethrees(originaldata) {
- var t = new Buffer(originaldata, 'hex');
- return t.toString();
- }
- function cloneDictionary(mainobj) {
- var obj2 = {}
- for (var key in mainobj) {
- obj2[key] = mainobj[key];
- }
- return obj2;
- }
- function saveLogs(logdata) {
- var filename = new Date().toISOString().substr(0, 10);
- var timestamp = String(new Date().getTime());
- var logdata = logdata + "\n" + timestamp + "\n";
- fs.appendFile("PROD_LOG_" + filename + '.txt', logdata, function (err) {
- if (err) throw err;
- });
- }
- /*------------Message Receiving------------*/
- // Unpack ISO packets. e.g. Convert ISO string to Array / Dictionary
- function createcleanobject(packedmessage) {
- var msg = []
- for (i = 0; i < packedmessage.length; i++) {
- if (packedmessage[i] && packedmessage[i] != '') {
- msg.push([packedmessage[i]['key'], packedmessage[i]['value']]);
- }
- }
- return msg;
- }
- function createDictionary(packedmessage) {
- var msg = {}
- for (i = 0; i < packedmessage.length; i++) {
- if (packedmessage[i] && packedmessage[i] != '') {
- msg[packedmessage[i]['key']] = packedmessage[i]['value'];
- }
- }
- return msg;
- }
- function nestedArrayToDictionary(narray) {
- var msg = {}
- for (i = 0; i < narray.length; i++) {
- msg[narray[i][0]] = narray[i][1];
- }
- return msg;
- }
- function binary2bch(binary) {
- var b2h = {
- "0000": "0",
- "0001": "1",
- "0010": "2",
- "0011": "3",
- "0100": "4",
- "0101": "5",
- "0110": "6",
- "0111": "7",
- "1000": "8",
- "1001": "9",
- "1010": "a",
- "1011": "b",
- "1100": "c",
- "1101": "d",
- "1110": "e",
- "1111": "f"
- };
- var spl = binary.split('');
- var hexa = "";
- var tmp = "";
- for (var i = 0; i < spl.length; i++) {
- tmp += String(spl[i]);
- if ((i + 1) % 4 == 0 && i != 0) {
- hexa += b2h[tmp];
- var tmp = "";
- }
- }
- return hexa;
- }
- function fulllength(str, lenlen) {
- var ln = str.length;
- var padding = "";
- for (var i = 0; i < lenlen - String(ln).length; i++) {
- padding += "0";
- }
- return padding + String(ln);
- }
- function fullzeros(str, lenlen) {
- var ln = str.length;
- var padding = "";
- for (var i = 0; i < lenlen - ln; i++) {
- padding += "0";
- }
- return padding + str;
- }
- function packbits(md2, bch, bits) {
- var isomap = {
- 2: {
- minlen: 1,
- maxlen: 19,
- lendigit: 2,
- name: 'account number'
- },
- 3: {
- minlen: 6,
- maxlen: 6,
- name: 'Processing Code'
- },
- 4: {
- minlen: 12,
- maxlen: 12,
- name: 'Amount'
- },
- 7: {
- minlen: 10,
- maxlen: 10,
- name: 'Transmission Date'
- },
- 11: {
- minlen: 6,
- maxlen: 6,
- name: 'System Trace Number'
- },
- 12: {
- minlen: 6,
- maxlen: 6,
- name: 'Time Transaction'
- },
- 13: {
- minlen: 4,
- maxlen: 4,
- name: 'Date Transaction'
- },
- 15: {
- minlen: 4,
- maxlen: 4,
- name: 'Date Settlement'
- },
- 17: {
- minlen: 4,
- maxlen: 4,
- name: 'Date Capture'
- },
- 24: {
- minlen: 3,
- maxlen: 3,
- name: 'Request Type'
- },
- 25: {
- minlen: 2,
- maxlen: 2,
- name: 'POS Reversal'
- },
- 28: {
- minlen: 9,
- maxlen: 9,
- name: 'Fee'
- },
- 32: {
- minlen: 1,
- maxlen: 11,
- lendigit: 2,
- name: 'Inst Code'
- },
- 35: {
- minlen: 1,
- maxlen: 37,
- lendigit: 2,
- name: 'Track 2'
- },
- 37: {
- minlen: 12,
- maxlen: 12,
- name: 'RRN'
- },
- 38: {
- minlen: 6,
- maxlen: 6,
- name: 'Auth Response'
- },
- 39: {
- minlen: 2,
- maxlen: 2,
- name: 'Response Code'
- },
- 41: {
- minlen: 8,
- maxlen: 8,
- name: 'Card Acceptor ID'
- },
- 43: {
- minlen: 40,
- maxlen: 40,
- name: 'Card Acceptor Name'
- },
- 48: {
- minlen: 1,
- maxlen: 16,
- lendigit: 3,
- name: 'Card Number'
- },
- 49: {
- minlen: 3,
- maxlen: 3,
- name: 'Currency Code Tr'
- },
- 50: {
- minlen: 3,
- maxlen: 3,
- name: 'Currency Code Settle'
- },
- 51: {
- minlen: 3,
- maxlen: 3,
- name: 'Currency Code Card Billing'
- },
- 54: {
- minlen: 1,
- maxlen: 120,
- lendigit: 3,
- name: 'Balances'
- },
- 60: {
- minlen: 1,
- maxlen: 999,
- lendigit: 3,
- name: 'Reserved'
- },
- 70: {
- minlen: 3,
- maxlen: 3,
- name: 'Network Management'
- },
- 90: {
- minlen: 42,
- maxlen: 42,
- name: 'Original Data'
- },
- 95: {
- minlen: 42,
- maxlen: 42,
- name: 'Partial Reversal'
- },
- 121: {
- minlen: 1,
- maxlen: 1000,
- name: 'Mini Statement'
- },
- 123: {
- minlen: 1,
- maxlen: 1000,
- name: 'Mini Statement'
- },
- 125: {
- minlen: 1,
- maxlen: 1000,
- name: 'Private for Reversal'
- },
- 126: {
- minlen: 1,
- maxlen: 1000,
- name: 'Private for Reversal'
- },
- 127: {
- minlen: 1,
- maxlen: 1000,
- name: 'Private for Reversal'
- }
- };
- var isostring = md2['0'] + bch;
- for (var i = 0; i < bits.length; i++) {
- var def = isomap[bits[i]];
- if (def['lendigit']) {
- isostring += fulllength(md2[String(bits[i])], def['lendigit']) + md2[String(bits[i])];
- } else {
- if (bits[i] == '121') {
- isostring += fulllength(md2[String(bits[i])], 3) + md2[String(bits[i])];
- } else {
- isostring += md2[String(bits[i])];
- }
- }
- }
- return isostring;
- }
- function createBitMap(bits) {
- var maxbit = Math.max.apply(null, bits);
- var mb = 64;
- var allbits = "0";
- if (maxbit > 63) {
- var mb = 128;
- var allbits = "1";
- }
- for (var i = 2; i <= mb; i++) {
- if (bits.indexOf(i) != -1) {
- allbits += "1";
- } else {
- allbits += "0";
- }
- }
- return allbits;
- }
- function sortNumber(a, b) {
- return a - b;
- }
- function getBits(md2) {
- var keys = [];
- for (var key in md2) {
- if (parseInt(key) != 0 && parseInt(key) != 1) {
- keys.push(parseInt(key));
- }
- }
- return keys.sort(sortNumber);
- }
- function manuallyPackISO8583(md2) {
- var bits = getBits(md2);
- var bitmap = createBitMap(bits);
- var bch = binary2bch(bitmap);
- var isostring = packbits(md2, bch, bits);
- return fulllength(isostring, 4) + isostring;
- }
- function num2bcd(numstring) {
- //numstring - 82200000000000000400000000000000
- var n2b = {
- "0": "0000",
- "1": "0001",
- "2": "0010",
- "3": "0011",
- "4": "0100",
- "5": "0101",
- "6": "0110",
- "7": "0111",
- "8": "1000",
- "9": "1001",
- "a": "1010",
- "b": "1011",
- "c": "1100",
- "d": "1101",
- "e": "1110",
- "f": "1111"
- };
- var nst = numstring.toLowerCase().split('');
- var bcd = "";
- for (var i = 0; i < nst.length; i++) {
- bcd += n2b[nst[i]];
- }
- return bcd;
- }
- function findones(bitmap) {
- var patt = /1/g;
- var locations = [];
- while (match = patt.exec(bitmap)) {
- locations.push(patt.lastIndex);
- }
- return locations;
- }
- function dataElements(locations, data) {
- var isomap = {
- 2: {
- minlen: 1,
- maxlen: 19,
- lendigit: 2,
- name: 'account number'
- },
- 3: {
- minlen: 6,
- maxlen: 6,
- name: 'Processing Code'
- },
- 4: {
- minlen: 12,
- maxlen: 12,
- name: 'Amount'
- },
- 7: {
- minlen: 10,
- maxlen: 10,
- name: 'Transmission Date'
- },
- 11: {
- minlen: 6,
- maxlen: 6,
- name: 'System Trace Number'
- },
- 12: {
- minlen: 6,
- maxlen: 6,
- name: 'Time Transaction'
- },
- 13: {
- minlen: 4,
- maxlen: 4,
- name: 'Date Transaction'
- },
- 15: {
- minlen: 4,
- maxlen: 4,
- name: 'Date Settlement'
- },
- 17: {
- minlen: 4,
- maxlen: 4,
- name: 'Date Capture'
- },
- 24: {
- minlen: 3,
- maxlen: 3,
- name: 'Request Type'
- },
- 25: {
- minlen: 2,
- maxlen: 2,
- name: 'POS Reversal'
- },
- 28: {
- minlen: 9,
- maxlen: 9,
- name: 'Fee'
- },
- 32: {
- minlen: 1,
- maxlen: 11,
- lendigit: 2,
- name: 'Inst Code'
- },
- 35: {
- minlen: 1,
- maxlen: 37,
- lendigit: 2,
- name: 'Track 2'
- },
- 37: {
- minlen: 12,
- maxlen: 12,
- name: 'RRN'
- },
- 38: {
- minlen: 6,
- maxlen: 6,
- name: 'Auth Response'
- },
- 39: {
- minlen: 2,
- maxlen: 2,
- name: 'Response Code'
- },
- 41: {
- minlen: 8,
- maxlen: 8,
- name: 'Card Acceptor ID'
- },
- 43: {
- minlen: 40,
- maxlen: 40,
- name: 'Card Acceptor Name'
- },
- 48: {
- minlen: 1,
- maxlen: 16,
- lendigit: 3,
- name: 'Card Number'
- },
- 49: {
- minlen: 3,
- maxlen: 3,
- name: 'Currency Code Tr'
- },
- 50: {
- minlen: 3,
- maxlen: 3,
- name: 'Currency Code Settle'
- },
- 51: {
- minlen: 3,
- maxlen: 3,
- name: 'Currency Code Card Billing'
- },
- 54: {
- minlen: 1,
- maxlen: 120,
- lendigit: 3,
- name: 'Balances'
- },
- 60: {
- minlen: 1,
- maxlen: 999,
- lendigit: 3,
- name: 'Reserved'
- },
- 70: {
- minlen: 3,
- maxlen: 3,
- name: 'Network Management'
- },
- 90: {
- minlen: 42,
- maxlen: 42,
- name: 'Original Data'
- },
- 95: {
- minlen: 42,
- maxlen: 42,
- name: 'Partial Reversal'
- },
- 121: {
- minlen: 1,
- maxlen: 1000,
- name: 'Mini Statement'
- },
- 123: {
- minlen: 1,
- maxlen: 1000,
- name: 'Mini Statement'
- },
- 125: {
- minlen: 1,
- maxlen: 1000,
- name: 'Private for Reversal'
- },
- 126: {
- minlen: 1,
- maxlen: 1000,
- name: 'Private for Reversal'
- },
- 127: {
- minlen: 1,
- maxlen: 1000,
- name: 'Private for Reversal'
- }
- };
- var returndata = [];
- var cursor = 0;
- for (i = 0; i < locations.length; i++) {
- var cl = locations[i];
- if (cl != 1) {
- // If length is variable
- if (isomap[cl]['lendigit']) {
- var ld = isomap[cl]['lendigit'];
- var totallength = parseInt(data.substr(cursor, ld));
- var actualvalue = data.substr(cursor + ld, totallength);
- returndata.push([cl, actualvalue]);
- cursor += totallength + ld;
- }
- // if length is fixed
- else {
- var actuallength = parseInt(isomap[cl]['minlen']);
- var actualvalue = data.substr(cursor, actuallength);
- returndata.push([cl, actualvalue]);
- cursor += actuallength;
- }
- }
- }
- return returndata;
- }
- function unpackiso8583Manually(isostring) {
- var msgtype = isostring.substr(0, 4);
- var unpacked = {
- '0': msgtype
- };
- // Unpacker
- var msgtype = isostring.substr(0, 4);
- // take next 16
- var bitmap = isostring.substr(4, 16);
- // convert to BCD
- var bcd = num2bcd(bitmap);
- // Find locations where there is 1.
- var locations = findones(bcd);
- var datastart = 20;
- if (locations[0] == 1) {
- bitmap += isostring.substr(20, 16);
- var bcd = num2bcd(bitmap);
- var locations = findones(bcd);
- var datastart = 36;
- }
- // get data elements
- var data = isostring.substr(datastart, 1000);
- var dm = dataElements(locations, data);
- var final = dm.unshift(['0', msgtype]);
- return nestedArrayToDictionary(dm);
- }
- /*------------Message Sending------------*/
- function createisostring(packedmessage) {
- var msg = ""
- for (i = 0; i < packedmessage.length; i++) {
- msg += packedmessage[i];
- }
- return msg;
- }
- function DictionaryToNestedArray(metadata) {
- var narray = [];
- for (var key in metadata) {
- narray.push([parseInt(key), metadata[key]]);
- }
- return narray;
- }
- function createmessage(packets) {
- var message = new ISO8583.Message();
- var packedMessage = message.packSync(packets);
- return createisostring(packedMessage);
- }
- // Listen on a socket port. e.g. Sarvatra connects to port 8583.
- require('net').createServer(function (socket) {
- console.log("connected");
- // Send sign - on / off ?
- var signedon = 0;
- socket.on('data', function (data) {
- try {
- console.log("Received Following string");
- console.log(data.toString());
- var start = data.toString().substr(0, 4);
- var cleanData = data.toString().slice(4);
- var timestamp = String(new Date().getTime());
- saveLogs("######################\nReceived from server at " + timestamp + "\n" + data.toString() + "\n");
- var receivedFromServer=data.toString();
- var logdata = "";
- var metadata = unpackiso8583Manually(cleanData);
- if (metadata['60']) {
- var yearnow = metadata['60'].substr(0, 4) + metadata['7'];
- } else {
- var yearnow = '2017' + metadata['7'];
- }
- var currentHour = new Date().getHours()
- console.log(metadata);
- /* Networking Messages */
- if (metadata['0'] == '0800') {
- //Handshake
- var md2 = cloneDictionary(metadata);
- md2['0'] = '0810';
- md2['39'] = '00';
- var isostring = manuallyPackISO8583(md2);
- //var returnArray=DictionaryToNestedArray(md2);
- //var handshake=createmessage(returnArray);
- socket.write(isostring);
- console.log(isostring);
- logdata += "Sent to server\n" + isostring + "\n";
- saveLogs(logdata);
- } else if (currentHour != 2 && currentHour != 3) {
- // for balance
- if (metadata['0'] == '0200' || metadata['0'] == '0220') {
- var connection = mysql.createConnection({
- host: '192.168.0.51',
- user: 'root',
- password: 'decisionM45#',
- database: 'ojsbcbs'
- });
- var prcode = metadata['3'].substr(0, 2);
- var acno=metadata['2'].substr(2,20);
- if (metadata['35']) {
- var cardno = metadata['35'].split('=')[0];
- } else {
- var cardno = metadata['2'];
- }
- var particulars = metadata['43'].replace("'", " ");
- var balanceQuery = "CALL SP_ATM(" + prcode + "," + metadata['11'] + ",'" + metadata['41'] + "','" + acno + "','" + acno + "','" + metadata['4'] + "','" + metadata['35'] + "','" + metadata['38'] + "','" + metadata['50'] + "','" + metadata['28'] + "','" + metadata['37'] + "','" + metadata['32'] + "','" + particulars + "','" + cardno + "',0,'" + yearnow + "','" + metadata['12'] + "','" + metadata['13'] + "','" + metadata['15'] + "',@rc,@lb,@or1,@om,@or2,@ministat,@nb);"
- logdata += "Database Query\n";
- logdata += balanceQuery + "\n";
- connection.query({sql:balanceQuery,timeout:15000},
- function (err, rows, fields) {
- if (err) {
- console.log("ERR");
- console.log(err);
- logdata += "ERROR\n" + err + "\n";
- }
- connection.query({sql:"select @rc,@lb,@or1,@om,@or2,@ministat,@nb;",timeout:15000}, function (err, rows) {
- console.log(rows);
- var result = rows[0];
- var productcode = acno.substr(4, 3);
- if (productcode == '044') {
- var actype = '10';
- } else {
- var actype = '20';
- }
- var md2 = cloneDictionary(metadata);
- if (metadata[0] == '0200') {
- md2['0'] = '0210';
- } else {
- md2['0'] = '0230';
- }
- // md2['39']=result['@rc'];//getResponseForBalance(md2); // 00 or 02
- if (result['@rc'] && result['@rc'] != '' && result['@rc'] != 'null' && result['@rc'] != null) {
- md2['39'] = result['@rc']; //getResponseForBalance(md2); // 00 or 02
- } else {
- md2['39'] = 06;
- }
- md2['51'] = 356;
- if (prcode != '19') {
- var gotbalance = actype + "01356" + result['@lb'] + actype + "02356" + result['@nb'];
- if (!!result['@lb']) {
- md2['54'] = actype + "01356" + result['@lb'] + actype + "02356" + result['@nb']; // Balance string //"0401001356C0000001500001002356C000000140000";
- } else {
- md2['54'] = '0000000000000000000000000000000000000000'; // Balance string //"0401001356C0000001500001002356C000000140000";
- }
- }
- // Mini statement
- if (prcode == '35' || prcode == '36' || prcode == '37') {
- console.log("MINI STATEMENT");
- console.log(result['@ministat']);
- md2['121'] = result['@ministat'];
- }
- if (prcode == '82') {
- var datas = result['@ministat'].split('|');
- md2['125'] = datas[0];
- md2['126'] = datas[1];
- md2['127'] = datas[2];
- }
- var isostring = manuallyPackISO8583(md2);
- //var returnArray=DictionaryToNestedArray(md2);
- //var balanceResult=createmessage(returnArray);
- socket.write(isostring);
- console.log(isostring);
- logdata += isostring + "\n";
- logdata += "Sent to server\n" + isostring + "\n";
- saveLogs(logdata);
- connection.end();
- });
- });
- }
- // for reversal
- else if (metadata['0'] == '0420') {
- var connection = mysql.createConnection({
- host: '192.168.0.51',
- user: 'root',
- password: 'decisionM45#',
- database: 'ojsbcbs'
- });
- var prcode = metadata['3'].substr(0, 2);
- var acno=metadata['2'].substr(2,20);
- if (metadata['35']) {
- var cardno = metadata['35'].split('=')[0];
- } else {
- var cardno = metadata['2'];
- }
- if (metadata['95']) {
- var diffamt = String(parseInt(metadata['4']) - parseInt(metadata['95'].substr(0, 12)));
- var reversalamt = fullzeros(diffamt, 12);
- } else {
- var reversalamt = metadata['4'];
- }
- var particulars = metadata['43'].replace("'", " ");
- var rrnorig=metadata['37'];
- var rrn = receivedFromServer.substr(receivedFromServer.length-12,12);
- var reverseQuery = "CALL SP_ATM_REVERSAL(" + prcode + "," + metadata['11'] + ",'" + metadata['41'] + "','" + acno + "','" + acno + "','" + reversalamt + "','" + metadata['35'] + "','" + metadata['38'] + "','000','" + metadata['28'] + "','" + rrn + "','" + metadata['32'] + "','" + particulars + "','" + cardno + "','" + metadata['11'] + "',0,'" + yearnow + "','" + metadata['12'] + "','" + metadata['13'] + "','" + metadata['15']+"-"+rrnorig+ "',@rc,@lb,@or1,@om,@or2,@ministat,@nb);"
- console.log(reverseQuery);
- logdata += "Database Query\n";
- logdata += reverseQuery + "\n";
- connection.query({sql:reverseQuery,timeout:15000},
- function (err, rows, fields) {
- if (err) {
- console.log("ERR");
- console.log(err);
- logdata += "ERROR\n" + err + "\n";
- }
- connection.query({sql:"select @rc,@lb,@or1,@om,@or2,@ministat,@nb;",timeout:15000}, function (err, rows) {
- console.log(rows);
- var result = rows[0];
- var productcode = acno.substr(4, 3);
- if (productcode == '044') {
- var actype = '10';
- } else {
- var actype = '20';
- }
- var md2 = cloneDictionary(metadata);
- md2['0'] = '0430';
- //md2['39']=result['@rc'];//getResponseForBalance(md2); // 00 or 02
- if (result['@rc'] && result['@rc'] != '' && result['@rc'] != 'null' && result['@rc'] != null) {
- md2['39'] = result['@rc']; //getResponseForBalance(md2); // 00 or 02
- } else {
- md2['39'] = 06;
- }
- md2['51'] = 356;
- if (prcode != '19') {
- var gotbalance = actype + "01356" + result['@lb'] + actype + "02356" + result['@nb'];
- if (!!result['@lb']) {
- md2['54'] = actype + "01356" + result['@lb'] + actype + "02356" + result['@nb']; // Balance string //"0401001356C0000001500001002356C000000140000";
- } else {
- md2['54'] = '0000000000000000000000000000000000000000'; // Balance string //"0401001356C0000001500001002356C000000140000";
- }
- }
- // Mini statement
- if (prcode == '35' || prcode == '36' || prcode == '37') {
- console.log(result['@ministat']);
- md2['121'] = result['@ministat'];
- }
- var isostring = manuallyPackISO8583(md2);
- //var returnArray=DictionaryToNestedArray(md2);
- //var balanceResult=createmessage(returnArray);
- socket.write(isostring);
- logdata += isostring + "\n";
- saveLogs(logdata);
- connection.end();
- });
- });
- } else {
- logdata += "INVALID DATA\n"
- saveLogs(logdata);
- }
- }
- } catch (err) {
- saveLogs("####################\nMAIN ERROR\n" + err + "\n####################\n");
- console.log(err);
- }
- });
- }).listen(5001);
Add Comment
Please, Sign In to add comment