var winston = require('winston'); var crypto = require('crypto'); var xml = require('xml'); var url = require('url'); var config; var callbackReport; var aaa; var logger; var options; function start(_config, _callbackReport, options) { config = _config; callbackReport = _callbackReport if (options && options.aaa) { aaa = options.aaa; } if (options && options.logger) { logger = options.logger; } else { logger = new winston.Logger({ transports: [ new (winston.transports.Console)() ] }); } } function calculateSignature(params) { return crypto.createHash('sha256').update( params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid ).digest().toString('hex'); } function createXmlPayload(params) { return "<?xml version=\"1.0\" ?>\n" + xml({ ciwaru: [ {trxtype: params.trxtype}, {prdcode: params.prdcode}, {value: params.value}, {msisdn: params.msisdn}, {trxid: params.trxid}, {uid: params.uid}, {hash: calculateSignature(params)} ] }); } function getSNFromMessage(message) { var sn_match = message.match(/SN (\w+) /); return sn_match[1]; } function topupResponseHandler(body) { logger.info('Got reply from partner', {body: body}); xml2js(body, function(err, result) { if (err) { logger.warn('XML parsing error', {err: err}); } logger.info('XML message from partner', {result: result}); }); } function topupRequest(task, retry) { var remoteProduct = task.remoteProduct.split(','); var params = { trxtype: '01', prdcode: remoteProduct[0], value: remoteProduct[1], msisdn: task.destination, trxid: task.requestId, uid: config.h2h_out.userid, }; var postBody = createXmlPayload(params); var partnerUrl = url.parse(config.h2h_out.partner); var postRequest = { host: partnerUrl.hostname, path: partnerUrl.path, port: partnerUrl.port, method: "POST", headers: { 'Content-Type': 'text/xml', 'Content-Length': Buffer.byteLength(postBody) } }; logger.info('POST to partner', {postRequest: postRequest}); var req = http.request(postRequest, function( res ) { logger.info('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) { logger.warn('problem with request: ' + e.message); callbackReport(task['requestId'], '40', e.message); }); req.write(postBody); req.end(); } exports.start = start; exports.topupRequest = topupRequest; exports.calculateSignature = calculateSignature; exports.createXmlPayload = createXmlPayload; exports.getSNFromMessage = getSNFromMessage;