var http = require('http'); var url = require('url'); var math = require('mathjs'); var xml = require('xml'); var xml2js = require('xml2js').parseString; var strftime = require('strftime'); var xor = require('base64-xor'); var request = require('request'); var config; var callbackReport; var max_retry = 2; var sleep_before_retry = 2000; function calculateSignature(userid, password, msisdn, timestamp) { var a = msisdn.substr(msisdn.length - 4) + timestamp; console.log(a); var b = userid.substr(0, 4) + password; console.log(b); return xor.encode(a,b); } function createPayload(task) { var timestamp = strftime('%H%M%S'); var payload = { datacell: [ { perintah: 'charge'}, {oprcode: task['remoteProduct']}, {userid: config.h2h_out.userid}, {time: timestamp}, {msisdn: task['destination']}, {ref_trxid: task['requestId']}, {sgn: calculateSignature(config.h2h_out.userid, config.h2h_out.password, task['destination'], timestamp)} ] }; console.log(payload); return "<?xml version=\"1.0\" ?>\n" + xml(payload); } 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 payload_xml = createPayload(task); console.log(payload_xml); var postRequest = { host: "202.152.62.2", path: "/RELOAD97.php", port: 7713, method: "POST", headers: { 'Content-Type': 'text/xml', 'Content-Length': Buffer.byteLength(payload_xml) } }; var buffer = ""; var req = http.request( postRequest, function( res ) { console.log('Status code: ' + res.statusCode ); var buffer = ""; res.on( "data", function( data ) { buffer = buffer + data; } ); res.on( "end", function( data ) { topupResponseHandler(buffer); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); req.write( payload_xml ); req.end(); } function topupResponseHandler(body, request_id) { xml2js(body, function (err, result) { if (err) { console.log(body); callbackReport(request_id, '40', buffer); return; } console.log(result); request_id = result.datacell.ref_trxid[0].trim(); var response_code = '68'; var message = result.datacell.message[0].trim(); if (result.datacell.resultcode[0] == '999') { response_code = '40'; if (message.indexOf('Nomor tujuan salah') >= 0) { response_code = '14'; } } callbackReport(request_id, response_code, message); }); } function createServer() { var httpServer = http.createServer(function(req, res) { console.log('Got request from partner ("' + req.url + '")'); var body = ""; req.on('data', function (chunk) { body += chunk; }); req.on('end', function () { res.writeHead(200); res.end('OK'); console.log(body); topupResponseHandler(body); }); }); httpServer.listen(config.h2h_out.listen_port, function() { console.log('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); }); } function start(_config, _callbackReport) { config = _config; callbackReport = _callbackReport createServer(); } exports.start = start; exports.topupRequest = topupRequest;