Blame view

partner-cjk.js 4.45 KB
ebb83f38d   Adhidarma Hadiwinoto   alpha version
1
2
3
4
  var winston = require('winston');
  var crypto = require('crypto');
  var xml = require('xml');
  var url = require('url');
751feb023   Adhidarma Hadiwinoto   require http
5
  var http = require('http');
f47860980   Adhidarma Hadiwinoto   xml2js
6
  var xml2js = require('xml2js').parseString;
ebb83f38d   Adhidarma Hadiwinoto   alpha version
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  
  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 calculateSignature(params) {
c52616d96   Adhidarma Hadiwinoto   password
34
35
      var passwordHash = crypto.createHash('sha1').update(params.password).digest().toString('hex');
      var plain = params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid + passwordHash;
af3eb2c3b   Adhidarma Hadiwinoto   debug calculateSi...
36
37
38
39
40
41
42
43
      var signature = crypto.createHash('sha256').update(plain).digest().toString('hex');
      
      try {
          logger.verbose('Signature calculated', {plain: plain, signature: signature});
      }
      catch(err) {}
      
      return signature;
ebb83f38d   Adhidarma Hadiwinoto   alpha version
44
45
46
  }
  
  function createXmlPayload(params) {
47fa31677   Adhidarma Hadiwinoto   log xml payload
47
48
      var payload = "<?xml version=\"1.0\" ?>
  " + xml({
ebb83f38d   Adhidarma Hadiwinoto   alpha version
49
50
51
52
53
54
55
56
57
58
          ciwaru: [
              {trxtype: params.trxtype},
              {prdcode: params.prdcode},
              {value: params.value},
              {msisdn: params.msisdn},
              {trxid: params.trxid},
              {uid: params.uid},
              {hash: calculateSignature(params)}
          ]
      });
47fa31677   Adhidarma Hadiwinoto   log xml payload
59
      
127db515a   Adhidarma Hadiwinoto   unverbose
60
      //logger.verbose(payload);
af3eb2c3b   Adhidarma Hadiwinoto   debug calculateSi...
61
      return payload;
ebb83f38d   Adhidarma Hadiwinoto   alpha version
62
63
64
  }
  
  function getSNFromMessage(message) {
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
65
      try {
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
66
          var sn_match = message.match(/SN: (\w+)/);
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
67
68
69
70
71
          return sn_match[1];
      }
      catch(err) {
          return '';
      }
ebb83f38d   Adhidarma Hadiwinoto   alpha version
72
  }
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
73
74
75
76
77
78
79
80
81
82
83
  function hasSuccessKeywords(message) {
      var keywords = ['SUKSES', 'Finish'];
      
      var count = keywords.length;
      for (var i=0; i < count; i++) {
          if (message.indexOf(keywords[i]) >= 0) {
              return true;
          }
      }
      return false;
  }
ebb83f38d   Adhidarma Hadiwinoto   alpha version
84
  function topupResponseHandler(body) {
127db515a   Adhidarma Hadiwinoto   unverbose
85
      //logger.info('Got reply from partner', {body: body});
ebb83f38d   Adhidarma Hadiwinoto   alpha version
86
87
      xml2js(body, function(err, result) {
          if (err) {
127db515a   Adhidarma Hadiwinoto   unverbose
88
              logger.warn('Got invalid XML from partner', {err: err, body: body});
ebb83f38d   Adhidarma Hadiwinoto   alpha version
89
90
          }
          logger.info('XML message from partner', {result: result});
e910d789c   Adhidarma Hadiwinoto   debug
91
          
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
92
93
          var rc = '40';
          var message = result.ciwaru.msg[0];
493c39426   Adhidarma Hadiwinoto   trxid dan reqnum
94
95
96
97
98
99
100
101
          
          var trxid = 0;
          try {
              trxid = result.ciwaru.reqnum[0];
          } 
          catch(err) {
              trxid = result.ciwaru.trxid[0];
          }
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
102
          
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
103
          if (hasSuccessKeywords(message)) {
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
104
105
106
107
              var sn = getSNFromMessage(result.ciwaru.msg);
              message = 'SN=' + sn + '; ' + message;
              rc = '00';
          }
b29f987cc   Adhidarma Hadiwinoto   pending trx
108
109
110
          else if (message.indexOf('PENDING') >= 0) {
              rc = '68';
          }
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
111
          
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
112
          callbackReport(trxid, rc, message);
ebb83f38d   Adhidarma Hadiwinoto   alpha version
113
114
115
116
117
118
119
120
121
122
123
124
125
      });
  }
  
  function topupRequest(task, retry) {
      var remoteProduct = task.remoteProduct.split(',');
      
      var params = {
          trxtype: '01',
          prdcode: remoteProduct[0],
          value: remoteProduct[1],
          msisdn: task.destination,
          trxid: task.requestId,
          uid: config.h2h_out.userid,
c52616d96   Adhidarma Hadiwinoto   password
126
          password: config.h2h_out.password,
ebb83f38d   Adhidarma Hadiwinoto   alpha version
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
158
159
160
161
      };
      
      var postBody = createXmlPayload(params);
      
      var partnerUrl = url.parse(config.h2h_out.partner);
      var postRequest = {
          host: partnerUrl.hostname,
          path: partnerUrl.path,
          port: partnerUrl.port,
          method: "POST",
          headers: {
              'Content-Type': 'text/xml',
              'Content-Length': Buffer.byteLength(postBody)
          }
      };
      
      logger.info('POST to partner', {postRequest: postRequest});
      var req = http.request(postRequest, function( res ) {
          
          logger.info('Status code: ' + res.statusCode );
          var buffer = "";
          res.on( "data", function( data ) { buffer = buffer + data; } );
          res.on( "end", function( data ) {             
                  topupResponseHandler(buffer);
          });
      });
      
      req.on('error', function(e) {
          logger.warn('problem with request: ' + e.message);
          callbackReport(task['requestId'], '40', e.message);
      });
  
      req.write(postBody);
      req.end();
  }
2759fd109   Adhidarma Hadiwinoto   exporting start d...
162
163
  exports.start = start;
  exports.topupRequest = topupRequest;
ebb83f38d   Adhidarma Hadiwinoto   alpha version
164
165
166
  exports.calculateSignature = calculateSignature;
  exports.createXmlPayload = createXmlPayload;
  exports.getSNFromMessage = getSNFromMessage;