Blame view

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

e556ce560   Adhidarma Hadiwinoto   refactor nama var...
170
      var httpServer = http.createServer(function(req, res) {
501ee56e9   Adhidarma Hadiwinoto   refund
171
          var parsed_url = url.parse(req.url, true, true);
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
172
          console.log('Got request from partner ("' + req.url + '")');
e303a718e   Adhidarma Hadiwinoto   penanganan sn
173
174
175
176
177
178
179
          
          var body = "";
          req.on('data', function (chunk) {
              body += chunk;
          });
          
          req.on('end', function () {
e303a718e   Adhidarma Hadiwinoto   penanganan sn
180
181
              res.writeHead(200);
              res.end('OK');
a12a4d745   Adhidarma Hadiwinoto   merge direct dan ...
182
183
              
              console.log(body);
b56a3961e   Adhidarma Hadiwinoto   ignore non sn report
184
              
501ee56e9   Adhidarma Hadiwinoto   refund
185
186
              if (parsed_url.pathname == '/sn') {
                  console.log('Reverse report -- SN');
b56a3961e   Adhidarma Hadiwinoto   ignore non sn report
187
                  topupResponseHandler(body);
501ee56e9   Adhidarma Hadiwinoto   refund
188
189
190
                  
              } else if (parsed_url.pathname = '/refund') {
                  console.log('Reverse report -- REFUND');
d4f54365c   Adhidarma Hadiwinoto   typo
191
                  callbackReport(parsed_url.query.ref_trxid, '40', parsed_url.qs.message);
501ee56e9   Adhidarma Hadiwinoto   refund
192
                  
b56a3961e   Adhidarma Hadiwinoto   ignore non sn report
193
              } else {
501ee56e9   Adhidarma Hadiwinoto   refund
194
195
                  console.log('Reverse report -- UNKNOWN');
                  console.log('Ignore unknown request on reverse url');
b56a3961e   Adhidarma Hadiwinoto   ignore non sn report
196
              }
e303a718e   Adhidarma Hadiwinoto   penanganan sn
197
          });
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
198
199
200
201
202
203
      });
      
      httpServer.listen(config.h2h_out.listen_port, function() {
          console.log('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port);
      });
  }
f1638d5b2   Adhidarma Hadiwinoto   balance
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  function balanceCheck() {
      var timestamp = strftime('%H%M%S');
      
      var payload = {
          datacell: [
              {perintah: 'saldo'},
              {userid: config.h2h_out.userid},
              {time: timestamp},
              {sgn: calculateBalanceSignature(config.h2h_out.userid, config.h2h_out.password, timestamp)}
          ]
      };
      
      var postRequest = {
          host: "202.152.62.2",
          path: "/RELOAD97.php",
          port: 7713,
          method: "POST",
          headers: {
              'Content-Type': 'text/xml',
              'Content-Length': Buffer.byteLength(payload_xml)
          }
      };
      
      var buffer = "";
      var req = http.request( postRequest, function( res )    {
  
          console.log('Status code: ' + res.statusCode );
          var buffer = "";
          res.on( "data", function( data ) { buffer = buffer + data; } );
          res.on( "end", function( data ) {             
              console.log('CHECK BALANCE RESULT:');
              console.log(buffer);
          });
  
      });
  
      req.on('error', function(e) {
          console.log('problem with request: ' + e.message);
      });
  
      req.write( payload_xml );
      req.end();
      
  }
ff32317e9   Adhidarma Hadiwinoto   prototype partner...
248
249
250
251
252
253
254
255
256
257
  
  function start(_config, _callbackReport) {
      config = _config;
      callbackReport = _callbackReport
  
      createServer();
  }
  
  exports.start = start;
  exports.topupRequest = topupRequest;