Commit 77d71adf18e17aaa6b2d4d8983be1b36e04727f4

Authored by Adhidarma Hadiwinoto
1 parent e99d152694
Exists in master

68

Showing 1 changed file with 33 additions and 24 deletions Inline Diff

1 var winston = require('winston'); 1 var winston = require('winston');
2 var request = require('request'); 2 var request = require('request');
3 var xmlrpc = require('xmlrpc'); 3 var xmlrpc = require('xmlrpc');
4 var url = require('url'); 4 var url = require('url');
5 var http = require('http'); 5 var http = require('http');
6 6
7 var max_retry = 3; 7 var max_retry = 3;
8 var sleep_before_retry = 2000; 8 var sleep_before_retry = 2000;
9 9
10 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 10 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
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 createHttpReportServer(); 36 createXMLRPCServer();
37 } 37 }
38 38
39 function createHttpReportServer() { 39 function createXMLRPCServer() {
40 var httpServer = http.createServer(function(request, response) { 40
41 var qs = url.parse(request.url, true).query; 41 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
42 var path = url.parse(request.url).pathname; 42 var serverOptions = {
43 43 port: config.h2h_out.listen_port
44 logger.info('Got reverse report from partner', {path: path, qs: qs}); 44 };
45 response.end('OK'); 45
46 var server = xmlrpc.createServer(serverOptions);
47
48 server.on('NotFound', function (method, params) {
49 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
50 });
51
52 server.on('topUpReport', function (err, params, callback) {
53
54 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
46 55
47 var trxid; 56 var paramscount = params.length;
48 try { 57 for (var i = 0; i < paramscount; i++) {
49 trxid = qs.transid; 58 var value = params[i];
50 } 59
51 catch(err) { 60 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
52 } 61 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
62 }
63
64 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
65 value['RESPONSECODE'] = '40';
66 }
53 67
54 if (trxid) { 68 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
55 logger.info('Requesting advice from webreport', {trxid: trxid})
56 cekstatus.advice({trxid: trxid}, callbackFromWebReport);
57 } 69 }
58 70
59 }); 71 callback(null, 'ACK REPORT OK');
60 72 })
61 httpServer.listen(config.h2h_out.listen_port, function() {
62 logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
63 });
64 } 73 }
65 74
66 function topupRequestHttpGet(task, retry) { 75 function topupRequestHttpGet(task, retry) {
67 76
68 var options = { 77 var options = {
69 method: 'GET', 78 method: 'GET',
70 url: config.h2h_out.partner, 79 url: config.h2h_out.partner,
71 qs: { 80 qs: {
72 id: config.h2h_out.userid, 81 id: config.h2h_out.userid,
73 pin: config.h2h_out.pin, 82 pin: config.h2h_out.pin,
74 user: config.h2h_out.user, 83 user: config.h2h_out.user,
75 pass: config.h2h_put.password, 84 pass: config.h2h_put.password,
76 kodeproduk: task.remoteProduct, 85 kodeproduk: task.remoteProduct,
77 tujuan: task.destination, 86 tujuan: task.destination,
78 idtrx: task.requestId 87 idtrx: task.requestId
79 } 88 }
80 } 89 }
81 90
82 request(options, function(err, res, body) { 91 request(options, function(err, res, body) {
83 }); 92 });
84 } 93 }
85 94
86 function topupRequestXMLRPC(task, retry) { 95 function topupRequestXMLRPC(task, retry) {
87 var partnerUrl = url.parse(config.h2h_out.partner); 96 var partnerUrl = url.parse(config.h2h_out.partner);
88 var clientOptions = { 97 var clientOptions = {
89 host: partnerUrl.hostname 98 host: partnerUrl.hostname
90 , port: partnerUrl.port 99 , port: partnerUrl.port
91 , path: partnerUrl.pathname 100 , path: partnerUrl.pathname
92 }; 101 };
93 logger.info('Preparing XMLRPC client options', {options: clientOptions}); 102 logger.info('Preparing XMLRPC client options', {options: clientOptions});
94 103
95 var client; 104 var client;
96 if (partnerUrl.protocol == 'https:') { 105 if (partnerUrl.protocol == 'https:') {
97 client = xmlrpc.createSecureClient(clientOptions); 106 client = xmlrpc.createSecureClient(clientOptions);
98 } else { 107 } else {
99 client = xmlrpc.createClient(clientOptions); 108 client = xmlrpc.createClient(clientOptions);
100 } 109 }
101 110
102 var params = { 111 var params = {
103 MSISDN: config.h2h_out.userid, 112 MSISDN: config.h2h_out.userid,
104 REQUESTID: task.requestId, 113 REQUESTID: task.requestId,
105 PIN: config.h2h_out.password, 114 PIN: config.h2h_out.password,
106 NOHP: task.destination, 115 NOHP: task.destination,
107 NOM: task.remoteProduct 116 NOM: task.remoteProduct
108 }; 117 };
109 118
110 var methodName = 'topUpRequest'; 119 var methodName = 'topUpRequest';
111 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params}); 120 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
112 121
113 client.methodCall(methodName, [ params ], function (error, value) { 122 client.methodCall(methodName, [ params ], function (error, value) {
114 // Results of the method response 123 // Results of the method response
115 if (error) { 124 if (error) {
116 125
117 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error}); 126 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error});
118 127
119 if (retry) { 128 if (retry) {
120 129
121 logger.info('Retrying topUpRequest (' + retry + ')'); 130 logger.info('Retrying topUpRequest (' + retry + ')');
122 setTimeout(function() { 131 setTimeout(function() {
123 topupRequest(task, retry - 1); 132 topupRequest(task, retry - 1);
124 }, sleep_before_retry); 133 }, sleep_before_retry);
125 134
126 } else { 135 } else {
127 callbackReport(task['requestId'], '68', 'Silahkan resend. Gangguan koneksi ke suplier: ' + error); 136 callbackReport(task['requestId'], '68', 'Silahkan resend. Gangguan koneksi ke suplier: ' + error);
128 } 137 }
129 return; 138 return;
130 } 139 }
131 140
132 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value}); 141 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
133 142
134 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 143 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
135 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 144 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
136 } 145 }
137 146
138 if (value['RESPONSECODE'] != '00') { 147 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
139 value['RESPONSECODE'] = '40'; 148 value['RESPONSECODE'] = '40';
140 } 149 }
141 150
142 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 151 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
143 }); 152 });
144 } 153 }
145 154
146 function topupRequest(task, retry) { 155 function topupRequest(task, retry) {
147 topupRequestXMLRPC(task, retry); 156 topupRequestXMLRPC(task, retry);