Blame view

partner-datacell.js 6.11 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
  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   Adhidarma Hadiwinoto   debug sig
18
      console.log(a);
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
19
      var b = userid.substr(0, 4) + password;
e7725f72e   Adhidarma Hadiwinoto   debug sig
20
      console.log(b);
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
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   Adhidarma Hadiwinoto   curly
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   Adhidarma Hadiwinoto   prototype partner...
38
39
40
      };
      
      console.log(payload);
c66f76c6e   Adhidarma Hadiwinoto   top level element
41
42
      return "<?xml version=\"1.0\" ?>
  " + xml(payload);
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  }
  
  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);
40eead5f7   Adhidarma Hadiwinoto   debug payload_xml
70
      console.log(payload_xml);
88b4e0d50   Adhidarma Hadiwinoto   gunakan req.end
71
      
7e26aeff4   Adhidarma Hadiwinoto   coba plain http req
72
73
74
75
      var postRequest = {
          host: "202.152.62.2",
          path: "/RELOAD97.php",
          port: 7713,
a1b7fb567   Adhidarma Hadiwinoto   coba pakai header
76
77
78
79
80
          method: "POST",
          headers: {
              'Content-Type': 'text/xml',
              'Content-Length': Buffer.byteLength(payload_xml)
          }
7e26aeff4   Adhidarma Hadiwinoto   coba plain http req
81
82
83
84
      };
      
      var buffer = "";
      var req = http.request( postRequest, function( res )    {
f53f2def0   Adhidarma Hadiwinoto   mulai tangani dir...
85
86
87
          console.log('Status code: ' + res.statusCode );
          var buffer = "";
          res.on( "data", function( data ) { buffer = buffer + data; } );
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
88
          res.on( "end", function( data ) {             
a07de0104   Adhidarma Hadiwinoto   data dan buffer lagi
89
                  topupResponseHandler(buffer);
f53f2def0   Adhidarma Hadiwinoto   mulai tangani dir...
90
          });
7e26aeff4   Adhidarma Hadiwinoto   coba plain http req
91
92
93
94
95
96
97
98
99
  
      });
  
      req.on('error', function(e) {
          console.log('problem with request: ' + e.message);
      });
  
      req.write( payload_xml );
      req.end();
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
100
  }
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
101
102
103
104
105
106
107
108
109
110
  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
111
          request_id = result.datacell.ref_trxid[0].trim();
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
112
113
          
          var response_code = '68';
1b8530b3c   Adhidarma Hadiwinoto   penanganan field ...
114
115
116
          
          var message = '';
          try {
ee5a6e87a   Adhidarma Hadiwinoto   simplified try catch
117
              if (result.datacell.message && result.datacell.message.length > 0) {
1b8530b3c   Adhidarma Hadiwinoto   penanganan field ...
118
                  message = result.datacell.message[0].trim();
ee5a6e87a   Adhidarma Hadiwinoto   simplified try catch
119
              } else if (result.datacell.msg && result.datacell.msg.length > 0) {
1b8530b3c   Adhidarma Hadiwinoto   penanganan field ...
120
121
122
123
124
125
126
                  message = result.datacell.msg[0].trim();
              } 
          }
          catch(err) {
              message = 'exception saat parsing message';
          }
          
ee5a6e87a   Adhidarma Hadiwinoto   simplified try catch
127
128
          if (result.datacell.resultcode && result.datacell.resultcode[0] == '999') {
              response_code = '40';
e86b13f39   Adhidarma Hadiwinoto   penanganan unknow...
129
130
131
132
133
134
          }
          
          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
135
136
137
138
          } 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
139
140
          } else if (message.indexOf('SUKSES SN Operator:') >= 0) {
              response_code = '00';
d0d82611e   Adhidarma Hadiwinoto   sn verbose
141
              
5f9c539d6   Adhidarma Hadiwinoto   parseSN
142
              var sn = parseSN(message);
d0d82611e   Adhidarma Hadiwinoto   sn verbose
143
144
              console.log ('SN Operator: ' + sn);
              
9aba07466   Adhidarma Hadiwinoto   hanya set sn jika...
145
              /*
5f9c539d6   Adhidarma Hadiwinoto   parseSN
146
147
              if (!sn) {
                  
d0d82611e   Adhidarma Hadiwinoto   sn verbose
148
                  console.log('Missing real operator SN, using SN from suplier');
5f9c539d6   Adhidarma Hadiwinoto   parseSN
149
150
151
152
153
154
155
                  try {
                      sn = result.datacell.trxid[0].trim();
                  }
                  catch(err) {
                      sn = '';
                  }
              }
9aba07466   Adhidarma Hadiwinoto   hanya set sn jika...
156
157
158
159
160
161
162
              */
              
              if (sn) {
                  message = 'SN=' + sn + '; ' + message;
              } else {
                  message = message + ' - ' + ' Unknown original SN';
              }
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
163
164
165
166
167
          }
          
          callbackReport(request_id, response_code, message);
      });
  }
5f9c539d6   Adhidarma Hadiwinoto   parseSN
168
169
170
171
172
173
174
  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
175
176
      result = result.replace('SN Operator:', '');
      result = result.replace('SN Kami', '');
5f9c539d6   Adhidarma Hadiwinoto   parseSN
177
      result = result.trim();
8a5b9fc20   Adhidarma Hadiwinoto   perbaikan parseSN
178
179
180
181
182
      
      if (result == '00') {
          result = '';
      }
      
5f9c539d6   Adhidarma Hadiwinoto   parseSN
183
184
      return result;
  }
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
185
  function createServer() {
e303a718e   Adhidarma Hadiwinoto   penanganan sn
186

e556ce560   Adhidarma Hadiwinoto   refactor nama var...
187
      var httpServer = http.createServer(function(req, res) {
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
188
          console.log('Got request from partner ("' + req.url + '")');
e303a718e   Adhidarma Hadiwinoto   penanganan sn
189
190
191
192
193
194
195
          
          var body = "";
          req.on('data', function (chunk) {
              body += chunk;
          });
          
          req.on('end', function () {
e303a718e   Adhidarma Hadiwinoto   penanganan sn
196
197
              res.writeHead(200);
              res.end('OK');
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
198
199
200
              
              console.log(body);
              topupResponseHandler(body);
e303a718e   Adhidarma Hadiwinoto   penanganan sn
201
          });
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
      });
      
      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;