Blame view
partner-datacell.js
5.39 KB
d2933ca99
|
1 |
var http = require('http'); |
ff32317e9
|
2 3 4 |
var url = require('url'); var math = require('mathjs'); var xml = require('xml'); |
f53f2def0
|
5 |
var xml2js = require('xml2js').parseString; |
ff32317e9
|
6 7 8 9 10 11 12 13 14 15 16 17 |
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; |
e7725f72e
|
18 |
console.log(a); |
ff32317e9
|
19 |
var b = userid.substr(0, 4) + password; |
e7725f72e
|
20 |
console.log(b); |
ff32317e9
|
21 22 23 24 25 26 27 28 |
return xor.encode(a,b); } function createPayload(task) { var timestamp = strftime('%H%M%S'); var payload = { |
9de9fde1f
|
29 30 31 32 33 34 35 36 37 |
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)} ] |
ff32317e9
|
38 39 40 |
}; console.log(payload); |
c66f76c6e
|
41 42 |
return "<?xml version=\"1.0\" ?> " + xml(payload); |
ff32317e9
|
43 44 45 |
} function topupRequest(task, retry) { |
ff32317e9
|
46 |
var payload_xml = createPayload(task); |
b8c6efb92
|
47 |
//console.log(payload_xml); |
88b4e0d50
|
48 |
|
7e26aeff4
|
49 50 51 52 |
var postRequest = { host: "202.152.62.2", path: "/RELOAD97.php", port: 7713, |
a1b7fb567
|
53 54 55 56 57 |
method: "POST", headers: { 'Content-Type': 'text/xml', 'Content-Length': Buffer.byteLength(payload_xml) } |
7e26aeff4
|
58 59 60 61 |
}; var buffer = ""; var req = http.request( postRequest, function( res ) { |
f53f2def0
|
62 63 64 |
console.log('Status code: ' + res.statusCode ); var buffer = ""; res.on( "data", function( data ) { buffer = buffer + data; } ); |
a12a4d745
|
65 |
res.on( "end", function( data ) { |
a07de0104
|
66 |
topupResponseHandler(buffer); |
f53f2def0
|
67 |
}); |
7e26aeff4
|
68 69 70 71 72 73 74 75 76 |
}); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); req.write( payload_xml ); req.end(); |
ff32317e9
|
77 |
} |
a12a4d745
|
78 79 80 81 82 83 84 85 86 87 |
function topupResponseHandler(body, request_id) { xml2js(body, function (err, result) { if (err) { console.log(body); callbackReport(request_id, '40', buffer); return; } console.log(result); |
0af71fbe8
|
88 |
request_id = result.datacell.ref_trxid[0].trim(); |
a12a4d745
|
89 90 |
var response_code = '68'; |
1b8530b3c
|
91 92 93 |
var message = ''; try { |
ee5a6e87a
|
94 |
if (result.datacell.message && result.datacell.message.length > 0) { |
1b8530b3c
|
95 |
message = result.datacell.message[0].trim(); |
ee5a6e87a
|
96 |
} else if (result.datacell.msg && result.datacell.msg.length > 0) { |
1b8530b3c
|
97 98 99 100 101 102 103 |
message = result.datacell.msg[0].trim(); } } catch(err) { message = 'exception saat parsing message'; } |
ee5a6e87a
|
104 105 |
if (result.datacell.resultcode && result.datacell.resultcode[0] == '999') { response_code = '40'; |
e86b13f39
|
106 107 108 109 110 111 |
} if (message.indexOf('Nomor tujuan salah') >= 0) { response_code = '14'; } else if (message.indexOf('*GAGAL, transaksi yang sama sudah ada dalam 10 menit') >= 0) { response_code = '55'; |
30de6570b
|
112 113 114 115 |
} else if (message.indexOf('saldo sdh dikembalikan') >= 0) { response_code = '40' } else if (message.indexOf('Trx dpt diulang') >= 0) { response_code = '40' |
5f9c539d6
|
116 117 |
} else if (message.indexOf('SUKSES SN Operator:') >= 0) { response_code = '00'; |
d0d82611e
|
118 |
|
5f9c539d6
|
119 |
var sn = parseSN(message); |
d0d82611e
|
120 121 |
console.log ('SN Operator: ' + sn); |
9aba07466
|
122 |
/* |
5f9c539d6
|
123 124 |
if (!sn) { |
d0d82611e
|
125 |
console.log('Missing real operator SN, using SN from suplier'); |
5f9c539d6
|
126 127 128 129 130 131 132 |
try { sn = result.datacell.trxid[0].trim(); } catch(err) { sn = ''; } } |
9aba07466
|
133 134 135 136 137 138 139 |
*/ if (sn) { message = 'SN=' + sn + '; ' + message; } else { message = message + ' - ' + ' Unknown original SN'; } |
a12a4d745
|
140 141 142 143 144 |
} callbackReport(request_id, response_code, message); }); } |
5f9c539d6
|
145 146 147 148 149 150 151 |
function parseSN(message) { var results = message.match(/SN Operator: .+ SN Kami/); if (!results || results.length <= 0) { return ''; } var result = results[0]; |
8a5b9fc20
|
152 153 |
result = result.replace('SN Operator:', ''); result = result.replace('SN Kami', ''); |
5f9c539d6
|
154 |
result = result.trim(); |
8a5b9fc20
|
155 156 157 158 159 |
if (result == '00') { result = ''; } |
5f9c539d6
|
160 161 |
return result; } |
ff32317e9
|
162 |
function createServer() { |
e303a718e
|
163 |
|
e556ce560
|
164 |
var httpServer = http.createServer(function(req, res) { |
a12a4d745
|
165 |
console.log('Got request from partner ("' + req.url + '")'); |
e303a718e
|
166 167 168 169 170 171 172 |
var body = ""; req.on('data', function (chunk) { body += chunk; }); req.on('end', function () { |
e303a718e
|
173 174 |
res.writeHead(200); res.end('OK'); |
a12a4d745
|
175 176 177 |
console.log(body); topupResponseHandler(body); |
e303a718e
|
178 |
}); |
ff32317e9
|
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
}); 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; |