Commit 01c3f4e253d964bd3a7aed2137962c805550629a

Authored by Adhidarma Hadiwinoto
1 parent 80d5f6d276
Exists in master

logging using logger

Showing 1 changed file with 13 additions and 10 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 var aaa; 12 var aaa;
13 var logger; 13 var logger;
14 14
15 var max_retry = 2; 15 var max_retry = 2;
16 var sleep_before_retry = 2000; 16 var sleep_before_retry = 2000;
17 17
18 var trx_balances = {}; 18 var trx_balances = {};
19 var trx_prices = {}; 19 var trx_prices = {};
20 20
21 function calculateSignature(password, msisdn, timestamp) { 21 function calculateSignature(password, msisdn, timestamp) {
22 var a = timestamp + msisdn.substr(msisdn.length - 4); 22 var a = timestamp + msisdn.substr(msisdn.length - 4);
23 var b = msisdn.substr(msisdn.length - 4).split('').reverse().join('') + password; 23 var b = msisdn.substr(msisdn.length - 4).split('').reverse().join('') + password;
24 24
25 return xor.encode(a,b); 25 return xor.encode(a,b);
26 } 26 }
27 27
28 function createPayload(task) { 28 function createPayload(task) {
29 var timestamp = strftime('%H%M%S'); 29 var timestamp = strftime('%H%M%S');
30 30
31 var payload = { 31 var payload = {
32 pulsamatic: [ 32 pulsamatic: [
33 {command: 'TOPUP'}, 33 {command: 'TOPUP'},
34 {vtype: task['remoteProduct']}, 34 {vtype: task['remoteProduct']},
35 {userid: config.h2h_out.userid}, 35 {userid: config.h2h_out.userid},
36 {time: timestamp}, 36 {time: timestamp},
37 {msisdn: task['destination']}, 37 {msisdn: task['destination']},
38 {trxid: task['requestId']}, 38 {trxid: task['requestId']},
39 {sign: calculateSignature(config.h2h_out.password, task['destination'], timestamp)} 39 {sign: calculateSignature(config.h2h_out.password, task['destination'], timestamp)}
40 ] 40 ]
41 }; 41 };
42 42
43 console.log(payload); 43 //console.log(payload);
44 return "<?xml version=\"1.0\" ?>\n" + xml(payload); 44 return "<?xml version=\"1.0\" ?>\n" + xml(payload);
45 } 45 }
46 46
47 function topupRequest(task, retry) { 47 function topupRequest(task, retry) {
48 48
49 console.log('Requesting to partner:');
50 var payload_xml = createPayload(task); 49 var payload_xml = createPayload(task);
51 var partner = url.parse(config.h2h_out.partner); 50 var partner = url.parse(config.h2h_out.partner);
52 51
53 var request_options = { 52 var request_options = {
54 host: partner.hostname, 53 host: partner.hostname,
55 path: partner.path, 54 path: partner.path,
56 port: partner.port, 55 port: partner.port,
57 method: "POST", 56 method: "POST",
58 headers: { 57 headers: {
59 'Content-Type': 'text/xml', 58 'Content-Type': 'text/xml',
60 'Content-Length': Buffer.byteLength(payload_xml) 59 'Content-Length': Buffer.byteLength(payload_xml)
61 } 60 }
62 }; 61 };
63 62
64 var buffer = ""; 63 var buffer = "";
64
65 logger.info('Requesting to partner', {request_options: request_options});
66
65 var req = http.request(request_options, function( res ) { 67 var req = http.request(request_options, function( res ) {
66 68
67 console.log('Status code: ' + res.statusCode ); 69 logger.info('Status code: ' + res.statusCode );
68 var buffer = ""; 70 var buffer = "";
69 res.on( "data", function( data ) { buffer = buffer + data; } ); 71 res.on( "data", function( data ) { buffer = buffer + data; } );
70 res.on( "end", function( data ) { 72 res.on( "end", function( data ) {
71 directResponseHandler(buffer, task['requestId']); 73 directResponseHandler(buffer, task['requestId']);
72 }); 74 });
73 75
74 }); 76 });
75 77
76 req.on('error', function(e) { 78 req.on('error', function(e) {
77 console.log('problem with request: ' + e.message); 79 logger.warn('problem with request: ' + e.message);
78 callbackReport(task['requestId'], '40', e.message); 80 callbackReport(task['requestId'], '40', e.message);
79 }); 81 });
80 82
83 logger.verbose('Sending payload to partner', {payload: payload_xml});
81 req.write( payload_xml ); 84 req.write( payload_xml );
82 req.end(); 85 req.end();
83 } 86 }
84 87
85 function directResponseHandler(body, request_id) { 88 function directResponseHandler(body, request_id) {
86 console.log('Direct Response:'); 89 logger.info('Got direct response');
87 xml2js(body, function (err, result) { 90 xml2js(body, function (err, result) {
88 if (err) { 91 if (err) {
89 console.log(body); 92 logger.warn('Error parsing xml', {body: body});
90 callbackReport(request_id, '40', buffer); 93 callbackReport(request_id, '40', buffer);
91 return; 94 return;
92 } 95 }
93 console.log(result); 96
97 logger.info('Direct response parsed', {result: result});
94 98
95 var response_code = '68'; 99 var response_code = '68';
96 100
97 var request_id = result.pulsamatic.partner_trxid[0].trim(); 101 var request_id = result.pulsamatic.partner_trxid[0].trim();
98 var message = result.pulsamatic.message[0].trim(); 102 var message = result.pulsamatic.message[0].trim();
99 var status = result.pulsamatic.result[0].trim(); 103 var status = result.pulsamatic.result[0].trim();
100 104
101 if (status === 'failed') { 105 if (status === 'failed') {
102 response_code = '40'; 106 response_code = '40';
103 107
104 var new_response_code = responseCodeFromMessage(message); 108 var new_response_code = responseCodeFromMessage(message);
105 if (new_response_code) { 109 if (new_response_code) {
106 response_code = new_response_code; 110 response_code = new_response_code;
107 } 111 }
108 112
109 } 113 }
110 114
111 callbackReport(request_id, response_code, message); 115 callbackReport(request_id, response_code, message);
112 }); 116 });
113 } 117 }
114 118
115 function responseCodeFromMessage(message) { 119 function responseCodeFromMessage(message) {
116 if (message.indexOf('Jenis produk tidak cocok') >= 0) { 120 if (message.indexOf('Jenis produk tidak cocok') >= 0) {
117 return '14'; 121 return '14';
118 } else if (message.indexOf('GAGAL. Nomor telp salah.') >= 0) { 122 } else if (message.indexOf('GAGAL. Nomor telp salah.') >= 0) {
119 return '14'; 123 return '14';
120 } else if (message.indexOf('GAGAL. MSISDN tidak ditemukan') >= 0) { 124 } else if (message.indexOf('GAGAL. MSISDN tidak ditemukan') >= 0) {
121 return '14'; 125 return '14';
122 } else if (message.indexOf('GAGAL. Jenis produk ini sedang gangguan.') >= 0) { 126 } else if (message.indexOf('GAGAL. Jenis produk ini sedang gangguan.') >= 0) {
123 return '13'; 127 return '13';
124 } 128 }
125 return; 129 return;
126 } 130 }
127 131
128 function createServer() { 132 function createServer() {
129 133
130 var httpServer = http.createServer(function(req, res) { 134 var httpServer = http.createServer(function(req, res) {
131 //console.log('Got request from partner ("' + req.url + '")'); 135 //console.log('Got request from partner ("' + req.url + '")');
132 136
133 res.end('OK'); 137 res.end('OK');
134 138
135 console.log('Reverse Report:');
136 var qs = url.parse(req.url, true).query; 139 var qs = url.parse(req.url, true).query;
137 console.log(qs); 140 logger.info('Reverse Report', {qs: qs});
138 141
139 var response_code = '68'; 142 var response_code = '68';
140 var request_id = qs.pid; 143 var request_id = qs.pid;
141 var message = qs.msg; 144 var message = qs.msg;
142 145
143 if (qs.code == 2) { 146 if (qs.code == 2) {
144 // gagal 147 // gagal
145 response_code = '40'; 148 response_code = '40';
146 } else if (qs.code == 3) { 149 } else if (qs.code == 3) {
147 // refund 150 // refund
148 response_code = '40'; 151 response_code = '40';
149 } else if (qs.code == 4) { 152 } else if (qs.code == 4) {
150 response_code = '00'; 153 response_code = '00';
151 message = 'SN=' + qs.sn + ';' + message; 154 message = 'SN=' + qs.sn + ';' + message;
152 } 155 }
153 156
154 if (response_code == '40') { 157 if (response_code == '40') {
155 var new_response_code = responseCodeFromMessage(message); 158 var new_response_code = responseCodeFromMessage(message);
156 if (new_response_code) { 159 if (new_response_code) {
157 response_code = new_response_code; 160 response_code = new_response_code;
158 } 161 }
159 } 162 }
160 163
161 callbackReport(request_id, response_code, message); 164 callbackReport(request_id, response_code, message);
162 }); 165 });
163 166
164 httpServer.listen(config.h2h_out.listen_port, function() { 167 httpServer.listen(config.h2h_out.listen_port, function() {
165 console.log('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 168 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
166 }); 169 });
167 } 170 }
168 171
169 function start(_config, _callbackReport, options) { 172 function start(_config, _callbackReport, options) {
170 config = _config; 173 config = _config;
171 callbackReport = _callbackReport 174 callbackReport = _callbackReport
172 175
173 if (options && options.aaa) { 176 if (options && options.aaa) {
174 aaa = options.aaa; 177 aaa = options.aaa;
175 } 178 }
176 179
177 if (options && options.logger) { 180 if (options && options.logger) {
178 logger = options.logger; 181 logger = options.logger;
179 } else { 182 } else {
180 logger = new winston.Logger({ 183 logger = new winston.Logger({
181 transports: [ 184 transports: [
182 new (winston.transports.Console)() 185 new (winston.transports.Console)()
183 ] 186 ]
184 }); 187 });
185 } 188 }
186 189
187 createServer(); 190 createServer();
188 } 191 }
189 192
190 exports.start = start; 193 exports.start = start;
191 exports.topupRequest = topupRequest; 194 exports.topupRequest = topupRequest;