Blame view

partner-datacell.js 5.49 KB
d2933ca99   Adhidarma Hadiwinoto   require http
1
  var http = require('http');
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
2
3
4
  var url = require('url');
  var math = require('mathjs');
  var xml = require('xml');
f53f2def0   Adhidarma Hadiwinoto   mulai tangani dir...
5
  var xml2js = require('xml2js').parseString;
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  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;
      var b = userid.substr(0, 4) + password;
      
      return xor.encode(a,b);
  }
  
  function createPayload(task) {
      var timestamp = strftime('%H%M%S');
      
      var payload = {
9de9fde1f   Adhidarma Hadiwinoto   curly
27
28
29
30
31
32
33
34
35
          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   Adhidarma Hadiwinoto   prototype partner...
36
37
38
      };
      
      console.log(payload);
c66f76c6e   Adhidarma Hadiwinoto   top level element
39
40
      return "<?xml version=\"1.0\" ?>
  " + xml(payload);
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
41
42
43
  }
  
  function topupRequest(task, retry) {
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
44
      var payload_xml = createPayload(task);
b8c6efb92   Adhidarma Hadiwinoto   simplified
45
      //console.log(payload_xml);
88b4e0d50   Adhidarma Hadiwinoto   gunakan req.end
46
      
7e26aeff4   Adhidarma Hadiwinoto   coba plain http req
47
48
49
50
      var postRequest = {
          host: "202.152.62.2",
          path: "/RELOAD97.php",
          port: 7713,
a1b7fb567   Adhidarma Hadiwinoto   coba pakai header
51
52
53
54
55
          method: "POST",
          headers: {
              'Content-Type': 'text/xml',
              'Content-Length': Buffer.byteLength(payload_xml)
          }
7e26aeff4   Adhidarma Hadiwinoto   coba plain http req
56
57
58
59
      };
      
      var buffer = "";
      var req = http.request( postRequest, function( res )    {
f53f2def0   Adhidarma Hadiwinoto   mulai tangani dir...
60
61
62
          console.log('Status code: ' + res.statusCode );
          var buffer = "";
          res.on( "data", function( data ) { buffer = buffer + data; } );
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
63
          res.on( "end", function( data ) {             
a07de0104   Adhidarma Hadiwinoto   data dan buffer lagi
64
                  topupResponseHandler(buffer);
f53f2def0   Adhidarma Hadiwinoto   mulai tangani dir...
65
          });
7e26aeff4   Adhidarma Hadiwinoto   coba plain http req
66
67
68
69
70
71
72
73
74
  
      });
  
      req.on('error', function(e) {
          console.log('problem with request: ' + e.message);
      });
  
      req.write( payload_xml );
      req.end();
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
75
  }
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
76
77
78
79
80
81
82
83
84
85
  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   Adhidarma Hadiwinoto   typo fixed
86
          request_id = result.datacell.ref_trxid[0].trim();
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
87
88
          
          var response_code = '68';
1b8530b3c   Adhidarma Hadiwinoto   penanganan field ...
89
90
91
          
          var message = '';
          try {
ee5a6e87a   Adhidarma Hadiwinoto   simplified try catch
92
              if (result.datacell.message && result.datacell.message.length > 0) {
1b8530b3c   Adhidarma Hadiwinoto   penanganan field ...
93
                  message = result.datacell.message[0].trim();
ee5a6e87a   Adhidarma Hadiwinoto   simplified try catch
94
              } else if (result.datacell.msg && result.datacell.msg.length > 0) {
1b8530b3c   Adhidarma Hadiwinoto   penanganan field ...
95
96
97
98
99
100
101
                  message = result.datacell.msg[0].trim();
              } 
          }
          catch(err) {
              message = 'exception saat parsing message';
          }
          
ee5a6e87a   Adhidarma Hadiwinoto   simplified try catch
102
103
          if (result.datacell.resultcode && result.datacell.resultcode[0] == '999') {
              response_code = '40';
e86b13f39   Adhidarma Hadiwinoto   penanganan unknow...
104
105
106
107
108
109
          }
          
          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   Adhidarma Hadiwinoto   penanganan gagal
110
111
112
113
          } else if (message.indexOf('saldo sdh dikembalikan') >= 0) {
              response_code = '40'
          } else if (message.indexOf('Trx dpt diulang') >= 0) {
              response_code = '40'
5f9c539d6   Adhidarma Hadiwinoto   parseSN
114
115
          } else if (message.indexOf('SUKSES SN Operator:') >= 0) {
              response_code = '00';
d0d82611e   Adhidarma Hadiwinoto   sn verbose
116
              
5f9c539d6   Adhidarma Hadiwinoto   parseSN
117
              var sn = parseSN(message);
d0d82611e   Adhidarma Hadiwinoto   sn verbose
118
119
              console.log ('SN Operator: ' + sn);
              
9aba07466   Adhidarma Hadiwinoto   hanya set sn jika...
120
              /*
5f9c539d6   Adhidarma Hadiwinoto   parseSN
121
122
              if (!sn) {
                  
d0d82611e   Adhidarma Hadiwinoto   sn verbose
123
                  console.log('Missing real operator SN, using SN from suplier');
5f9c539d6   Adhidarma Hadiwinoto   parseSN
124
125
126
127
128
129
130
                  try {
                      sn = result.datacell.trxid[0].trim();
                  }
                  catch(err) {
                      sn = '';
                  }
              }
9aba07466   Adhidarma Hadiwinoto   hanya set sn jika...
131
132
133
134
135
136
137
              */
              
              if (sn) {
                  message = 'SN=' + sn + '; ' + message;
              } else {
                  message = message + ' - ' + ' Unknown original SN';
              }
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
138
139
140
141
142
          }
          
          callbackReport(request_id, response_code, message);
      });
  }
5f9c539d6   Adhidarma Hadiwinoto   parseSN
143
144
145
146
147
148
149
  function parseSN(message) {
      var results = message.match(/SN Operator: .+ SN Kami/);
      if (!results || results.length <= 0) {
          return '';
      }
      
      var result = results[0];
8a5b9fc20   Adhidarma Hadiwinoto   perbaikan parseSN
150
151
      result = result.replace('SN Operator:', '');
      result = result.replace('SN Kami', '');
5f9c539d6   Adhidarma Hadiwinoto   parseSN
152
      result = result.trim();
8a5b9fc20   Adhidarma Hadiwinoto   perbaikan parseSN
153
154
155
156
157
      
      if (result == '00') {
          result = '';
      }
      
5f9c539d6   Adhidarma Hadiwinoto   parseSN
158
159
      return result;
  }
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
160
  function createServer() {
e303a718e   Adhidarma Hadiwinoto   penanganan sn
161

e556ce560   Adhidarma Hadiwinoto   refactor nama var...
162
      var httpServer = http.createServer(function(req, res) {
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
163
          console.log('Got request from partner ("' + req.url + '")');
e303a718e   Adhidarma Hadiwinoto   penanganan sn
164
165
166
167
168
169
170
          
          var body = "";
          req.on('data', function (chunk) {
              body += chunk;
          });
          
          req.on('end', function () {
e303a718e   Adhidarma Hadiwinoto   penanganan sn
171
172
              res.writeHead(200);
              res.end('OK');
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
173
174
              
              console.log(body);
b56a3961e   Adhidarma Hadiwinoto   ignore non sn report
175
176
177
178
179
180
              
              if (req.url == '/sn') {
                  topupResponseHandler(body);
              } else {
                  console.log('Ignore non /sn report');
              }
e303a718e   Adhidarma Hadiwinoto   penanganan sn
181
          });
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
      });
      
      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;