Commit df49a5034fdaa126eb0260ab9d88e8984ba6652d

Authored by Adhidarma Hadiwinoto
1 parent 01c3f4e253
Exists in master

index.js adaptasi

Showing 3 changed files with 25 additions and 11 deletions Inline Diff

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