Commit 2d655fbec962d15300bdb1b54927d74118a0b839

Authored by Adhidarma Hadiwinoto
1 parent cd2230271d
Exists in master

create redisClient

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