From c95b7bf57e14e5b06bd885ebeb9aa3c67f2f81b4 Mon Sep 17 00:00:00 2001 From: Adhidarma Hadiwinoto <gua@adhisimon.org> Date: Tue, 16 Jun 2015 18:27:40 +0700 Subject: [PATCH] beta --- httppulsakita.js | 132 +++++++++++++++++++++++++++++++++ index.js | 6 +- package.json | 3 +- test.js | 16 ++++ xmlout.js | 222 ------------------------------------------------------- 5 files changed, 153 insertions(+), 226 deletions(-) create mode 100644 httppulsakita.js delete mode 100644 xmlout.js diff --git a/httppulsakita.js b/httppulsakita.js new file mode 100644 index 0000000..9b0b0ad --- /dev/null +++ b/httppulsakita.js @@ -0,0 +1,132 @@ +var url = require('url'); +var math = require('mathjs'); +var request = require('request'); +var xml = require("xml2js").parseString; + +var config; +var callbackReport; + +var max_retry = 3; +var sleep_before_retry = 3000; + +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + +function topupRequest(task, retry) { + if (config.globals.requests_count == undefined) { + config.globals.requests_count = 1; + } else { + config.globals.requests_count++; + } + + if (config.globals.active_requests_count == undefined) { + config.globals.active_requests_count = 1; + } else { + config.globals.active_requests_count++; + } + + if (config.globals.max_active_requests_count == undefined) { + config.globals.max_active_requests_count = config.globals.active_requests_count; + } else { + config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); + } + + + if (retry === undefined) { + retry = max_retry; + } + + var params = { + userid: config.h2h_out.userid, + pwd: config.h2h_out.password, + memberreff: task['requestId'], + produk: task['remoteProduct'], + tujuan: task['destination'] + }; + console.log('PARAMS:'); + console.log(params); + + request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { + + if (error) { + console.log('HTTP Request Error (' + task['requestId'] + '): '); + console.log(error); + + if (retry) { + + console.log('Retrying trx hit (' + retry + ')'); + setTimeout(function() { + topupRequest(task, retry - 1); + }, sleep_before_retry); + + } else { + callbackReport(task['requestId'], '54', 'Gangguan koneksi ke suplier'); + } + return; + } + + console.log('Server Response: '); + console.log(httpResponseBody); + + xml(httpResponseBody, function(err, result) { + if (err) { + console.log('Gagal parsing XML respon server'); + topupRequest(task, retry - 1); + return; + } + + var response_code = result.respon.rc.replace(/^00/, ''); + var token = result.respon.token; + var data = result.respon.data.replace(/ /g, '-'); + var sn = token + '/' + data; + + var message = result.respon.pesan.replace(/\n/g, ' '); + message = 'SN=' + sn + '; ' + message; + + callbackReport(task['requestId'], response_code, message); + + }); + }); +} + +function start(_config, _callbackReport) { + config = _config; + callbackReport = _callbackReport +} + +function parseSN(message) { + var sn_regex = new RegExp(config.h2h_out.sn_pattern); + var sn_match = message.match(sn_regex); + + //console.log('SN MATCH:'); + //console.log(sn_match); + + if (sn_match <= 0) { + console.log('SN Not found: ' + message); + return ''; + } + + var sn = sn_match[0]; + var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator); + //console.log('SN REMOVE PATTERNS:'); + //console.log (sn_remove_patterns); + + var count = sn_remove_patterns.length; + + for(var i = 0; i < count; i++) { + sn = sn.replace(sn_remove_patterns[i], ''); + } + + return sn.trim(); +} + +function parseResult(message) { + var data; + xml(message, function(err, result) { + data = result; + }); + return data; +} + +exports.start = start; +exports.topupRequest = topupRequest; +exports.parseResult = parseResult; diff --git a/index.js b/index.js index 70985ec..6b1b2dd 100644 --- a/index.js +++ b/index.js @@ -7,7 +7,7 @@ HttpServer = require('./httpserver.js'); var httpServer = HttpServer.start(config); var aaa = require('./aaa.js'); -var xmlout = require('./xmlout.js'); +var partner = require('./httppulsakita.js'); -xmlout.start(config, aaa.callbackReport); -aaa.start(config, xmlout); +partner.start(config, aaa.callbackReport); +aaa.start(config, partner); diff --git a/package.json b/package.json index 1f5e943..1299997 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "strftime": "~0.9.2", "iniparser": "~1.0.5", "mathjs": "~1.7.0", - "xmlrpc": "~1.3.1" + "xmlrpc": "~1.3.1", + "xml2js": "~0.4.9" } } diff --git a/test.js b/test.js index 7510e8e..46a97e3 100644 --- a/test.js +++ b/test.js @@ -31,3 +31,19 @@ describe('aaa', function() { }); }); + +describe('aaa', function() { + var partner = require('./httppulsakita'); + + describe("#parseResult()", function() { + message = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><respon><tanggal>2015/6/16 15:43:35</tanggal><idagen>P0039</idagen><refid>AEE15B32987941D89FFF4BC7EF676C13</refid><produk>PLN20</produk><tujuan>14204279369</tujuan><rc>0000</rc><data> </data><token> </token><pesan>#14836 PLN20 ke:14204279369 SUKSES. SN:3520-2887-6627-6699-4826/TestDummyPanjang6955555/P1/7000VA/32,4. \ +Sisa saldo Rp. 5,000,000 - Rp. 18,700 = Rp. 4,981,300</pesan></respon>'; + + data = partner.parseResult(message); + console.log(data); + + it('should return 2015/6/16 15:43:35', function() { + assert.equal('2015/6/16 15:43:35', data.respon.tanggal); + }); + }); +}); diff --git a/xmlout.js b/xmlout.js deleted file mode 100644 index 4534183..0000000 --- a/xmlout.js +++ /dev/null @@ -1,222 +0,0 @@ -var xmlrpc = require('xmlrpc'); -var url = require('url'); -var math = require('mathjs'); - -var config; -var callbackReport; - -var max_retry = 2; -var sleep_before_retry = 2000; - -process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; - -function topupRequest(task, retry) { - if (config.globals.requests_count == undefined) { - config.globals.requests_count = 1; - } else { - config.globals.requests_count++; - } - - if (config.globals.active_requests_count == undefined) { - config.globals.active_requests_count = 1; - } else { - config.globals.active_requests_count++; - } - - if (config.globals.max_active_requests_count == undefined) { - config.globals.max_active_requests_count = config.globals.active_requests_count; - } else { - config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); - } - - - if (retry === undefined) { - retry = max_retry; - } - - var partnerUrl = url.parse(config.h2h_out.partner); - var clientOptions = { - host: partnerUrl.hostname - , port: partnerUrl.port - , path: partnerUrl.pathname - }; - console.log('XMLRPC client options:'); - console.log(clientOptions); - - var client; - if (partnerUrl.protocol == 'https:') { - console.log('Use SSL'); - client = xmlrpc.createSecureClient(clientOptions); - } else { - console.log('Not using SSL'); - client = xmlrpc.createClient(clientOptions); - } - - var methodName = 'topUpRequest'; - console.log('methodName: ' + methodName); - - var params = { - MSISDN: config.h2h_out.userid, - REQUESTID: task['requestId'], - PIN: config.h2h_out.password, - NOHP: task['destination'], - NOM: task['remoteProduct'] - }; - console.log('PARAMS:'); - console.log(params); - - - client.methodCall(methodName, [ params ], function (error, value) { - - if (config.globals.active_requests_count == undefined) { - config.globals.active_requests_count = 0; - } else { - config.globals.active_requests_count--; - } - - // Results of the method response - if (error) { - console.log('XMLRPC Client Error (' + task['requestId'] + '): '); - console.log(error); - - if (retry) { - - console.log('Retrying topUpRequest (' + retry + ')'); - setTimeout(function() { - topupRequest(task, retry - 1); - }, sleep_before_retry); - - } else { - callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier'); - } - return; - } - - console.log('Method response for \'' + methodName + '\': ') - console.log(value); - - if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { - value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; - //console.log('Message with SN: ' + value['MESSAGE']); - } - - callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); - }); -} - -function createServer() { - - console.log('Creating XML-RPC server on port ' + config.h2h_out.listen_port); - var serverOptions = { - port: config.h2h_out.listen_port - }; - - var server = xmlrpc.createServer(serverOptions); - - server.on('NotFound', function (method, params) { - console.log(method + ' is not found on our XML-RPC server'); - console.log('params:'); - console.log(params); - }); - - server.on('topUpReport', function (err, params, callback) { - console.log('RECEIVE topUpReport, params:'); - console.log(params); - - var paramscount = params.length; - for (var i = 0; i < paramscount; i++) { - var value = params[i]; - - if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { - value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; - //console.log('Message with SN: ' + value['MESSAGE']); - } - - callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); - } - - callback(null, 'ACK REPORT OK'); - }) - -} - -function checkStatus(task) { - var partnerUrl = url.parse(config.h2h_out.partner); - var clientOptions = { - host: partnerUrl.hostname - , port: partnerUrl.port - , path: partnerUrl.pathname - }; - console.log('XMLRPC client options:'); - console.log(clientOptions); - - var client; - if (partnerUrl.protocol == 'https:') { - console.log('Use SSL'); - client = xmlrpc.createSecureClient(clientOptions); - } else { - console.log('Not using SSL'); - client = xmlrpc.createClient(clientOptions); - } - - var methodName = 'topUpInquiry'; - console.log('methodName: ' + methodName); - - var params = { - MSISDN: config.h2h_out.userid, - REQUESTID: task['requestId'], - PIN: config.h2h_out.password, - NOHP: task['destination'] - }; - console.log('PARAMS:'); - console.log(params); - - client.methodCall(methodName, [ params ], function (error, value) { - // Results of the method response - if (error) { - console.log('Error: '); - console.log(error); - return; - } - console.log('Method response for \'' + methodName + '\': ') - console.log(value); - - callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); - }); -} - -function start(_config, _callbackReport) { - config = _config; - callbackReport = _callbackReport - - createServer(); -} - -function parseSN(message) { - var sn_regex = new RegExp(config.h2h_out.sn_pattern); - var sn_match = message.match(sn_regex); - - //console.log('SN MATCH:'); - //console.log(sn_match); - - if (sn_match <= 0) { - console.log('SN Not found: ' + message); - return ''; - } - - var sn = sn_match[0]; - var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator); - //console.log('SN REMOVE PATTERNS:'); - //console.log (sn_remove_patterns); - - var count = sn_remove_patterns.length; - - for(var i = 0; i < count; i++) { - sn = sn.replace(sn_remove_patterns[i], ''); - } - - return sn.trim(); -} - -exports.start = start; -exports.topupRequest = topupRequest; -- 1.9.0