Commit 0dbce6884ae3f12ec8deceb67d26eb7722a329f6

Authored by Adhidarma Hadiwinoto
1 parent 63bf050e7c
Exists in master

var redis

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