Commit 63bf050e7caff17fe8756ab1e46f78e41e4922c9

Authored by Adhidarma Hadiwinoto
1 parent 6345464d43
Exists in master

max_retry = 0

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

partner-trustlink.js
1 var winston = require('winston'); 1 var winston = require('winston');
2 var request = require('request'); 2 var request = require('request');
3 var strftime = require('strftime'); 3 var strftime = require('strftime');
4 var url = require('url'); 4 var url = require('url');
5 var xor = require('base64-xor'); 5 var xor = require('base64-xor');
6 var http = require('http'); 6 var http = require('http');
7 var xml = require('xml'); 7 var xml = require('xml');
8 var xml2js = require('xml2js').parseString; 8 var xml2js = require('xml2js').parseString;
9 9
10 var max_retry = 3; 10 var max_retry = 0;
11 var sleep_before_retry = 2000; 11 var sleep_before_retry = 2000;
12 12
13 var config; 13 var config;
14 var callbackReport; 14 var callbackReport;
15 var aaa; 15 var aaa;
16 var logger; 16 var logger;
17 var options; 17 var options;
18 var redisClient; 18 var redisClient;
19 19
20 function start(_config, _callbackReport, options) { 20 function start(_config, _callbackReport, options) {
21 config = _config; 21 config = _config;
22 callbackReport = _callbackReport 22 callbackReport = _callbackReport
23 23
24 if (options && options.aaa) { 24 if (options && options.aaa) {
25 aaa = options.aaa; 25 aaa = options.aaa;
26 } 26 }
27 27
28 if (options && options.logger) { 28 if (options && options.logger) {
29 logger = options.logger; 29 logger = options.logger;
30 } else { 30 } else {
31 logger = new winston.Logger({ 31 logger = new winston.Logger({
32 transports: [ 32 transports: [
33 new (winston.transports.Console)() 33 new (winston.transports.Console)()
34 ] 34 ]
35 }); 35 });
36 } 36 }
37 37
38 createRedisClient(); 38 createRedisClient();
39 createReverseReportServer(); 39 createReverseReportServer();
40 } 40 }
41 41
42 function createReverseReportServer() { 42 function createReverseReportServer() {
43 var httpServer = http.createServer(onReverseReport).listen(config.h2h_out.listen_port, function() { 43 var httpServer = http.createServer(onReverseReport).listen(config.h2h_out.listen_port, function() {
44 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 44 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
45 }); 45 });
46 } 46 }
47 47
48 function onReverseReport(req, res) { 48 function onReverseReport(req, res) {
49 res.end('OK'); 49 res.end('OK');
50 50
51 var qs = url.parse(req.url, true).query; 51 var qs = url.parse(req.url, true).query;
52 logger.info('Reverse Report', {qs: qs}); 52 logger.info('Reverse Report', {qs: qs});
53 } 53 }
54 54
55 function calculateSignature(ts, destination, password) { 55 function calculateSignature(ts, destination, password) {
56 var a = ts + destination.substr(destination.length - 4); 56 var a = ts + destination.substr(destination.length - 4);
57 var b = destination.substr(destination.length - 4).split('').reverse().join('') + password; 57 var b = destination.substr(destination.length - 4).split('').reverse().join('') + password;
58 58
59 return xor.encode(a,b); 59 return xor.encode(a,b);
60 } 60 }
61 61
62 function createXmlPayload(task, userid, password) { 62 function createXmlPayload(task, userid, password) {
63 var ts = strftime('%H%M%S', new Date()); 63 var ts = strftime('%H%M%S', new Date());
64 64
65 var signature = calculateSignature(ts, task.destination, password); 65 var signature = calculateSignature(ts, task.destination, password);
66 66
67 var payload = { 67 var payload = {
68 evoucher: [ 68 evoucher: [
69 {command: 'TOPUP'}, 69 {command: 'TOPUP'},
70 {product: task.remoteProduct}, 70 {product: task.remoteProduct},
71 {userid: userid}, 71 {userid: userid},
72 {time: ts}, 72 {time: ts},
73 {msisdn: task.destination}, 73 {msisdn: task.destination},
74 {partner_trxid: task.requestId}, 74 {partner_trxid: task.requestId},
75 {signature: signature}, 75 {signature: signature},
76 {trxke: 1}, 76 {trxke: 1},
77 ] 77 ]
78 }; 78 };
79 79
80 if (logger) { 80 if (logger) {
81 logger.verbose('Generate xml payload', {payload: payload}); 81 logger.verbose('Generate xml payload', {payload: payload});
82 } 82 }
83 83
84 return "<?xml version=\"1.0\" ?>\n" + xml(payload); 84 return "<?xml version=\"1.0\" ?>\n" + xml(payload);
85 } 85 }
86 86
87 function topupRequestHit(task, retry) { 87 function topupRequestHit(task, retry) {
88 if (retry === undefined) { 88 if (retry === undefined) {
89 retry = max_retry; 89 retry = max_retry;
90 } 90 }
91 91
92 var payload = createXmlPayload(task, config.h2h_out.userid, config.h2h_out.password); 92 var payload = createXmlPayload(task, config.h2h_out.userid, config.h2h_out.password);
93 93
94 var partner = url.parse(config.h2h_out.partner); 94 var partner = url.parse(config.h2h_out.partner);
95 95
96 var request_options = { 96 var request_options = {
97 host: partner.hostname, 97 host: partner.hostname,
98 path: partner.path, 98 path: partner.path,
99 port: partner.port, 99 port: partner.port,
100 method: "POST", 100 method: "POST",
101 headers: { 101 headers: {
102 'Content-Type': 'text/xml', 102 'Content-Type': 'text/xml',
103 'Content-Length': Buffer.byteLength(payload) 103 'Content-Length': Buffer.byteLength(payload)
104 } 104 }
105 }; 105 };
106 106
107 var buffer = ""; 107 var buffer = "";
108 108
109 logger.info('Requesting to partner', {request_options: request_options}); 109 logger.info('Requesting to partner', {request_options: request_options});
110 110
111 var req = http.request(request_options, function( res ) { 111 var req = http.request(request_options, function( res ) {
112 112
113 logger.verbose('Status code: ' + res.statusCode ); 113 logger.verbose('Status code: ' + res.statusCode );
114 var buffer = ""; 114 var buffer = "";
115 res.on( "data", function( data ) { buffer = buffer + data; } ); 115 res.on( "data", function( data ) { buffer = buffer + data; } );
116 res.on( "end", function( data ) { 116 res.on( "end", function( data ) {
117 logger.verbose('Got direct response from partner', {resp: buffer}); 117 logger.verbose('Got direct response from partner', {resp: buffer});
118 directResponseHandler(buffer, task); 118 directResponseHandler(buffer, task);
119 }); 119 });
120 120
121 }); 121 });
122 122
123 req.on('error', function(e) { 123 req.on('error', function(e) {
124 logger.warn('problem with request: ' + e.message); 124 logger.warn('problem with request: ' + e.message);
125 callbackReport(task.requestId, '68', e.message); 125 callbackReport(task.requestId, '68', e.message);
126 return; 126 return;
127 }); 127 });
128 128
129 logger.verbose('Sending payload to partner', {payload: payload}); 129 logger.verbose('Sending payload to partner', {payload: payload});
130 req.write( payload ); 130 req.write( payload );
131 req.end(); 131 req.end();
132 } 132 }
133 133
134 function directResponseHandler(body, task) { 134 function directResponseHandler(body, task) {
135 135
136 logger.info('Got direct response'); 136 logger.info('Got direct response');
137 137
138 xml2js(body, function (err, result) { 138 xml2js(body, function (err, result) {
139 if (err) { 139 if (err) {
140 logger.warn('Error parsing xml', {body: body}); 140 logger.warn('Error parsing xml', {body: body});
141 callbackReport(task.requestId, '68', buffer); 141 callbackReport(task.requestId, '68', buffer);
142 return; 142 return;
143 } 143 }
144 144
145 logger.info('Direct response parsed', {result: result}); 145 logger.info('Direct response parsed', {result: result});
146 146
147 var response_code = '68'; 147 var response_code = '68';
148 148
149 var request_id = task.requestId; 149 var request_id = task.requestId;
150 var status = result.evoucher.result[0].trim(); 150 var status = result.evoucher.result[0].trim();
151 var message = result.evoucher.value[0].string[0].trim(); 151 var message = result.evoucher.value[0].string[0].trim();
152 152
153 if (message.indexOf('SUKSES') >= 0) { 153 if (message.indexOf('SUKSES') >= 0) {
154 /* 154 /*
155 var sn = getSNFromMessage(message); 155 var sn = getSNFromMessage(message);
156 message = 'SN=' + sn + '; ' + message; 156 message = 'SN=' + sn + '; ' + message;
157 */ 157 */
158 158
159 response_code = '68'; 159 response_code = '68';
160 } 160 }
161 else if (message.indexOf('GAGAL') >= 0) { 161 else if (message.indexOf('GAGAL') >= 0) {
162 response_code = '40'; 162 response_code = '40';
163 } 163 }
164 else { 164 else {
165 response_code = '68'; 165 response_code = '68';
166 } 166 }
167 167
168 callbackReport(request_id, response_code, message); 168 callbackReport(request_id, response_code, message);
169 }); 169 });
170 } 170 }
171 171
172 function getSNFromMessage(message) { 172 function getSNFromMessage(message) {
173 try { 173 try {
174 var sn_match = message.match(/SN=(\w+)/); 174 var sn_match = message.match(/SN=(\w+)/);
175 return sn_match[1].trim(); 175 return sn_match[1].trim();
176 } 176 }
177 catch(e) { 177 catch(e) {
178 return; 178 return;
179 } 179 }
180 } 180 }
181 181
182 function topupRequest(task, retry) { 182 function topupRequest(task, retry) {
183 var key = 'DUPCHECK.gw:' + config.globals.gateway_name + '.prod:' + task.remoteProduct + '.dest:' + task.destination + '.date:' + strftime('%Y%m%d', new Date); 183 var key = 'DUPCHECK.gw:' + config.globals.gateway_name + '.prod:' + task.remoteProduct + '.dest:' + task.destination + '.date:' + strftime('%Y%m%d', new Date);
184 redisClient.get(key, function(err, data) { 184 redisClient.get(key, function(err, data) {
185 if (err) { 185 if (err) {
186 callbackReport(task.requestId, '40', 'Gagal cek anti transaksi duplikat (redis error)'); 186 callbackReport(task.requestId, '40', 'Gagal cek anti transaksi duplikat (redis error)');
187 return; 187 return;
188 } 188 }
189 189
190 if (!data) { 190 if (!data) {
191 191
192 redisClient.set(key, JSON.stringify(task)); 192 redisClient.set(key, JSON.stringify(task));
193 redisClient.expire(key, 3600 * 24 * 2); 193 redisClient.expire(key, 3600 * 24 * 2);
194 194
195 } else { 195 } else {
196 196
197 try { 197 try {
198 var taskOnRedis = JSON.parse(data); 198 var taskOnRedis = JSON.parse(data);
199 if (task.requestId == taskOnRedis.requestId) { 199 if (task.requestId == taskOnRedis.requestId) {
200 topupRequestHit(task, retry); 200 topupRequestHit(task, retry);
201 } else { 201 } else {
202 callbackReport(task.requestId, '55', 'Transaksi duplikat') 202 callbackReport(task.requestId, '55', 'Transaksi duplikat')
203 } 203 }
204 } 204 }
205 catch(errJSONParse) { 205 catch(errJSONParse) {
206 callbackReport(task.requestId, '68', "error parsing json"); 206 callbackReport(task.requestId, '68', "error parsing json");
207 } 207 }
208 } 208 }
209 209
210 }); 210 });
211 } 211 }
212 212
213 function createRedisClient() { 213 function createRedisClient() {
214 try { 214 try {
215 redisClient = redis.createClient(config.globals.redis_port, config.globals.redis_host); 215 redisClient = redis.createClient(config.globals.redis_port, config.globals.redis_host);
216 } catch(err) { 216 } catch(err) {
217 logger.info("Error creating redis client"); 217 logger.info("Error creating redis client");
218 } 218 }
219 } 219 }
220 220
221 exports.start = start; 221 exports.start = start;
222 exports.topupRequest = topupRequest; 222 exports.topupRequest = topupRequest;
223 exports.calculateSignature = calculateSignature; 223 exports.calculateSignature = calculateSignature;
224 224