Blame view

partner-kospinjasa.js 12.8 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");
1caba187c   Adhidarma Hadiwinoto   mongodb
9
10
  var mongoClient = require('mongodb').MongoClient;
  var moment = require('moment');
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
11
12
13
  
  process.chdir(__dirname);
  var soapTemplate = fs.readFileSync("message.xml");
1f837fd31   Adhidarma Hadiwinoto   on progress
14
15
16
17
18
19
20
21
22
  
  var max_retry = 10;
  var sleep_before_retry = 5000;
  
  var config;
  var callbackReport;
  var aaa;
  var logger;
  var options;
1caba187c   Adhidarma Hadiwinoto   mongodb
23
  var mongodb;
1f837fd31   Adhidarma Hadiwinoto   on progress
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  
  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)()
              ]
          });
      }
1caba187c   Adhidarma Hadiwinoto   mongodb
42
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  
      initMongoClient();
  }
  
  function initMongoClient() {
      if (!config || !config.mongodb || !config.mongodb.url) {
          return;
      }
  
      try {
          var url = config.mongodb.url;
  
          mongoClient.connect(url, function(err, db) {
              if (err) {
                  logger.warn('Failed to connect to mongodb', {err: err});
                  return;
              }
              mongodb = db;
              logger.info('MongoDB connected');
          });
      }
      catch(err) {
          logger.warn('Exception when connecting to mongodb', {err: err, url: url});
      }
  }
  
  function insertTaskToMongoDb(task) {
      if (!isMongoReady()) { return; }
  
      task.supplier = config.globals.gateway_name;
      task.rc = '68';
  
      try {
          mongodb.collection(config.mongodb.collection).insertOne(task);
      }
      catch(err) {
          //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
      }
  }
  
  function pushResponseToMongoDb(task, response, rc) {
      if (!isMongoReady()) { return; }
2af28a398   Adhidarma Hadiwinoto   create ts jika ti...
84

1caba187c   Adhidarma Hadiwinoto   mongodb
85
      try {
2af28a398   Adhidarma Hadiwinoto   create ts jika ti...
86
87
88
          if (!response.ts) {
              response.ts = strftime('%Y-%m-%d %H:%M:%S', new Date());
          }
1caba187c   Adhidarma Hadiwinoto   mongodb
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
          mongodb.collection(config.mongodb.collection).updateOne(
              {requestId: task.requestId},
              {
                  $set: {
                      lastResponse: response,
                      supplier: config.globals.gateway_name,
                      rc: rc
                  },
                  $push: {
                      responses: response
                  }
              },
              function(err, result) {
                  if (err) {
                      logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
                      return;
                  }
              }
          );
      }
      catch(err) {
          logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
      }
  }
  
  function isMongoReady() {
      if (!config.mongodb) { return; }
      if (!config.mongodb.collection) { return; }
      if (!mongodb) { return; }
  
      return true;
1f837fd31   Adhidarma Hadiwinoto   on progress
120
121
122
  }
  
  function topupRequest(task, retry) {
1caba187c   Adhidarma Hadiwinoto   mongodb
123
124
125
126
      task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
      task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
  
      insertTaskToMongoDb(task);
9e047c122   Adhidarma Hadiwinoto   saldoCheck
127
128
129
130
131
132
133
134
135
136
      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 ...
137
          reff: Math.ceil( Math.random() * 99999999 ),
9e047c122   Adhidarma Hadiwinoto   saldoCheck
138
          timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
1f837fd31   Adhidarma Hadiwinoto   on progress
139
      }
9e047c122   Adhidarma Hadiwinoto   saldoCheck
140
      params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password);
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
141
      soap.createClient(config.h2h_out.partner, function(err, soapClient) {
9e047c122   Adhidarma Hadiwinoto   saldoCheck
142
143
  
          if (err) {
1caba187c   Adhidarma Hadiwinoto   mongodb
144
145
146
147
148
  
              var errorMessage = 'Error creating soap client for saldoCheck: ' + err;
  
              logger.warn(errorMessage, {err: err});
              callbackReport(task.requestId, '40', errorMessage);
2af28a398   Adhidarma Hadiwinoto   create ts jika ti...
149
              pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40');
1caba187c   Adhidarma Hadiwinoto   mongodb
150

9b569c12b   Adhidarma Hadiwinoto   create soapclient...
151
              return;
9e047c122   Adhidarma Hadiwinoto   saldoCheck
152
          }
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
153
154
155
156
157
158
159
160
161
162
163
164
165
166
          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) {
1caba187c   Adhidarma Hadiwinoto   mongodb
167
168
169
170
                  var errorMessage = 'Error requesting saldoCheck: ' + err;
  
                  logger.warn(errorMessage, {err: err});
                  callbackReport(task.requestId, '40', errorMessage);
2af28a398   Adhidarma Hadiwinoto   create ts jika ti...
171
                  pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40');
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
172
              }
9e047c122   Adhidarma Hadiwinoto   saldoCheck
173

9b569c12b   Adhidarma Hadiwinoto   create soapclient...
174
175
              var balance;
              logger.verbose('saldoCheck result', {result: result});
9e047c122   Adhidarma Hadiwinoto   saldoCheck
176

d309c00e0   Adhidarma Hadiwinoto   prev balance
177
178
179
180
181
182
              try {
                  balance = result.outputParameter.bit61.$value;
              }
              catch(e) {
                  balance = 'UNKNOWN';
              }
9b569c12b   Adhidarma Hadiwinoto   create soapclient...
183
184
185
186
187
  
              if (task) {
                  callback(task, balance);
              }
          });
7a475ed37   Adhidarma Hadiwinoto   typo
188
      });
9e047c122   Adhidarma Hadiwinoto   saldoCheck
189
190
191
192
  
  }
  
  function billpayment(task, balance) {
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
193
      var remoteProduct = task.remoteProduct.split(',');
b6b185202   Adhidarma Hadiwinoto   inputCheck
194
      var params = {
7f796c813   Adhidarma Hadiwinoto   coba easysoap
195
196
          userName: config.h2h_out.userid,
          productCode: remoteProduct[0] ,
7be37af22   Adhidarma Hadiwinoto   pakai terminal H2...
197
          terminal: 'H2HIPN10',
7f796c813   Adhidarma Hadiwinoto   coba easysoap
198
199
200
201
202
          transactionType: '50',
          billNumber: createBillNumber(task.destination),
          amount: remoteProduct[1],
          bit61: createBillNumber(task.destination),
          reff: task.requestId,
342d268ac   Adhidarma Hadiwinoto   ubah timeStamp fo...
203
          timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
7f796c813   Adhidarma Hadiwinoto   coba easysoap
204
      }
b6b185202   Adhidarma Hadiwinoto   inputCheck
205
206
      var signature = createSignature(params, config.h2h_out.password);
      params.signature = signature;
7f796c813   Adhidarma Hadiwinoto   coba easysoap
207

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

699851497   Adhidarma Hadiwinoto   rearrange params
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
          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
226
227
228
229
230
231
232
233
234
              logger.verbose(
                  'Got response',
                  {
                      lastEndpoint: soapClient.lastEndpoint,
                      lastRequest: soapClient.lastRequest,
                      lastMessage: soapClient.lastMessage,
                      lastResponse: soapClient.lastResponse,
                  }
              );
3899d9816   Adhidarma Hadiwinoto   log last request
235

5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
236
              if (err) {
1caba187c   Adhidarma Hadiwinoto   mongodb
237
238
239
240
                  var errorMessage = 'Error requesting service: ' + err;
  
                  logger.warn(errorMessage, {err: err});
                  callbackReport(task.requestId, '68', errorMessage);
64e3e4b8c   Adhidarma Hadiwinoto   set parsedResponse
241
                  pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: soapClient.lastResponse}, '68');
1caba187c   Adhidarma Hadiwinoto   mongodb
242

5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
243
244
                  return;
              }
1caba187c   Adhidarma Hadiwinoto   mongodb
245
              topupResponseHandler(task, result, balance, soapClient.lastResponse);
1f837fd31   Adhidarma Hadiwinoto   on progress
246
247
248
          });
      });
  }
1caba187c   Adhidarma Hadiwinoto   mongodb
249
  function topupResponseHandler(task, response, balance, rawResponse) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
250
251
      var st24rc = '68';
      var st24message = response.outputParameter.resultDesc.$value;
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
252

aa561d430   Adhidarma Hadiwinoto   sn
253
254
255
256
      var resultCode = parseInt(response.outputParameter.resultCode.$value);
      var bit39 = parseInt(response.outputParameter.bit39.$value);
  
      if ( resultCode == 1 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
257
258
259
          // product disabled
          st24rc = '13';
      }
aa561d430   Adhidarma Hadiwinoto   sn
260
      else if ( resultCode == 2 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
261
262
263
          // prodcode disable
          st24rc = '13';
      }
aa561d430   Adhidarma Hadiwinoto   sn
264
      else if ( resultCode == 3 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
265
266
267
          // duplicate reff
          st24rc = '55';
      }
aa561d430   Adhidarma Hadiwinoto   sn
268
      else if ( resultCode == 4 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
269
270
271
          // not enough balance
          st24rc = '40';
      }
aa561d430   Adhidarma Hadiwinoto   sn
272
      else if ( resultCode == 5 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
273
274
275
          // username blocked
          st24rc = '40';
      }
aa561d430   Adhidarma Hadiwinoto   sn
276
      else if ( resultCode == 6 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
277
278
279
          // not exists username
          st24rc = '40';
      }
aa561d430   Adhidarma Hadiwinoto   sn
280
      else if ( resultCode == 11 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
281
282
283
          // invalid request
          st24rc = '40'
      }
aa561d430   Adhidarma Hadiwinoto   sn
284
      else if ( resultCode == 12 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
285
286
287
          // no route to host
          st24rc = '40'
      }
aa561d430   Adhidarma Hadiwinoto   sn
288
      else if ( resultCode == 13 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
289
290
291
          // invalid signature
          st24rc = '40'
      }
aa561d430   Adhidarma Hadiwinoto   sn
292
      else if ( bit39 == 6 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
293
294
295
          st24rc = '40';
          st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
      }
aa561d430   Adhidarma Hadiwinoto   sn
296
      else if ( bit39 == 12 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
297
298
299
          st24rc = '40';
          st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
      }
aa561d430   Adhidarma Hadiwinoto   sn
300
      else if ( bit39 == 13 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
301
302
303
          st24rc = '13';
          st24message = 'Invalid voucher nominal';
      }
aa561d430   Adhidarma Hadiwinoto   sn
304
      else if ( bit39 == 14 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
305
306
307
          st24rc = '14';
          st24message = 'MSISDN tidak ditemukan';
      }
aa561d430   Adhidarma Hadiwinoto   sn
308
      else if ( bit39 == 30 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
309
310
311
          st24rc = '40';
          st24message = 'Format Error';
      }
aa561d430   Adhidarma Hadiwinoto   sn
312
      else if ( bit39 == 31 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
313
314
315
          st24rc = '40';
          st24message = 'Kode bank tidak terdaftar';
      }
aa561d430   Adhidarma Hadiwinoto   sn
316
      else if ( bit39 == 63 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
317
318
319
          st24rc = '40';
          st24message = 'Reversal denied';
      }
aa561d430   Adhidarma Hadiwinoto   sn
320
      else if ( bit39 == 68 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
321
322
323
          st24rc = '68';
          st24message = 'Transaksi sedang dalam proses';
      }
aa561d430   Adhidarma Hadiwinoto   sn
324
      else if ( bit39 == 69 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
325
326
327
          st24rc = '68';
          st24message = 'Respon Ok lebih dari 24 detik';
      }
aa561d430   Adhidarma Hadiwinoto   sn
328
      else if ( bit39 == 70 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
329
330
331
          st24rc = '13';
          st24message = 'Voucher out of stock';
      }
aa561d430   Adhidarma Hadiwinoto   sn
332
      else if ( bit39 == 79 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
333
334
335
          st24rc = '14';
          st24message = 'Phone number is blocked by Telkomsel';
      }
aa561d430   Adhidarma Hadiwinoto   sn
336
      else if ( bit39 == 81 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
337
338
339
          st24rc = '14';
          st24message = 'Phone number is expired';
      }
aa561d430   Adhidarma Hadiwinoto   sn
340
      else if ( bit39 == 89 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
341
342
343
          st24rc = '40';
          st24message = 'Link to billing provider is down';
      }
aa561d430   Adhidarma Hadiwinoto   sn
344
      else if ( bit39 == 91 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
345
346
347
          st24rc = '40';
          st24message = 'Database problem';
      }
aa561d430   Adhidarma Hadiwinoto   sn
348
      else if ( bit39 == 92 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
349
350
351
          st24rc = '40';
          st24message = 'Unable to route transaction';
      }
aa561d430   Adhidarma Hadiwinoto   sn
352
      else if ( bit39 == 94 ) {
4252c2818   Adhidarma Hadiwinoto   penanganan rc
353
354
355
          st24rc = '40';
          st24message = 'Duplicate reversal request';
      }
aa561d430   Adhidarma Hadiwinoto   sn
356
357
358
359
360
361
362
      else if ( resultCode == 0 && bit39 == 0) {
  
          var sn = '';
  
          try {
              sn = response.outputParameter.bit61.$value.substring(43);
          }
e2e928e50   Adhidarma Hadiwinoto   typo
363
          catch(e) {
aa561d430   Adhidarma Hadiwinoto   sn
364
365
366
367
368
369
              sn = '';
          }
  
          st24message = 'SN=' + sn + '; ' + st24message;
          st24rc = '00';
      }
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
370

4252c2818   Adhidarma Hadiwinoto   penanganan rc
371
372
373
      var message =
          response.outputParameter.resultCode.$value
          + " " + response.outputParameter.resultDesc.$value
aa561d430   Adhidarma Hadiwinoto   sn
374
          + "; BIT39: " + response.outputParameter.bit39.$value
4252c2818   Adhidarma Hadiwinoto   penanganan rc
375
          ;
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
376

4252c2818   Adhidarma Hadiwinoto   penanganan rc
377
378
379
      if (response.outputParameter.resultDesc.$value != st24message) {
          var message = message + " " + st24message;
      }
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
380

d309c00e0   Adhidarma Hadiwinoto   prev balance
381
      message = message + ' -- Prev Balance: ' + balance;
64e3e4b8c   Adhidarma Hadiwinoto   set parsedResponse
382
383
384
385
386
387
388
389
390
391
392
393
394
      var parsedResponse = {
          productCode: response.productCode,
          terminal: response.terminal,
          transactionType: response.transactionType,
          billNumber: response.billNumber,
          amount: response.amount,
          bit61: response.bit61,
          reff: response.reff,
          timeStamp: response.timeStamp,
          resultCode: response.resultCode,
          resultDesc: response.resultDesc,
          bit39: response.bit39
      }
13e965f4e   Adhidarma Hadiwinoto   typo
395
      logger.info('Got result: ' + message, {response: response});
d309c00e0   Adhidarma Hadiwinoto   prev balance
396
      callbackReport(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance);
64e3e4b8c   Adhidarma Hadiwinoto   set parsedResponse
397
      pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: rawResponse, parsed: parsedResponse}, st24rc);
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
398
  }
b6b185202   Adhidarma Hadiwinoto   inputCheck
399
  function createSignature(params, password) {
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
400
      var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
dfcc535b5   Adhidarma Hadiwinoto   coba perbaiki cre...
401
      var plain =
b6b185202   Adhidarma Hadiwinoto   inputCheck
402
          params.userName
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
403
          + passwordHash
b6b185202   Adhidarma Hadiwinoto   inputCheck
404
405
406
407
408
409
410
          + params.productCode
          + params.terminal
          + params.transactionType
          + params.billNumber
          + params.amount
          + params.reff
          + params.timeStamp;
dfcc535b5   Adhidarma Hadiwinoto   coba perbaiki cre...
411

4252c2818   Adhidarma Hadiwinoto   penanganan rc
412
      return crypto.createHash('sha1').update(plain).digest().toString('hex');
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
413
  }
9e047c122   Adhidarma Hadiwinoto   saldoCheck
414
415
416
417
418
419
420
421
422
423
424
425
426
  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...
427
428
  function createBillNumber(destination) {
      return ("0000000000000" + destination).slice(-13);
1f837fd31   Adhidarma Hadiwinoto   on progress
429
430
431
432
  }
  
  exports.start = start;
  exports.topupRequest = topupRequest;
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
433
434
  exports.createSignature = createSignature;
  exports.createBillNumber = createBillNumber;