Blame view

partner-kospinjasa.js 9.42 KB
1f837fd31   Adhidarma Hadiwinoto   on progress
1
2
  var winston = require('winston');
  var soap = require('soap');
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
3
4
  var crypto = require('crypto');
  var strftime = require('strftime');
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
5
6
7
  var fs = require("fs");
  var whiskers = require("whiskers");
  var http = require("http");
e7d59da25   Adhidarma Hadiwinoto   require url
8
  var url = require("url");
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
9
10
11
  
  process.chdir(__dirname);
  var soapTemplate = fs.readFileSync("message.xml");
1f837fd31   Adhidarma Hadiwinoto   on progress
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  
  var max_retry = 10;
  var sleep_before_retry = 5000;
  
  var config;
  var callbackReport;
  var aaa;
  var logger;
  var options;
  
  function start(_config, _callbackReport, options) {
      config = _config;
      callbackReport = _callbackReport
  
      if (options && options.aaa) {
              aaa = options.aaa;
      }
  
      if (options && options.logger) {
          logger = options.logger;
      } else {
          logger = new winston.Logger({
              transports: [
                new (winston.transports.Console)()
              ]
          });
      }
  }
  
  function topupRequest(task, retry) {
9e047c122   Adhidarma Hadiwinoto   saldoCheck
42
43
44
45
46
47
48
49
50
51
      saldoCheck(billpayment, task);
  }
  
  function saldoCheck(callback, task) {
  
      var params = {
          userName: config.h2h_out.userid,
          productCode: '00000' ,
          terminal: 'H2HIPN10',
          transactionType: '61',
1c0291c88   Adhidarma Hadiwinoto   perbaikan random ...
52
          reff: Math.ceil( Math.random() * 99999999 ),
9e047c122   Adhidarma Hadiwinoto   saldoCheck
53
          timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
1f837fd31   Adhidarma Hadiwinoto   on progress
54
      }
9e047c122   Adhidarma Hadiwinoto   saldoCheck
55
      params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password);
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
56
      soap.createClient(config.h2h_out.partner, function(err, soapClient) {
9e047c122   Adhidarma Hadiwinoto   saldoCheck
57
58
  
          if (err) {
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
59
60
61
              logger.warn('Error creating soap client for saldoCheck', {err: err});
              callbackReport(task.requestId, '40', 'Error creating soap client for saldoCheck: ' + err);
              return;
9e047c122   Adhidarma Hadiwinoto   saldoCheck
62
          }
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
          logger.info('Requesting to service', {url: config.h2h_out.partner, params: params});
          soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) {
  
              logger.verbose(
                  'Got saldoCheck response',
                  {
                      lastEndpoint: soapClient.lastEndpoint,
                      lastRequest: soapClient.lastRequest,
                      lastMessage: soapClient.lastMessage,
                      lastResponse: soapClient.lastResponse,
                  }
              );
  
              if (err) {
                  logger.warn('Error requesting saldoCheck', {err: err});
d309c00e0   Adhidarma Hadiwinoto   prev balance
78
                  callbackReport(task.requestId, '40', 'Gagal check saldo');
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
79
              }
9e047c122   Adhidarma Hadiwinoto   saldoCheck
80

9b569c12b   Adhidarma Hadiwinoto   create soapclient...
81
82
              var balance;
              logger.verbose('saldoCheck result', {result: result});
9e047c122   Adhidarma Hadiwinoto   saldoCheck
83

d309c00e0   Adhidarma Hadiwinoto   prev balance
84
85
86
87
88
89
              try {
                  balance = result.outputParameter.bit61.$value;
              }
              catch(e) {
                  balance = 'UNKNOWN';
              }
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
90
91
92
93
94
  
              if (task) {
                  callback(task, balance);
              }
          });
7a475ed37   Adhidarma Hadiwinoto   typo
95
      });
9e047c122   Adhidarma Hadiwinoto   saldoCheck
96
97
98
99
  
  }
  
  function billpayment(task, balance) {
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
100
      var remoteProduct = task.remoteProduct.split(',');
b6b185202   Adhidarma Hadiwinoto   inputCheck
101
      var params = {
7f796c813   Adhidarma Hadiwinoto   coba easysoap
102
103
          userName: config.h2h_out.userid,
          productCode: remoteProduct[0] ,
7be37af22   Adhidarma Hadiwinoto   pakai terminal H2...
104
          terminal: 'H2HIPN10',
7f796c813   Adhidarma Hadiwinoto   coba easysoap
105
106
107
108
109
          transactionType: '50',
          billNumber: createBillNumber(task.destination),
          amount: remoteProduct[1],
          bit61: createBillNumber(task.destination),
          reff: task.requestId,
342d268ac   Adhidarma Hadiwinoto   ubah timeStamp fo...
110
          timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
7f796c813   Adhidarma Hadiwinoto   coba easysoap
111
      }
b6b185202   Adhidarma Hadiwinoto   inputCheck
112
113
      var signature = createSignature(params, config.h2h_out.password);
      params.signature = signature;
7f796c813   Adhidarma Hadiwinoto   coba easysoap
114

777c49c56   Adhidarma Hadiwinoto   hapus forceSoap12...
115
      soap.createClient(config.h2h_out.partner, function(err, soapClient) {
35d3e5057   Adhidarma Hadiwinoto   pakai signature
116

699851497   Adhidarma Hadiwinoto   rearrange params
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
          var _params = {
              userName: params.userName,
              signature: params.signature,
              productCode: params.productCode,
              terminal: params.terminal,
              transactionType: params.transactionType,
              billNumber: params.billNumber,
              amount: params.amount,
              bit61: params.bit61,
              reff: params.reff,
              timeStamp: params.timeStamp
          }
  
          logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
  
          soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
133
134
135
136
137
138
139
140
141
              logger.verbose(
                  'Got response',
                  {
                      lastEndpoint: soapClient.lastEndpoint,
                      lastRequest: soapClient.lastRequest,
                      lastMessage: soapClient.lastMessage,
                      lastResponse: soapClient.lastResponse,
                  }
              );
3899d9816   Adhidarma Hadiwinoto   log last request
142

5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
143
144
145
146
147
              if (err) {
                  logger.warn('Error requesting service', {err: err});
                  callbackReport(task.requestId, '68', 'something wrong');
                  return;
              }
6fc0cd5de   Adhidarma Hadiwinoto   pass balance to t...
148
              topupResponseHandler(task, result, balance);
1f837fd31   Adhidarma Hadiwinoto   on progress
149
150
151
          });
      });
  }
6fc0cd5de   Adhidarma Hadiwinoto   pass balance to t...
152
  function topupResponseHandler(task, response, balance) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
153
154
      var st24rc = '68';
      var st24message = response.outputParameter.resultDesc.$value;
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
155

aa561d430   Adhidarma Hadiwinoto   sn
156
157
158
159
      var resultCode = parseInt(response.outputParameter.resultCode.$value);
      var bit39 = parseInt(response.outputParameter.bit39.$value);
  
      if ( resultCode == 1 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
160
161
162
          // product disabled
          st24rc = '13';
      }
aa561d430   Adhidarma Hadiwinoto   sn
163
      else if ( resultCode == 2 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
164
165
166
          // prodcode disable
          st24rc = '13';
      }
aa561d430   Adhidarma Hadiwinoto   sn
167
      else if ( resultCode == 3 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
168
169
170
          // duplicate reff
          st24rc = '55';
      }
aa561d430   Adhidarma Hadiwinoto   sn
171
      else if ( resultCode == 4 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
172
173
174
          // not enough balance
          st24rc = '40';
      }
aa561d430   Adhidarma Hadiwinoto   sn
175
      else if ( resultCode == 5 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
176
177
178
          // username blocked
          st24rc = '40';
      }
aa561d430   Adhidarma Hadiwinoto   sn
179
      else if ( resultCode == 6 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
180
181
182
          // not exists username
          st24rc = '40';
      }
aa561d430   Adhidarma Hadiwinoto   sn
183
      else if ( resultCode == 11 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
184
185
186
          // invalid request
          st24rc = '40'
      }
aa561d430   Adhidarma Hadiwinoto   sn
187
      else if ( resultCode == 12 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
188
189
190
          // no route to host
          st24rc = '40'
      }
aa561d430   Adhidarma Hadiwinoto   sn
191
      else if ( resultCode == 13 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
192
193
194
          // invalid signature
          st24rc = '40'
      }
aa561d430   Adhidarma Hadiwinoto   sn
195
      else if ( bit39 == 6 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
196
197
198
          st24rc = '40';
          st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
      }
aa561d430   Adhidarma Hadiwinoto   sn
199
      else if ( bit39 == 12 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
200
201
202
          st24rc = '40';
          st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
      }
aa561d430   Adhidarma Hadiwinoto   sn
203
      else if ( bit39 == 13 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
204
205
206
          st24rc = '13';
          st24message = 'Invalid voucher nominal';
      }
aa561d430   Adhidarma Hadiwinoto   sn
207
      else if ( bit39 == 14 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
208
209
210
          st24rc = '14';
          st24message = 'MSISDN tidak ditemukan';
      }
aa561d430   Adhidarma Hadiwinoto   sn
211
      else if ( bit39 == 30 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
212
213
214
          st24rc = '40';
          st24message = 'Format Error';
      }
aa561d430   Adhidarma Hadiwinoto   sn
215
      else if ( bit39 == 31 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
216
217
218
          st24rc = '40';
          st24message = 'Kode bank tidak terdaftar';
      }
aa561d430   Adhidarma Hadiwinoto   sn
219
      else if ( bit39 == 63 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
220
221
222
          st24rc = '40';
          st24message = 'Reversal denied';
      }
aa561d430   Adhidarma Hadiwinoto   sn
223
      else if ( bit39 == 68 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
224
225
226
          st24rc = '68';
          st24message = 'Transaksi sedang dalam proses';
      }
aa561d430   Adhidarma Hadiwinoto   sn
227
      else if ( bit39 == 69 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
228
229
230
          st24rc = '68';
          st24message = 'Respon Ok lebih dari 24 detik';
      }
aa561d430   Adhidarma Hadiwinoto   sn
231
      else if ( bit39 == 70 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
232
233
234
          st24rc = '13';
          st24message = 'Voucher out of stock';
      }
aa561d430   Adhidarma Hadiwinoto   sn
235
      else if ( bit39 == 79 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
236
237
238
          st24rc = '14';
          st24message = 'Phone number is blocked by Telkomsel';
      }
aa561d430   Adhidarma Hadiwinoto   sn
239
      else if ( bit39 == 81 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
240
241
242
          st24rc = '14';
          st24message = 'Phone number is expired';
      }
aa561d430   Adhidarma Hadiwinoto   sn
243
      else if ( bit39 == 89 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
244
245
246
          st24rc = '40';
          st24message = 'Link to billing provider is down';
      }
aa561d430   Adhidarma Hadiwinoto   sn
247
      else if ( bit39 == 91 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
248
249
250
          st24rc = '40';
          st24message = 'Database problem';
      }
aa561d430   Adhidarma Hadiwinoto   sn
251
      else if ( bit39 == 92 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
252
253
254
          st24rc = '40';
          st24message = 'Unable to route transaction';
      }
aa561d430   Adhidarma Hadiwinoto   sn
255
      else if ( bit39 == 94 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
256
257
258
          st24rc = '40';
          st24message = 'Duplicate reversal request';
      }
aa561d430   Adhidarma Hadiwinoto   sn
259
260
261
262
263
264
265
      else if ( resultCode == 0 && bit39 == 0) {
  
          var sn = '';
  
          try {
              sn = response.outputParameter.bit61.$value.substring(43);
          }
e2e928e50   Adhidarma Hadiwinoto   typo
266
          catch(e) {
aa561d430   Adhidarma Hadiwinoto   sn
267
268
269
270
271
272
              sn = '';
          }
  
          st24message = 'SN=' + sn + '; ' + st24message;
          st24rc = '00';
      }
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
273

4252c2818   Adhidarma Hadiwinoto   penanganan rc
274
275
276
      var message =
          response.outputParameter.resultCode.$value
          + " " + response.outputParameter.resultDesc.$value
aa561d430   Adhidarma Hadiwinoto   sn
277
          + "; BIT39: " + response.outputParameter.bit39.$value
4252c2818   Adhidarma Hadiwinoto   penanganan rc
278
          ;
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
279

4252c2818   Adhidarma Hadiwinoto   penanganan rc
280
281
282
      if (response.outputParameter.resultDesc.$value != st24message) {
          var message = message + " " + st24message;
      }
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
283

d309c00e0   Adhidarma Hadiwinoto   prev balance
284
      message = message + ' -- Prev Balance: ' + balance;
13e965f4e   Adhidarma Hadiwinoto   typo
285
      logger.info('Got result: ' + message, {response: response});
d309c00e0   Adhidarma Hadiwinoto   prev balance
286
      callbackReport(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance);
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
287
  }
b6b185202   Adhidarma Hadiwinoto   inputCheck
288
  function createSignature(params, password) {
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
289
      var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
dfcc535b5   Adhidarma Hadiwinoto   coba perbaiki cre...
290
      var plain =
b6b185202   Adhidarma Hadiwinoto   inputCheck
291
          params.userName
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
292
          + passwordHash
b6b185202   Adhidarma Hadiwinoto   inputCheck
293
294
295
296
297
298
299
          + params.productCode
          + params.terminal
          + params.transactionType
          + params.billNumber
          + params.amount
          + params.reff
          + params.timeStamp;
dfcc535b5   Adhidarma Hadiwinoto   coba perbaiki cre...
300

4252c2818   Adhidarma Hadiwinoto   penanganan rc
301
      return crypto.createHash('sha1').update(plain).digest().toString('hex');
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
302
  }
9e047c122   Adhidarma Hadiwinoto   saldoCheck
303
304
305
306
307
308
309
310
311
312
313
314
315
  function createSignatureForSaldoCheck(params, password) {
      var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
      var plain =
          params.userName
          + passwordHash
          + params.productCode
          + params.terminal
          + params.transactionType
          + params.reff
          + params.timeStamp;
  
      return crypto.createHash('sha1').update(plain).digest().toString('hex');
  }
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
316
317
  function createBillNumber(destination) {
      return ("0000000000000" + destination).slice(-13);
1f837fd31   Adhidarma Hadiwinoto   on progress
318
319
320
321
  }
  
  exports.start = start;
  exports.topupRequest = topupRequest;
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
322
323
  exports.createSignature = createSignature;
  exports.createBillNumber = createBillNumber;