Commit e0be11e58c79409f247c665c0ccf5ade05b68698

Authored by Adhidarma Hadiwinoto
1 parent 7663b06b65
Exists in master

typo

Showing 1 changed file with 2 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 xml2js = require('xml2js').parseString; 7 var xml2js = require('xml2js').parseString;
8 8
9 var max_retry = 3; 9 var max_retry = 3;
10 var sleep_before_retry = 2000; 10 var sleep_before_retry = 2000;
11 11
12 var config; 12 var config;
13 var callbackReport; 13 var callbackReport;
14 var aaa; 14 var aaa;
15 var logger; 15 var logger;
16 var options; 16 var options;
17 17
18 function start(_config, _callbackReport, options) { 18 function start(_config, _callbackReport, options) {
19 config = _config; 19 config = _config;
20 callbackReport = _callbackReport 20 callbackReport = _callbackReport
21 21
22 if (options && options.aaa) { 22 if (options && options.aaa) {
23 aaa = options.aaa; 23 aaa = options.aaa;
24 } 24 }
25 25
26 if (options && options.logger) { 26 if (options && options.logger) {
27 logger = options.logger; 27 logger = options.logger;
28 } else { 28 } else {
29 logger = new winston.Logger({ 29 logger = new winston.Logger({
30 transports: [ 30 transports: [
31 new (winston.transports.Console)() 31 new (winston.transports.Console)()
32 ] 32 ]
33 }); 33 });
34 } 34 }
35 35
36 createReverseReportServer(); 36 createReverseReportServer();
37 } 37 }
38 38
39 function createReverseReportServer() { 39 function createReverseReportServer() {
40 var httpServer = http.createServer(onReverseReport).listen(config.h2h_out.listen_port, function() { 40 var httpServer = http.createServer(onReverseReport).listen(config.h2h_out.listen_port, function() {
41 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); 41 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
42 }); 42 });
43 } 43 }
44 44
45 function onReverseReport(req, res) { 45 function onReverseReport(req, res) {
46 res.end('OK'); 46 res.end('OK');
47 47
48 var qs = url.parse(req.url, true).query; 48 var qs = url.parse(req.url, true).query;
49 logger.info('Reverse Report', {qs: qs}); 49 logger.info('Reverse Report', {qs: qs});
50 } 50 }
51 51
52 function calculateSignature(ts, destination, password) { 52 function calculateSignature(ts, destination, password) {
53 var a = ts + destination.substr(destination.length - 4); 53 var a = ts + destination.substr(destination.length - 4);
54 var b = destination.substr(destination.length - 4).split('').reverse().join('') + password; 54 var b = destination.substr(destination.length - 4).split('').reverse().join('') + password;
55 55
56 return xor.encode(a,b); 56 return xor.encode(a,b);
57 } 57 }
58 58
59 function createXmlPayload(task, userid, password) { 59 function createXmlPayload(task, userid, password) {
60 var ts = strftime('%H%M%S', new Date()); 60 var ts = strftime('%H%M%S', new Date());
61 61
62 var signature = calculateSignature(ts, task.destination, password); 62 var signature = calculateSignature(ts, task.destination, password);
63 63
64 var payload = { 64 var payload = {
65 evoucher: [ 65 evoucher: [
66 {command: 'TOPUP'}, 66 {command: 'TOPUP'},
67 {product: task.remoteProduct}, 67 {product: task.remoteProduct},
68 {userid: userid}, 68 {userid: userid},
69 {time: ts}, 69 {time: ts},
70 {msisdn: task.destination}, 70 {msisdn: task.destination},
71 {partner_trxid: task.requestId}, 71 {partner_trxid: task.requestId},
72 {signature: signature}, 72 {signature: signature},
73 {trxke: 1}, 73 {trxke: 1},
74 ] 74 ]
75 }; 75 };
76 76
77 if (logger) { 77 if (logger) {
78 logger.verbose('Generate xml payload', {payload: payload}); 78 logger.verbose('Generate xml payload', {payload: payload});
79 } 79 }
80 80
81 return "<?xml version=\"1.0\" ?>\n" + xml(payload); 81 return "<?xml version=\"1.0\" ?>\n" + xml(payload);
82 } 82 }
83 83
84 function topupRequest(task, retry) { 84 function topupRequest(task, retry) {
85 if (retry === undefined) { 85 if (retry === undefined) {
86 retry = max_retry; 86 retry = max_retry;
87 } 87 }
88 88
89 var payload = createXmlPayload(task, config.globals.userid, config.globals.password); 89 var payload = createXmlPayload(task, config.globals.userid, config.globals.password);
90 90
91 var partner = url.parse(config.h2h_out.partner); 91 var partner = url.parse(config.h2h_out.partner);
92 92
93 var request_options = { 93 var request_options = {
94 host: partner.hostname, 94 host: partner.hostname,
95 path: partner.path, 95 path: partner.path,
96 port: partner.port, 96 port: partner.port,
97 method: "POST", 97 method: "POST",
98 headers: { 98 headers: {
99 'Content-Type': 'text/xml', 99 'Content-Type': 'text/xml',
100 'Content-Length': Buffer.byteLength(payload) 100 'Content-Length': Buffer.byteLength(payload)
101 } 101 }
102 }; 102 };
103 103
104 var buffer = ""; 104 var buffer = "";
105 105
106 logger.info('Requesting to partner', {request_options: request_options}); 106 logger.info('Requesting to partner', {request_options: request_options});
107 107
108 var req = http.request(request_options, function( res ) { 108 var req = http.request(request_options, function( res ) {
109 109
110 logger.info('Status code: ' + res.statusCode ); 110 logger.info('Status code: ' + res.statusCode );
111 var buffer = ""; 111 var buffer = "";
112 res.on( "data", function( data ) { buffer = buffer + data; } ); 112 res.on( "data", function( data ) { buffer = buffer + data; } );
113 res.on( "end", function( data ) { 113 res.on( "end", function( data ) {
114 //directResponseHandler(buffer, task); 114 //directResponseHandler(buffer, task);
115 logger.info('Got direct response from partner', {resp: buffer}); 115 logger.info('Got direct response from partner', {resp: buffer});
116 }); 116 });
117 117
118 }); 118 });
119 119
120 req.on('error', function(e) { 120 req.on('error', function(e) {
121 logger.warn('problem with request: ' + e.message); 121 logger.warn('problem with request: ' + e.message);
122 callbackReport(task.requestId, '68', e.message); 122 callbackReport(task.requestId, '68', e.message);
123 return; 123 return;
124 }); 124 });
125 125
126 logger.verbose('Sending payload to partner', {payload: payload}); 126 logger.verbose('Sending payload to partner', {payload: payload});
127 req.write( payload ); 127 req.write( payload );
128 req.end(); 128 req.end();
129 } 129 }
130 130
131 function directResponseHandler(body, task) { 131 function directResponseHandler(body, task) {
132 132
133 logger.info('Got direct response'); 133 logger.info('Got direct response');
134 134
135 xml2js(body, function (err, result) { 135 xml2js(body, function (err, result) {
136 if (err) { 136 if (err) {
137 logger.warn('Error parsing xml', {body: body}); 137 logger.warn('Error parsing xml', {body: body});
138 callbackReport(request_id, '68', buffer); 138 callbackReport(request_id, '68', buffer);
139 return; 139 return;
140 } 140 }
141 141
142 logger.info('Direct response parsed', {result: result}); 142 logger.info('Direct response parsed', {result: result});
143 143
144 var response_code = '68'; 144 var response_code = '68';
145 145
146 var request_id = result.evoucher.partner_trxid[0].trim(); 146 var request_id = result.evoucher.partner_trxid[0].trim();
147 var message = result.evoucher.message[0].trim(); 147 var message = result.evoucher.message[0].trim();
148 var status = result.evoucher.result[0].trim(); 148 var status = result.evoucher.result[0].trim();
149 149
150 if (status === 'failed') { 150 if (status === 'failed') {
151 response_code = '40'; 151 response_code = '40';
152 152
153 var new_response_code = responseCodeFromMessage(message); 153 var new_response_code = responseCodeFromMessage(message);
154 if (new_response_code) { 154 if (new_response_code) {
155 response_code = new_response_code; 155 response_code = new_response_code;
156 } 156 }
157 157
158 } 158 }
159 159
160 callbackReport(request_id, response_code, message); 160 callbackReport(request_id, response_code, message);
161 }); 161 });
162 } 162 }
163 163
164 export.start = start; 164 exports.start = start;
165 exports.topupRequest = topupRequest;
165 166