Commit 6a32cda781ac1f60be68bc9276a8fb5c45c6fd6f

Authored by Adhidarma Hadiwinoto
1 parent 10f36fac7a
Exists in master

more detailed parsing error on cb webreport

Showing 1 changed file with 14 additions and 14 deletions Inline Diff

1 var fs = require('fs'); 1 var fs = require('fs');
2 var https = require('https'); 2 var https = require('https');
3 var http = require('http'); 3 var http = require('http');
4 var url = require('url'); 4 var url = require('url');
5 var request = require('request'); 5 var request = require('request');
6 var xml2js = require('xml2js').parseString; 6 var xml2js = require('xml2js').parseString;
7 var strftime = require('strftime'); 7 var strftime = require('strftime');
8 var math = require('mathjs'); 8 var math = require('mathjs');
9 var winston = require('winston'); 9 var winston = require('winston');
10 var cekstatus = require('./cekstatus.js'); 10 var cekstatus = require('./cekstatus.js');
11 11
12 var config; 12 var config;
13 var httpServer; 13 var httpServer;
14 var aaa; 14 var aaa;
15 var logger; 15 var logger;
16 var callbackReport; 16 var callbackReport;
17 17
18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 18 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
19 19
20 var sleep_before_retry = 30000; 20 var sleep_before_retry = 30000;
21 21
22 var logTag = __filename.split('/').reverse()[0]; 22 var logTag = __filename.split('/').reverse()[0];
23 23
24 function topupRequest(task) { 24 function topupRequest(task) {
25 25
26 var ts = strftime('%Y%m%d%H%M%S', new Date()); 26 var ts = strftime('%Y%m%d%H%M%S', new Date());
27 27
28 var data = 28 var data =
29 config.h2h_out.userid 29 config.h2h_out.userid
30 + '|' + config.h2h_out.password 30 + '|' + config.h2h_out.password
31 + '|' + task['remoteProduct'] 31 + '|' + task['remoteProduct']
32 + '|' + task['destination'] + '|0'; 32 + '|' + task['destination'] + '|0';
33 33
34 var options = { 34 var options = {
35 url: config.h2h_out.partner, 35 url: config.h2h_out.partner,
36 qs: { 36 qs: {
37 ts: ts, 37 ts: ts,
38 data: data, 38 data: data,
39 reffid: task['requestId'] 39 reffid: task['requestId']
40 } 40 }
41 }; 41 };
42 logger.info('Creating http request', {options: options}); 42 logger.info('Creating http request', {options: options});
43 43
44 request(options, function (error, response, body) { 44 request(options, function (error, response, body) {
45 var responseCode = '40'; 45 var responseCode = '40';
46 var responseMessage = 'Gateway Error'; 46 var responseMessage = 'Gateway Error';
47 47
48 if (error) { 48 if (error) {
49 49
50 logger.warn('HTTP REQUEST ERROR', error); 50 logger.warn('HTTP REQUEST ERROR', error);
51 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); 51 callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')');
52 52
53 } else if (response.statusCode != 200) { 53 } else if (response.statusCode != 200) {
54 54
55 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; 55 var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')';
56 logger.warn(error_message); 56 logger.warn(error_message);
57 callbackReport(task['requestId'], '91', error_message); 57 callbackReport(task['requestId'], '91', error_message);
58 58
59 } else { 59 } else {
60 60
61 logger.info('DIRECT RESPONSE', {body: body}); 61 logger.info('DIRECT RESPONSE', {body: body});
62 62
63 xml2js(body, function (err, result) { 63 xml2js(body, function (err, result) {
64 if (err) { 64 if (err) {
65 callbackReport(task['requestId'], '40', body); 65 callbackReport(task['requestId'], '40', body);
66 } else { 66 } else {
67 var directResponse = result; 67 var directResponse = result;
68 logger.info(directResponse); 68 logger.info(directResponse);
69 69
70 try { 70 try {
71 var result_price; 71 var result_price;
72 try { 72 try {
73 result_price = directResponse.Result.Price[0].trim(); 73 result_price = directResponse.Result.Price[0].trim();
74 } 74 }
75 catch(err) { 75 catch(err) {
76 result_price = 0; 76 result_price = 0;
77 } 77 }
78 78
79 var result_error_message; 79 var result_error_message;
80 try { 80 try {
81 result_error_message = directResponse.Result.ErrorMsg[0].trim(); 81 result_error_message = directResponse.Result.ErrorMsg[0].trim();
82 } 82 }
83 catch(err) { 83 catch(err) {
84 result_error_message = ''; 84 result_error_message = '';
85 } 85 }
86 86
87 var resultCode = directResponse.Result.ResultCode[0].trim(); 87 var resultCode = directResponse.Result.ResultCode[0].trim();
88 88
89 responseMessage = 89 responseMessage =
90 'ResultCode: ' + resultCode 90 'ResultCode: ' + resultCode
91 + ' | ErrorMsg: ' + result_error_message 91 + ' | ErrorMsg: ' + result_error_message
92 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() 92 + ' | DateTime: ' + directResponse.Result.DateTime[0].trim()
93 + ' | nsm: ' + directResponse.Result.nsm[0].trim() 93 + ' | nsm: ' + directResponse.Result.nsm[0].trim()
94 + ' | idpel: ' + directResponse.Result.idpel[0].trim() 94 + ' | idpel: ' + directResponse.Result.idpel[0].trim()
95 + ' | reffid: ' + directResponse.Result.reffid[0].trim() 95 + ' | reffid: ' + directResponse.Result.reffid[0].trim()
96 + ' | TransID: ' + directResponse.Result.TransID[0].trim() 96 + ' | TransID: ' + directResponse.Result.TransID[0].trim()
97 + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() 97 + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim()
98 + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() 98 + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim()
99 + ' | token: ' + directResponse.Result.token[0].trim() 99 + ' | token: ' + directResponse.Result.token[0].trim()
100 + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() 100 + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim()
101 + ' | Price: ' + result_price 101 + ' | Price: ' + result_price
102 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() 102 + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim()
103 ; 103 ;
104 104
105 logger.info('Response message: ' + responseMessage); 105 logger.info('Response message: ' + responseMessage);
106 106
107 if (aaa) { 107 if (aaa) {
108 // update balance 108 // update balance
109 aaa.updateBalance(directResponse.Result.EndBalance[0]); 109 aaa.updateBalance(directResponse.Result.EndBalance[0]);
110 } 110 }
111 111
112 if (resultCode == '0000') { 112 if (resultCode == '0000') {
113 var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); 113 var nama_pelanggan = directResponse.Result.nama_pel[0].trim();
114 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); 114 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
115 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + '/' + directResponse.Result.daya[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); 115 var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + '/' + directResponse.Result.daya[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim();
116 sn = sn.replace(/\s/g, '-'); 116 sn = sn.replace(/\s/g, '-');
117 117
118 responseMessage = 'SN=' + sn + '; ' + responseMessage; 118 responseMessage = 'SN=' + sn + '; ' + responseMessage;
119 logger.info('New response message: ' + responseMessage); 119 logger.info('New response message: ' + responseMessage);
120 } 120 }
121 121
122 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; 122 var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096'];
123 if (pendingResultCode.indexOf(resultCode) != -1) { 123 if (pendingResultCode.indexOf(resultCode) != -1) {
124 callbackReport(task['requestId'], '68', responseMessage); 124 callbackReport(task['requestId'], '68', responseMessage);
125 125
126 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); 126 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
127 setTimeout(function () { 127 setTimeout(function () {
128 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); 128 cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport);
129 }, sleep_before_retry); 129 }, sleep_before_retry);
130 130
131 return; 131 return;
132 } 132 }
133 133
134 responseCode = resultCode.replace(/^00/, ""); 134 responseCode = resultCode.replace(/^00/, "");
135 135
136 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { 136 if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') {
137 responseCode = '91'; 137 responseCode = '91';
138 } 138 }
139 139
140 } 140 }
141 catch(err) { 141 catch(err) {
142 responseCode = '40'; 142 responseCode = '40';
143 responseMessage = 'Invalid response from gateway'; 143 responseMessage = 'Invalid response from gateway';
144 } 144 }
145 } 145 }
146 146
147 callbackReport(task['requestId'], responseCode, responseMessage); 147 callbackReport(task['requestId'], responseCode, responseMessage);
148 }); 148 });
149 } 149 }
150 150
151 //callbackReport(task['requestId'], responseCode, responseMessage); 151 //callbackReport(task['requestId'], responseCode, responseMessage);
152 }); 152 });
153 } 153 }
154 154
155 function callbackFromWebReport(status) { 155 function callbackFromWebReport(status) {
156 if (!status) { 156 if (!status) {
157 logger.warn('Advice from webreport return empty status'); 157 logger.warn('Advice from webreport return empty status');
158 return; 158 return;
159 } 159 }
160 160
161 logger.info('Got advice result from webreport', {status: status}); 161 logger.info('Got advice result from webreport', {status: status});
162 162
163 var responseCode = '68'; 163 var responseCode = '68';
164 164
165 var result_price = 0; 165 var result_price = 0;
166 try { 166 try {
167 result_price = directResponse.Result.Price[0].trim(); 167 result_price = directResponse.Result.Price[0].trim();
168 } 168 }
169 catch(err) {} 169 catch(err) {}
170 170
171 var errorMsg = ''; 171 var errorMsg = '';
172 try { 172 try {
173 errorMsg = status.response.errormsg[0]; 173 errorMsg = status.response.errormsg[0];
174 } 174 }
175 catch(err) {} 175 catch(err) {}
176 176
177 var responseMessage = ''; 177 var responseMessage = '';
178 try { 178 try {
179 responseMessage = 179 responseMessage =
180 'Hasil advice dari webreport ' 180 'Hasil advice dari webreport '
181 + 'ResultCode: ' + status.response.resultcode[0] 181 + 'ResultCode: ' + status.response.resultcode[0]
182 } 182 }
183 catch(err) { 183 catch(err) {
184 logger.warn('Error parsing response message from webreport advice.', {err: err}); 184 logger.warn('Error parsing ResultCode from webreport advice.', {err: err});
185 } 185 }
186 186
187 try { 187 try {
188 responseMessage = 188 responseMessage =
189 responseMessage 189 responseMessage
190 + ' | ErrorMsg: ' + errorMsg 190 + ' | ErrorMsg: ' + errorMsg
191 } 191 }
192 catch(err) { 192 catch(err) {
193 logger.warn('Error parsing response message from webreport advice.', {err: err}); 193 logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err});
194 } 194 }
195 195
196 try { 196 try {
197 responseMessage = 197 responseMessage =
198 responseMessage 198 responseMessage
199 + ' | TrxDate: ' + status.trxDate; 199 + ' | TrxDate: ' + status.trxDate;
200 } 200 }
201 catch(err) { 201 catch(err) {
202 logger.warn('Error parsing response message from webreport advice.', {err: err}); 202 logger.warn('Error parsing TrxDate from webreport advice.', {err: err});
203 } 203 }
204 204
205 try { 205 try {
206 responseMessage = 206 responseMessage =
207 responseMessage 207 responseMessage
208 + ' | UpdateDate: ' + status.updateDate; 208 + ' | UpdateDate: ' + status.updateDate;
209 209
210 } 210 }
211 catch(err) { 211 catch(err) {
212 logger.warn('Error parsing response message from webreport advice.', {err: err}); 212 logger.warn('Error parsing UpdateDate from webreport advice.', {err: err});
213 } 213 }
214 214
215 try { 215 try {
216 responseMessage = 216 responseMessage =
217 responseMessage 217 responseMessage
218 + ' | nsm: ' + status.response.nsm[0]; 218 + ' | nsm: ' + status.response.nsm[0];
219 } 219 }
220 catch(err) { 220 catch(err) {
221 logger.warn('Error parsing response message from webreport advice.', {err: err}); 221 logger.warn('Error parsing nsm from webreport advice.', {err: err});
222 } 222 }
223 223
224 try { 224 try {
225 responseMessage = 225 responseMessage =
226 responseMessage 226 responseMessage
227 + ' | idpel: ' + status.response.idpel[0]; 227 + ' | idpel: ' + status.response.idpel[0];
228 } 228 }
229 catch(err) { 229 catch(err) {
230 logger.warn('Error parsing response message from webreport advice.', {err: err}); 230 logger.warn('Error parsing idpel from webreport advice.', {err: err});
231 } 231 }
232 232
233 try { 233 try {
234 responseMessage = 234 responseMessage =
235 responseMessage 235 responseMessage
236 + ' | reffid: ' + status.response.reffid[0].trim(); 236 + ' | reffid: ' + status.response.reffid[0].trim();
237 } 237 }
238 catch(err) { 238 catch(err) {
239 logger.warn('Error parsing response message from webreport advice.', {err: err}); 239 logger.warn('Error parsing reffid from webreport advice.', {err: err});
240 } 240 }
241 241
242 try { 242 try {
243 responseMessage = 243 responseMessage =
244 responseMessage 244 responseMessage
245 + ' | TransID: ' + status.response.transid[0].trim(); 245 + ' | TransID: ' + status.response.transid[0].trim();
246 } 246 }
247 catch(err) { 247 catch(err) {
248 logger.warn('Error parsing response message from webreport advice.', {err: err}); 248 logger.warn('Error parsing TransID from webreport advice.', {err: err});
249 } 249 }
250 250
251 try { 251 try {
252 responseMessage = 252 responseMessage =
253 responseMessage 253 responseMessage
254 + ' | reff_switching: ' + status.response.reff_switching[0]; 254 + ' | reff_switching: ' + status.response.reff_switching[0];
255 } 255 }
256 catch(err) { 256 catch(err) {
257 logger.warn('Error parsing response message from webreport advice.', {err: err}); 257 logger.warn('Error parsing reff_switching from webreport advice.', {err: err});
258 } 258 }
259 259
260 try { 260 try {
261 responseMessage = 261 responseMessage =
262 responseMessage 262 responseMessage
263 + ' | amount_trx: ' + status.response.amount_trx[0]; 263 + ' | amount_trx: ' + status.response.amount_trx[0];
264 } 264 }
265 catch(err) { 265 catch(err) {
266 logger.warn('Error parsing response message from webreport advice.', {err: err}); 266 logger.warn('Error parsing amount_trx from webreport advice.', {err: err});
267 } 267 }
268 268
269 try { 269 try {
270 responseMessage = 270 responseMessage =
271 responseMessage 271 responseMessage
272 + ' | token: ' + status.response.token[0]; 272 + ' | token: ' + status.response.token[0];
273 } 273 }
274 catch(err) { 274 catch(err) {
275 logger.warn('Error parsing response message from webreport advice.', {err: err}); 275 logger.warn('Error parsing token from webreport advice.', {err: err});
276 } 276 }
277 277
278 try { 278 try {
279 responseMessage = 279 responseMessage =
280 responseMessage 280 responseMessage
281 + ' | PrevBalance: ' + status.response.PrevBalance[0]; 281 + ' | PrevBalance: ' + status.response.PrevBalance[0];
282 } 282 }
283 catch(err) { 283 catch(err) {
284 logger.warn('Error parsing response message from webreport advice.', {err: err}); 284 logger.warn('Error parsing PrevBalance from webreport advice.', {err: err});
285 } 285 }
286 286
287 try { 287 try {
288 responseMessage = 288 responseMessage =
289 responseMessage 289 responseMessage
290 + ' | Price: ' + status.amount; 290 + ' | Price: ' + status.amount;
291 } 291 }
292 catch(err) { 292 catch(err) {
293 logger.warn('Error parsing response message from webreport advice.', {err: err}); 293 logger.warn('Error parsing Price from webreport advice.', {err: err});
294 } 294 }
295 295
296 try { 296 try {
297 responseMessage = 297 responseMessage =
298 responseMessage 298 responseMessage
299 + ' | EndBalance: ' + status.response.endbalance[0]; 299 + ' | EndBalance: ' + status.response.endbalance[0];
300 } 300 }
301 catch(err) { 301 catch(err) {
302 logger.warn('Error parsing response message from webreport advice.', {err: err}); 302 logger.warn('Error parsing EndBalance from webreport advice.', {err: err});
303 } 303 }
304 304
305 305
306 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { 306 if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) {
307 responseCode = '00'; 307 responseCode = '00';
308 308
309 var nama_pelanggan = status.response.nama_pel[0] ; 309 var nama_pelanggan = status.response.nama_pel[0] ;
310 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); 310 nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-');
311 311
312 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA' + status.response.jml_daya[0]; 312 var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA' + status.response.jml_daya[0];
313 responseMessage = 'SN=' + sn + '; ' + responseMessage; 313 responseMessage = 'SN=' + sn + '; ' + responseMessage;
314 314
315 } else if ((status.status == 'P') || (status.status == 'W')) { 315 } else if ((status.status == 'P') || (status.status == 'W')) {
316 316
317 callbackReport(status.response.reffid[0].trim(), '68', responseMessage); 317 callbackReport(status.response.reffid[0].trim(), '68', responseMessage);
318 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); 318 logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms');
319 319
320 setTimeout(function () { 320 setTimeout(function () {
321 321
322 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); 322 cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport);
323 323
324 }, sleep_before_retry); 324 }, sleep_before_retry);
325 return; 325 return;
326 326
327 } else { 327 } else {
328 responseCode = status.response.resultcode[0].replace(/^00/, ""); 328 responseCode = status.response.resultcode[0].replace(/^00/, "");
329 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { 329 if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) {
330 responseCode = '40'; 330 responseCode = '40';
331 } 331 }
332 } 332 }
333 333
334 334
335 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); 335 callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage);
336 } 336 }
337 337
338 function createHttpReportServer() { 338 function createHttpReportServer() {
339 var httpServer = http.createServer(function(request, response) { 339 var httpServer = http.createServer(function(request, response) {
340 var qs = url.parse(request.url, true).query; 340 var qs = url.parse(request.url, true).query;
341 var path = url.parse(request.url).pathname; 341 var path = url.parse(request.url).pathname;
342 342
343 logger.info('Got reverse report from partner', {path: path, qs: qs}); 343 logger.info('Got reverse report from partner', {path: path, qs: qs});
344 response.end('OK'); 344 response.end('OK');
345 345
346 var trxid; 346 var trxid;
347 try { 347 try {
348 trxid = qs.transid; 348 trxid = qs.transid;
349 } 349 }
350 catch(err) { 350 catch(err) {
351 } 351 }
352 352
353 if (trxid) { 353 if (trxid) {
354 logger.info('Requesting advice from webreport', {trxid: trxid}) 354 logger.info('Requesting advice from webreport', {trxid: trxid})
355 cekstatus.advice({trxid: trxid}, callbackFromWebReport); 355 cekstatus.advice({trxid: trxid}, callbackFromWebReport);
356 } 356 }
357 357
358 }); 358 });
359 359
360 httpServer.listen(config.h2h_out.listen_port, function() { 360 httpServer.listen(config.h2h_out.listen_port, function() {
361 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 361 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
362 }); 362 });
363 } 363 }
364 364
365 function start(_config, _callbackReport, options) { 365 function start(_config, _callbackReport, options) {
366 config = _config; 366 config = _config;
367 callbackReport = _callbackReport; 367 callbackReport = _callbackReport;
368 368
369 if (options && options.aaa) { 369 if (options && options.aaa) {
370 aaa = options.aaa; 370 aaa = options.aaa;
371 } 371 }
372 372
373 if (options && options.logger) { 373 if (options && options.logger) {
374 logger = options.logger; 374 logger = options.logger;
375 } else { 375 } else {
376 logger = new winston.Logger({ 376 logger = new winston.Logger({
377 transports: [ 377 transports: [
378 new (winston.transports.Console)() 378 new (winston.transports.Console)()
379 ] 379 ]
380 }); 380 });
381 } 381 }
382 382
383 createHttpReportServer(); 383 createHttpReportServer();
384 } 384 }
385 385
386 exports.start = start; 386 exports.start = start;
387 exports.topupRequest = topupRequest; 387 exports.topupRequest = topupRequest;
388 388