Blame view

partner-cjk.js 4.21 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
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
85
86
87
88
89
90
  function topupResponseHandler(body) {
      logger.info('Got reply from partner', {body: body});
      xml2js(body, function(err, result) {
          if (err) {
              logger.warn('XML parsing error', {err: err});
          }
          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];
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
94
          var trxid = result.ciwaru.trxid[0];
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
95
          
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
96
          if (hasSuccessKeywords(message)) {
f3b5c6324   Adhidarma Hadiwinoto   parsing hasil
97
98
99
100
101
              var sn = getSNFromMessage(result.ciwaru.msg);
              message = 'SN=' + sn + '; ' + message;
              rc = '00';
          }
          
f4bce3729   Adhidarma Hadiwinoto   perbaikan sn dan ...
102
          callbackReport(trxid, rc, message);
ebb83f38d   Adhidarma Hadiwinoto   alpha version
103
104
105
106
107
108
109
110
111
112
113
114
115
      });
  }
  
  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
116
          password: config.h2h_out.password,
ebb83f38d   Adhidarma Hadiwinoto   alpha version
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
      };
      
      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...
152
153
  exports.start = start;
  exports.topupRequest = topupRequest;
ebb83f38d   Adhidarma Hadiwinoto   alpha version
154
155
156
  exports.calculateSignature = calculateSignature;
  exports.createXmlPayload = createXmlPayload;
  exports.getSNFromMessage = getSNFromMessage;