Commit 27c02628e1a4ada09b666ef2e0ad86e06ef96566

Authored by Adhidarma Hadiwinoto
1 parent 7aac5a1006
Exists in master

hapus topupRequestHttpGet

Showing 1 changed file with 0 additions and 20 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 var mongoClient = require('mongodb').MongoClient; 6 var mongoClient = require('mongodb').MongoClient;
7 var strftime = require('strftime'); 7 var strftime = require('strftime');
8 var moment = require('moment'); 8 var moment = require('moment');
9 9
10 var max_retry = 6; 10 var max_retry = 6;
11 var sleep_before_retry = 10000; 11 var sleep_before_retry = 10000;
12 12
13 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 13 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
14 14
15 var config; 15 var config;
16 var callbackReport; 16 var callbackReport;
17 var aaa; 17 var aaa;
18 var logger; 18 var logger;
19 var options; 19 var options;
20 var mongodb; 20 var mongodb;
21 21
22 function start(_config, _callbackReport, options) { 22 function start(_config, _callbackReport, options) {
23 config = _config; 23 config = _config;
24 callbackReport = _callbackReport 24 callbackReport = _callbackReport
25 25
26 if (options && options.aaa) { 26 if (options && options.aaa) {
27 aaa = options.aaa; 27 aaa = options.aaa;
28 } 28 }
29 29
30 if (options && options.logger) { 30 if (options && options.logger) {
31 logger = options.logger; 31 logger = options.logger;
32 } else { 32 } else {
33 logger = new winston.Logger({ 33 logger = new winston.Logger({
34 transports: [ 34 transports: [
35 new (winston.transports.Console)() 35 new (winston.transports.Console)()
36 ] 36 ]
37 }); 37 });
38 } 38 }
39 39
40 createXMLRPCServer(); 40 createXMLRPCServer();
41 initMongoClient(); 41 initMongoClient();
42 } 42 }
43 43
44 function createXMLRPCServer() { 44 function createXMLRPCServer() {
45 45
46 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 46 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
47 var serverOptions = { 47 var serverOptions = {
48 port: config.h2h_out.listen_port 48 port: config.h2h_out.listen_port
49 }; 49 };
50 50
51 var server = xmlrpc.createServer(serverOptions); 51 var server = xmlrpc.createServer(serverOptions);
52 52
53 server.on('NotFound', function (method, params) { 53 server.on('NotFound', function (method, params) {
54 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 54 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
55 }); 55 });
56 56
57 server.on('topUpReport', function (err, params, callback) { 57 server.on('topUpReport', function (err, params, callback) {
58 58
59 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 59 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
60 60
61 var paramscount = params.length; 61 var paramscount = params.length;
62 for (var i = 0; i < paramscount; i++) { 62 for (var i = 0; i < paramscount; i++) {
63 var value = params[i]; 63 var value = params[i];
64 64
65 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 65 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
66 var dummyTask = { requestId: value.REQUESTID }; 66 var dummyTask = { requestId: value.REQUESTID };
67 67
68 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 68 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
69 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 69 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
70 } 70 }
71 71
72 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 72 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
73 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']); 73 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']);
74 } 74 }
75 75
76 pushResponseToMongoDb(dummyTask, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']); 76 pushResponseToMongoDb(dummyTask, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
77 77
78 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 78 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
79 } 79 }
80 80
81 callback(null, 'ACK REPORT OK'); 81 callback(null, 'ACK REPORT OK');
82 }) 82 })
83 } 83 }
84 84
85 function getResponseCodeByMessage(msg) { 85 function getResponseCodeByMessage(msg) {
86 if (msg.indexOf("Trx XL-AXIS NO SALAH") >= 0) { 86 if (msg.indexOf("Trx XL-AXIS NO SALAH") >= 0) {
87 return '14'; 87 return '14';
88 } 88 }
89 else if (msg.indexOf("gagal Nomer salah/Nomer Belum Aktif") >= 0) { 89 else if (msg.indexOf("gagal Nomer salah/Nomer Belum Aktif") >= 0) {
90 return '14'; 90 return '14';
91 } 91 }
92 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) { 92 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) {
93 return '14'; 93 return '14';
94 } 94 }
95 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) { 95 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) {
96 return '14'; 96 return '14';
97 } 97 }
98 else { 98 else {
99 return '40' 99 return '40'
100 } 100 }
101 } 101 }
102 102
103 function topupRequestHttpGet(task, retry) {
104
105 var options = {
106 method: 'GET',
107 url: config.h2h_out.partner,
108 qs: {
109 id: config.h2h_out.userid,
110 pin: config.h2h_out.pin,
111 user: config.h2h_out.user,
112 pass: config.h2h_put.password,
113 kodeproduk: task.remoteProduct,
114 tujuan: task.destination,
115 idtrx: task.requestId
116 }
117 }
118
119 request(options, function(err, res, body) {
120 });
121 }
122
123 function topupRequestXMLRPC(task, retry) { 103 function topupRequestXMLRPC(task, retry) {
124 var partnerUrl = url.parse(config.h2h_out.partner); 104 var partnerUrl = url.parse(config.h2h_out.partner);
125 var clientOptions = { 105 var clientOptions = {
126 host: partnerUrl.hostname 106 host: partnerUrl.hostname
127 , port: partnerUrl.port 107 , port: partnerUrl.port
128 , path: partnerUrl.pathname 108 , path: partnerUrl.pathname
129 }; 109 };
130 logger.info('Preparing XMLRPC client options', {options: clientOptions}); 110 logger.info('Preparing XMLRPC client options', {options: clientOptions});
131 111
132 var client; 112 var client;
133 if (partnerUrl.protocol == 'https:') { 113 if (partnerUrl.protocol == 'https:') {
134 client = xmlrpc.createSecureClient(clientOptions); 114 client = xmlrpc.createSecureClient(clientOptions);
135 } else { 115 } else {
136 client = xmlrpc.createClient(clientOptions); 116 client = xmlrpc.createClient(clientOptions);
137 } 117 }
138 118
139 var params = { 119 var params = {
140 MSISDN: config.h2h_out.userid, 120 MSISDN: config.h2h_out.userid,
141 REQUESTID: task.requestId, 121 REQUESTID: task.requestId,
142 PIN: config.h2h_out.password, 122 PIN: config.h2h_out.password,
143 NOHP: task.destination, 123 NOHP: task.destination,
144 NOM: task.remoteProduct 124 NOM: task.remoteProduct
145 }; 125 };
146 126
147 var methodName = 'topUpRequest'; 127 var methodName = 'topUpRequest';
148 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params}); 128 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
149 129
150 client.methodCall(methodName, [ params ], function (error, value) { 130 client.methodCall(methodName, [ params ], function (error, value) {
151 // Results of the method response 131 // Results of the method response
152 if (error) { 132 if (error) {
153 133
154 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error}); 134 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error});
155 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 135 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
156 var dummyValue = { 136 var dummyValue = {
157 MESSAGE: 'GENERATED: XMLRPC Client Error. ' + error, 137 MESSAGE: 'GENERATED: XMLRPC Client Error. ' + error,
158 RESPONSECODE: '68', 138 RESPONSECODE: '68',
159 REQUESTID: task.requestId, 139 REQUESTID: task.requestId,
160 } 140 }
161 141
162 try { 142 try {
163 dummyValue.HTTP_STATUS = error.res && error.res.statusCode; 143 dummyValue.HTTP_STATUS = error.res && error.res.statusCode;
164 dummyValue.RESPONSEBODY = error.body; 144 dummyValue.RESPONSEBODY = error.body;
165 } 145 }
166 catch(errRB) {} 146 catch(errRB) {}
167 147
168 if (retry) { 148 if (retry) {
169 149
170 dummyValue.MESSAGE = dummyValue.MESSAGE + '. Retrying (' + retry + ')'; 150 dummyValue.MESSAGE = dummyValue.MESSAGE + '. Retrying (' + retry + ')';
171 logger.info(dummyValue.MESSAGE); 151 logger.info(dummyValue.MESSAGE);
172 setTimeout(function() { 152 setTimeout(function() {
173 topupRequest(task, retry - 1); 153 topupRequest(task, retry - 1);
174 }, sleep_before_retry); 154 }, sleep_before_retry);
175 155
176 } else { 156 } else {
177 callbackReport(task['requestId'], '68', 'GENERATED: Silahkan resend. Gangguan koneksi ke suplier: ' + error); 157 callbackReport(task['requestId'], '68', 'GENERATED: Silahkan resend. Gangguan koneksi ke suplier: ' + error);
178 } 158 }
179 159
180 pushResponseToMongoDb( 160 pushResponseToMongoDb(
181 task, 161 task,
182 { 162 {
183 ts: responseTs, 163 ts: responseTs,
184 supplier: config.globals.gateway_name, 164 supplier: config.globals.gateway_name,
185 raw: JSON.stringify(dummyValue), 165 raw: JSON.stringify(dummyValue),
186 parsed: dummyValue 166 parsed: dummyValue
187 }, 167 },
188 '68' 168 '68'
189 ); 169 );
190 return; 170 return;
191 } 171 }
192 172
193 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value}); 173 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
194 174
195 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 175 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
196 176
197 /* 177 /*
198 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 178 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
199 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 179 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
200 } 180 }
201 */ 181 */
202 182
203 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 183 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
204 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']); 184 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']);
205 } 185 }
206 186
207 /* 187 /*
208 if (value['RESPONSECODE'] != '00') { 188 if (value['RESPONSECODE'] != '00') {
209 try { 189 try {
210 value['MESSAGE'] = value['MESSAGE'].replace(/\.;/, ';'); 190 value['MESSAGE'] = value['MESSAGE'].replace(/\.;/, ';');
211 } 191 }
212 catch(errReplaceDot) { } 192 catch(errReplaceDot) { }
213 193
214 } 194 }
215 */ 195 */
216 196
217 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']); 197 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
218 198
219 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 199 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
220 }); 200 });
221 } 201 }
222 202
223 function topupRequest(task, retry) { 203 function topupRequest(task, retry) {
224 if (retry === undefined || retry === null) { 204 if (retry === undefined || retry === null) {
225 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); 205 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
226 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); 206 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
227 207
228 retry = max_retry; 208 retry = max_retry;
229 209
230 insertTaskToMongoDb(task); 210 insertTaskToMongoDb(task);
231 } 211 }
232 212
233 topupRequestXMLRPC(task, retry); 213 topupRequestXMLRPC(task, retry);
234 } 214 }
235 215
236 function initMongoClient() { 216 function initMongoClient() {
237 if (!config.mongodb || !config.mongodb.url) { 217 if (!config.mongodb || !config.mongodb.url) {
238 return; 218 return;
239 } 219 }
240 220
241 try { 221 try {
242 var url = config.mongodb.url; 222 var url = config.mongodb.url;
243 223
244 mongoClient.connect(url, function(err, db) { 224 mongoClient.connect(url, function(err, db) {
245 if (err) { 225 if (err) {
246 logger.warn('Failed to connect to mongodb', {err: err}); 226 logger.warn('Failed to connect to mongodb', {err: err});
247 return; 227 return;
248 } 228 }
249 mongodb = db; 229 mongodb = db;
250 logger.info('MongoDB connected'); 230 logger.info('MongoDB connected');
251 }); 231 });
252 } 232 }
253 catch(err) { 233 catch(err) {
254 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 234 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
255 } 235 }
256 } 236 }
257 237
258 function isMongoReady() { 238 function isMongoReady() {
259 if (!config.mongodb) { return; } 239 if (!config.mongodb) { return; }
260 if (!config.mongodb.collection) { return; } 240 if (!config.mongodb.collection) { return; }
261 if (!mongodb) { return; } 241 if (!mongodb) { return; }
262 242
263 return true; 243 return true;
264 } 244 }
265 245
266 function insertTaskToMongoDb(task) { 246 function insertTaskToMongoDb(task) {
267 if (!isMongoReady()) { return; } 247 if (!isMongoReady()) { return; }
268 248
269 task.supplier = config.globals.gateway_name; 249 task.supplier = config.globals.gateway_name;
270 task.rc = '68'; 250 task.rc = '68';
271 251
272 try { 252 try {
273 mongodb.collection(config.mongodb.collection).insertOne(task); 253 mongodb.collection(config.mongodb.collection).insertOne(task);
274 } 254 }
275 catch(err) { 255 catch(err) {
276 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task}); 256 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
277 } 257 }
278 } 258 }
279 259
280 function pushResponseToMongoDb(task, response, rc) { 260 function pushResponseToMongoDb(task, response, rc) {
281 if (!isMongoReady()) { return; } 261 if (!isMongoReady()) { return; }
282 262
283 try { 263 try {
284 mongodb.collection(config.mongodb.collection).updateOne( 264 mongodb.collection(config.mongodb.collection).updateOne(
285 {requestId: task.requestId}, 265 {requestId: task.requestId},
286 { 266 {
287 $set: { 267 $set: {
288 lastResponse: response, 268 lastResponse: response,
289 supplier: config.globals.gateway_name, 269 supplier: config.globals.gateway_name,
290 rc: rc 270 rc: rc
291 }, 271 },
292 $push: { 272 $push: {
293 responses: response 273 responses: response
294 } 274 }
295 }, 275 },
296 function(err, result) { 276 function(err, result) {
297 if (err) { 277 if (err) {
298 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response}); 278 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
299 return; 279 return;
300 } 280 }
301 } 281 }
302 ); 282 );
303 } 283 }
304 catch(err) { 284 catch(err) {
305 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response}); 285 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
306 } 286 }
307 } 287 }
308 288
309 exports.start = start; 289 exports.start = start;
310 exports.topupRequest = topupRequest; 290 exports.topupRequest = topupRequest;
311 291