partner-datacell.js 3.93 KB
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 ) { 
            
            xml2js(buffer, function (err, result) {
                if (err) {
                    console.log(buffer);
                    callbackReport(task['requestId'], '40', buffer);
                    return;
                }
                
                console.log(result);
                
                var response_code = '68';
                var message = result.datacell.resultcode.message[0].trim();
                if (result.datacell.resultcode[0] == '999') {
                    response_code = '40';
                }
                
                callbackReport(task['requestId'], response_code, message);
            });
            
        });

    });

    req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
    });

    req.write( payload_xml );
    req.end();
}

function createServer() {
    var httpServer = http.createServer(function(req, res) {
        console.log('Got request from partner, url: ' + req.url);
        console.log('REQ:');
        console.log(req);
        res.end('OK');
    });
    
    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;