Commit 92511d68d95273418a58f2339d2023b18d1c7b7c

Authored by Adhidarma Hadiwinoto
1 parent b8c6efb921
Exists in master

cleaing

Showing 1 changed file with 0 additions and 2 deletions Inline Diff

1 var http = require('http'); 1 var http = require('http');
2 var url = require('url'); 2 var url = require('url');
3 var math = require('mathjs'); 3 var math = require('mathjs');
4 var xml = require('xml'); 4 var xml = require('xml');
5 var xml2js = require('xml2js').parseString; 5 var xml2js = require('xml2js').parseString;
6 var strftime = require('strftime'); 6 var strftime = require('strftime');
7 var xor = require('base64-xor'); 7 var xor = require('base64-xor');
8 var request = require('request'); 8 var request = require('request');
9 9
10 var config; 10 var config;
11 var callbackReport; 11 var callbackReport;
12 12
13 var max_retry = 2; 13 var max_retry = 2;
14 var sleep_before_retry = 2000; 14 var sleep_before_retry = 2000;
15 15
16 function calculateSignature(userid, password, msisdn, timestamp) { 16 function calculateSignature(userid, password, msisdn, timestamp) {
17 var a = msisdn.substr(msisdn.length - 4) + timestamp; 17 var a = msisdn.substr(msisdn.length - 4) + timestamp;
18 console.log(a);
19 var b = userid.substr(0, 4) + password; 18 var b = userid.substr(0, 4) + password;
20 console.log(b);
21 19
22 return xor.encode(a,b); 20 return xor.encode(a,b);
23 } 21 }
24 22
25 function createPayload(task) { 23 function createPayload(task) {
26 var timestamp = strftime('%H%M%S'); 24 var timestamp = strftime('%H%M%S');
27 25
28 var payload = { 26 var payload = {
29 datacell: [ 27 datacell: [
30 { perintah: 'charge'}, 28 { perintah: 'charge'},
31 {oprcode: task['remoteProduct']}, 29 {oprcode: task['remoteProduct']},
32 {userid: config.h2h_out.userid}, 30 {userid: config.h2h_out.userid},
33 {time: timestamp}, 31 {time: timestamp},
34 {msisdn: task['destination']}, 32 {msisdn: task['destination']},
35 {ref_trxid: task['requestId']}, 33 {ref_trxid: task['requestId']},
36 {sgn: calculateSignature(config.h2h_out.userid, config.h2h_out.password, task['destination'], timestamp)} 34 {sgn: calculateSignature(config.h2h_out.userid, config.h2h_out.password, task['destination'], timestamp)}
37 ] 35 ]
38 }; 36 };
39 37
40 console.log(payload); 38 console.log(payload);
41 return "<?xml version=\"1.0\" ?>\n" + xml(payload); 39 return "<?xml version=\"1.0\" ?>\n" + xml(payload);
42 } 40 }
43 41
44 function topupRequest(task, retry) { 42 function topupRequest(task, retry) {
45 var payload_xml = createPayload(task); 43 var payload_xml = createPayload(task);
46 //console.log(payload_xml); 44 //console.log(payload_xml);
47 45
48 var postRequest = { 46 var postRequest = {
49 host: "202.152.62.2", 47 host: "202.152.62.2",
50 path: "/RELOAD97.php", 48 path: "/RELOAD97.php",
51 port: 7713, 49 port: 7713,
52 method: "POST", 50 method: "POST",
53 headers: { 51 headers: {
54 'Content-Type': 'text/xml', 52 'Content-Type': 'text/xml',
55 'Content-Length': Buffer.byteLength(payload_xml) 53 'Content-Length': Buffer.byteLength(payload_xml)
56 } 54 }
57 }; 55 };
58 56
59 var buffer = ""; 57 var buffer = "";
60 var req = http.request( postRequest, function( res ) { 58 var req = http.request( postRequest, function( res ) {
61 59
62 console.log('Status code: ' + res.statusCode ); 60 console.log('Status code: ' + res.statusCode );
63 var buffer = ""; 61 var buffer = "";
64 res.on( "data", function( data ) { buffer = buffer + data; } ); 62 res.on( "data", function( data ) { buffer = buffer + data; } );
65 res.on( "end", function( data ) { 63 res.on( "end", function( data ) {
66 topupResponseHandler(buffer); 64 topupResponseHandler(buffer);
67 }); 65 });
68 66
69 }); 67 });
70 68
71 req.on('error', function(e) { 69 req.on('error', function(e) {
72 console.log('problem with request: ' + e.message); 70 console.log('problem with request: ' + e.message);
73 }); 71 });
74 72
75 req.write( payload_xml ); 73 req.write( payload_xml );
76 req.end(); 74 req.end();
77 } 75 }
78 76
79 function topupResponseHandler(body, request_id) { 77 function topupResponseHandler(body, request_id) {
80 xml2js(body, function (err, result) { 78 xml2js(body, function (err, result) {
81 if (err) { 79 if (err) {
82 console.log(body); 80 console.log(body);
83 callbackReport(request_id, '40', buffer); 81 callbackReport(request_id, '40', buffer);
84 return; 82 return;
85 } 83 }
86 84
87 console.log(result); 85 console.log(result);
88 86
89 request_id = result.datacell.ref_trxid[0].trim(); 87 request_id = result.datacell.ref_trxid[0].trim();
90 88
91 var response_code = '68'; 89 var response_code = '68';
92 90
93 var message = ''; 91 var message = '';
94 try { 92 try {
95 if (result.datacell.message && result.datacell.message.length > 0) { 93 if (result.datacell.message && result.datacell.message.length > 0) {
96 message = result.datacell.message[0].trim(); 94 message = result.datacell.message[0].trim();
97 } else if (result.datacell.msg && result.datacell.msg.length > 0) { 95 } else if (result.datacell.msg && result.datacell.msg.length > 0) {
98 message = result.datacell.msg[0].trim(); 96 message = result.datacell.msg[0].trim();
99 } 97 }
100 } 98 }
101 catch(err) { 99 catch(err) {
102 message = 'exception saat parsing message'; 100 message = 'exception saat parsing message';
103 } 101 }
104 102
105 if (result.datacell.resultcode && result.datacell.resultcode[0] == '999') { 103 if (result.datacell.resultcode && result.datacell.resultcode[0] == '999') {
106 response_code = '40'; 104 response_code = '40';
107 } 105 }
108 106
109 if (message.indexOf('Nomor tujuan salah') >= 0) { 107 if (message.indexOf('Nomor tujuan salah') >= 0) {
110 response_code = '14'; 108 response_code = '14';
111 } else if (message.indexOf('*GAGAL, transaksi yang sama sudah ada dalam 10 menit') >= 0) { 109 } else if (message.indexOf('*GAGAL, transaksi yang sama sudah ada dalam 10 menit') >= 0) {
112 response_code = '55'; 110 response_code = '55';
113 } else if (message.indexOf('saldo sdh dikembalikan') >= 0) { 111 } else if (message.indexOf('saldo sdh dikembalikan') >= 0) {
114 response_code = '40' 112 response_code = '40'
115 } else if (message.indexOf('Trx dpt diulang') >= 0) { 113 } else if (message.indexOf('Trx dpt diulang') >= 0) {
116 response_code = '40' 114 response_code = '40'
117 } else if (message.indexOf('SUKSES SN Operator:') >= 0) { 115 } else if (message.indexOf('SUKSES SN Operator:') >= 0) {
118 response_code = '00'; 116 response_code = '00';
119 117
120 var sn = parseSN(message); 118 var sn = parseSN(message);
121 console.log ('SN Operator: ' + sn); 119 console.log ('SN Operator: ' + sn);
122 120
123 /* 121 /*
124 if (!sn) { 122 if (!sn) {
125 123
126 console.log('Missing real operator SN, using SN from suplier'); 124 console.log('Missing real operator SN, using SN from suplier');
127 try { 125 try {
128 sn = result.datacell.trxid[0].trim(); 126 sn = result.datacell.trxid[0].trim();
129 } 127 }
130 catch(err) { 128 catch(err) {
131 sn = ''; 129 sn = '';
132 } 130 }
133 } 131 }
134 */ 132 */
135 133
136 if (sn) { 134 if (sn) {
137 message = 'SN=' + sn + '; ' + message; 135 message = 'SN=' + sn + '; ' + message;
138 } else { 136 } else {
139 message = message + ' - ' + ' Unknown original SN'; 137 message = message + ' - ' + ' Unknown original SN';
140 } 138 }
141 } 139 }
142 140
143 callbackReport(request_id, response_code, message); 141 callbackReport(request_id, response_code, message);
144 }); 142 });
145 } 143 }
146 144
147 function parseSN(message) { 145 function parseSN(message) {
148 var results = message.match(/SN Operator: .+ SN Kami/); 146 var results = message.match(/SN Operator: .+ SN Kami/);
149 if (!results || results.length <= 0) { 147 if (!results || results.length <= 0) {
150 return ''; 148 return '';
151 } 149 }
152 150
153 var result = results[0]; 151 var result = results[0];
154 result = result.replace('SN Operator:', ''); 152 result = result.replace('SN Operator:', '');
155 result = result.replace('SN Kami', ''); 153 result = result.replace('SN Kami', '');
156 result = result.trim(); 154 result = result.trim();
157 155
158 if (result == '00') { 156 if (result == '00') {
159 result = ''; 157 result = '';
160 } 158 }
161 159
162 return result; 160 return result;
163 } 161 }
164 162
165 function createServer() { 163 function createServer() {
166 164
167 var httpServer = http.createServer(function(req, res) { 165 var httpServer = http.createServer(function(req, res) {
168 console.log('Got request from partner ("' + req.url + '")'); 166 console.log('Got request from partner ("' + req.url + '")');
169 167
170 var body = ""; 168 var body = "";
171 req.on('data', function (chunk) { 169 req.on('data', function (chunk) {
172 body += chunk; 170 body += chunk;
173 }); 171 });
174 172
175 req.on('end', function () { 173 req.on('end', function () {
176 res.writeHead(200); 174 res.writeHead(200);
177 res.end('OK'); 175 res.end('OK');
178 176
179 console.log(body); 177 console.log(body);
180 topupResponseHandler(body); 178 topupResponseHandler(body);
181 }); 179 });
182 }); 180 });
183 181
184 httpServer.listen(config.h2h_out.listen_port, function() { 182 httpServer.listen(config.h2h_out.listen_port, function() {
185 console.log('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 183 console.log('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
186 }); 184 });
187 } 185 }
188 186
189 187
190 function start(_config, _callbackReport) { 188 function start(_config, _callbackReport) {
191 config = _config; 189 config = _config;
192 callbackReport = _callbackReport 190 callbackReport = _callbackReport
193 191
194 createServer(); 192 createServer();
195 } 193 }
196 194
197 exports.start = start; 195 exports.start = start;
198 exports.topupRequest = topupRequest; 196 exports.topupRequest = topupRequest;
199 197