diff --git a/partner-cjk.js b/partner-cjk.js index 71c8d61..66223ac 100644 --- a/partner-cjk.js +++ b/partner-cjk.js @@ -19,10 +19,10 @@ function initMongoClient() { if (!config.mongodb || !config.mongodb.url) { return; } - + try { var url = config.mongodb.url; - + mongoClient.connect(url, function(err, db) { if (err) { logger.warn('Failed to connect to mongodb', {err: err}); @@ -34,7 +34,7 @@ function initMongoClient() { } catch(err) { logger.warn('Exception when connecting to mongodb', {err: err, url: url}); - } + } } var maxRetry = 10; @@ -43,11 +43,11 @@ var sleepBeforeRetry = 30; function start(_config, _callbackReport, options) { config = _config; callbackReport = _callbackReport - + if (options && options.aaa) { aaa = options.aaa; } - + if (options && options.logger) { logger = options.logger; } else { @@ -57,7 +57,7 @@ function start(_config, _callbackReport, options) { ] }); } - + initMongoClient(); } @@ -65,12 +65,12 @@ function calculateSignature(params) { var passwordHash = crypto.createHash('sha1').update(params.password).digest().toString('hex'); var plain = params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid + passwordHash; var signature = crypto.createHash('sha256').update(plain).digest().toString('hex'); - + try { logger.verbose('Signature calculated', {plain: plain, signature: signature}); } catch(err) {} - + return signature; } @@ -86,18 +86,18 @@ function createXmlPayload(params) { {hash: calculateSignature(params)} ] }); - + try { logger.verbose("Payload: " + payload); } catch(errLog) {} - + return payload; } function insertTaskToMongoDb(task) { if (!isMongoReady()) { return; } - + task.supplier = config.globals.gateway_name; - + try { mongodb.collection(config.mongodb.collection).insertOne(task); } @@ -108,7 +108,7 @@ function insertTaskToMongoDb(task) { function pushResponseToMongoDb(task, response) { if (!isMongoReady()) { return; } - + try { mongodb.collection(config.mongodb.collection).updateOne( {requestId: task.requestId}, @@ -138,7 +138,7 @@ function isMongoReady() { if (!config.mongodb) { return; } if (!config.mongodb.collection) { return; } if (!mongodb) { return; } - + return true; } @@ -157,7 +157,7 @@ function getSNFromMessage(message) { function hasSuccessKeywords(message) { var keywords = ['SUKSES', 'Finish']; - + var count = keywords.length; for (var i=0; i < count; i++) { if (message.indexOf(keywords[i]) >= 0) { @@ -171,9 +171,10 @@ function supplierRcToST24Rc(rc) { var rcs = { '0001': '40', '0012': '40', // hash data tidak sesuai + '0015': '40', // saldo tidak cukup '0019': '13', // produk tidak tersedia } - + if (rcs[rc]) { return rcs[rc]; } else { @@ -191,57 +192,57 @@ function getSNFromResponseObject(respObj) { } function topupResponseHandler(body, task) { - + //logger.info('Got reply from partner', {body: body}); - + xml2js(body, function(err, result) { var ts = strftime('%Y-%m-%d %H:%M:%S', new Date()); - + if (err) { logger.warn('Got invalid XML from partner', {err: err, body: body, task: task}); callbackReport(task.requestId, '68', body); - + pushResponseToMongoDb(task, {ts: ts, supplier: config.globals.gateway_name, raw: body}); return; } logger.info('XML message from partner', {result: result}); pushResponseToMongoDb(task, {ts: ts, supplier: config.globals.gateway_name, raw: body, parsed: result}); - + var rc = '68'; var message = result.ciwaru.msg[0]; - + if (message.toUpperCase().indexOf('PENDING') >= 0) { rc = '68'; } else if (hasSuccessKeywords(message)) { - + var sn = getSNFromResponseObject(result); - + if (!sn) { sn = getSNFromMessage(message); } - + message = 'SN=' + sn + '; ' + message; rc = '00'; - + } else if (message.indexOf('Nomor Pelanggan Salah') >= 0) { - + rc = '14'; - + } else { rc = supplierRcToST24Rc(result.ciwaru.rc[0]); if (!rc) { rc = '68'; } } - + if ((task.retry == maxRetry) || (rc != '68')) { callbackReport(task.requestId, rc, message); } else { logger.info('Not reporting to AAA for duplicate 68', {task: task}); } - + if (rc == '68') { topupRequestRetry(task); } @@ -250,7 +251,7 @@ function topupResponseHandler(body, task) { function topupRequestRetry(task) { task.retry--; - + if (task.retry > 0) { logger.info('Retrying in ' + sleepBeforeRetry + 's'); setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); @@ -261,23 +262,23 @@ function topupRequestRetry(task) { } function topupRequest(task, retry) { - + if (retry === undefined) { - + task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); - + insertTaskToMongoDb(task); - + retry = maxRetry; } - + if (!task.retry) { task.retry = retry; } var remoteProduct = task.remoteProduct.split(','); - + var params = { trxtype: '01', prdcode: remoteProduct[0], @@ -287,9 +288,9 @@ function topupRequest(task, retry) { uid: config.h2h_out.userid, password: config.h2h_out.password, }; - + var postBody = createXmlPayload(params); - + var partnerUrl = url.parse(config.h2h_out.partner); var postRequest = { host: partnerUrl.hostname, @@ -301,27 +302,27 @@ function topupRequest(task, retry) { 'Content-Length': Buffer.byteLength(postBody) } }; - + logger.info('POST to partner', {postRequest: postRequest}); var req = http.request(postRequest, function( res ) { - + logger.verbose('Status code: ' + res.statusCode ); var buffer = ""; - - res.on( "data", function( data ) { - buffer = buffer + data; + + res.on( "data", function( data ) { + buffer = buffer + data; }); - - res.on( "end", function( data ) { + + res.on( "end", function( data ) { topupResponseHandler(buffer, task); }); - + }); - + req.on('error', function(e) { logger.warn('problem with request: ' + e.message); callbackReport(task['requestId'], '68', e.message); - + topupRequestRetry(task); });