Commit c187523945d1296ae82a89a7effed6fb6133eaf8

Authored by Adhidarma Hadiwinoto
1 parent 4daddde925
Exists in master

insertTaskToMongoDb dan callbackReportWithPushToMongoDb

Showing 2 changed files with 47 additions and 33 deletions Inline Diff

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