Blame view

partner-kospinjasa.js 5.55 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
42
43
44
  
  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) {
      if (retry === undefined) {
          retry = max_retry;
      }
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
45
      var remoteProduct = task.remoteProduct.split(',');
b6b185202   Adhidarma Hadiwinoto   inputCheck
46
      var params = {
7f796c813   Adhidarma Hadiwinoto   coba easysoap
47
48
49
50
51
52
53
54
          userName: config.h2h_out.userid,
          productCode: remoteProduct[0] ,
          terminal: 'terminal0',
          transactionType: '50',
          billNumber: createBillNumber(task.destination),
          amount: remoteProduct[1],
          bit61: createBillNumber(task.destination),
          reff: task.requestId,
b6b185202   Adhidarma Hadiwinoto   inputCheck
55
          timeStamp: strftime('%d-%m-%Y %H:%M:%S', new Date())
7f796c813   Adhidarma Hadiwinoto   coba easysoap
56
      }
b6b185202   Adhidarma Hadiwinoto   inputCheck
57
58
      var signature = createSignature(params, config.h2h_out.password);
      params.signature = signature;
7f796c813   Adhidarma Hadiwinoto   coba easysoap
59

66ed02be4   Adhidarma Hadiwinoto   debug soapaction
60
      topupRequestSoap(task, params, retry);
7f796c813   Adhidarma Hadiwinoto   coba easysoap
61
  }
b6b185202   Adhidarma Hadiwinoto   inputCheck
62
  function topupRequestSoap(task, params, retry) {
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
63

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

699851497   Adhidarma Hadiwinoto   rearrange params
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
          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) {
66ed02be4   Adhidarma Hadiwinoto   debug soapaction
82
              logger.info('SOAPAction', soapClient.SOAPAction);
3899d9816   Adhidarma Hadiwinoto   log last request
83

1c15cd183   Adhidarma Hadiwinoto   coba pakai node-s...
84
              logger.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint});
3899d9816   Adhidarma Hadiwinoto   log last request
85

5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
86
87
88
89
90
              if (err) {
                  logger.warn('Error requesting service', {err: err});
                  callbackReport(task.requestId, '68', 'something wrong');
                  return;
              }
73c4fa043   Adhidarma Hadiwinoto   apih2hPort
91
92
93
94
95
              var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value;
  
              logger.info('Got result: ' + responseMessageToST24, {result: result});
  
              callbackReport(task.requestId, '68', responseMessageToST24);
1f837fd31   Adhidarma Hadiwinoto   on progress
96
97
98
          });
      });
  }
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
99
100
101
  function topupRequestSoapDIY(task, params, retry) {
      var message = whiskers.render(soapTemplate, params);
      logger.verbose("Generating SOAP message", {message: message});
5831006b7   Adhidarma Hadiwinoto   partner_endpoint
102
      var partnerUrl = url.parse(config.h2h_out.partner_endpoint);
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
103
104
105
106
107
108
      var postRequest = {
          host: partnerUrl.hostname,
          path: partnerUrl.path,
          port: partnerUrl.port,
          method: "POST",
          headers: {
048b9c2aa   Adhidarma Hadiwinoto   coba diy applicat...
109
              'Content-Type': 'application/soap+xml',
5a78b49fa   Adhidarma Hadiwinoto   soapaction
110
111
              'Content-Length': Buffer.byteLength(message),
              'SOAPAction': 'billpayment'
97991a1dc   Adhidarma Hadiwinoto   pakai whiskers
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
          }
      };
  
      logger.info('POST to partner', {postRequest: postRequest});
      var req = http.request(postRequest, function( res ) {
  
          logger.verbose('Request status code: ' + res.statusCode );
          var buffer = "";
  
          res.on( "data", function( data ) {
              buffer = buffer + data;
          });
  
          res.on( "end", function( data ) {
              topupResponseHandler(buffer, task);
          });
  
      });
  
      req.on('error', function(e) {
          logger.warn('problem with request: ' + e.message);
          callbackReport(task.requestId, '68', e.message);
  
          topupRequestRetry(task);
      });
  
      req.write(message);
      req.end();
  }
  
  function topupResponseHandler(response, task) {
      logger.verbose('Got response', {response: response, task: task});
      callbackReport(task.requestId, '68', 'Got response');
  }
  
  function topupRequestRetry(task) {
      task.retry--;
  
      if (task.retry > 0) {
          logger.info('Retrying in ' +  sleepBeforeRetry + 's');
          setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry);
      }
      else {
          logger.warn('Maximum retry for pending status exceeded', {task: task});
      }
  }
7f796c813   Adhidarma Hadiwinoto   coba easysoap
158

b6b185202   Adhidarma Hadiwinoto   inputCheck
159
  function createSignature(params, password) {
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
160
      var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
dfcc535b5   Adhidarma Hadiwinoto   coba perbaiki cre...
161
      var plain =
b6b185202   Adhidarma Hadiwinoto   inputCheck
162
          params.userName
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
163
          + passwordHash
b6b185202   Adhidarma Hadiwinoto   inputCheck
164
165
166
167
168
169
170
          + params.productCode
          + params.terminal
          + params.transactionType
          + params.billNumber
          + params.amount
          + params.reff
          + params.timeStamp;
dfcc535b5   Adhidarma Hadiwinoto   coba perbaiki cre...
171
172
  
      var result = crypto.createHash('sha1').update(plain).digest().toString('hex');
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
173

371375d72   Adhidarma Hadiwinoto   debug signature
174
      if (logger) {
b6b185202   Adhidarma Hadiwinoto   inputCheck
175
          logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password});
371375d72   Adhidarma Hadiwinoto   debug signature
176
      }
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
177
178
179
180
181
      return result;
  }
  
  function createBillNumber(destination) {
      return ("0000000000000" + destination).slice(-13);
1f837fd31   Adhidarma Hadiwinoto   on progress
182
183
184
185
  }
  
  exports.start = start;
  exports.topupRequest = topupRequest;
5a947e400   Adhidarma Hadiwinoto   siap coba dapat r...
186
187
  exports.createSignature = createSignature;
  exports.createBillNumber = createBillNumber;