Commit b9ca3e735ff006f000afd394ffe5d2c957679250

Authored by Adhidarma Hadiwinoto
1 parent 520954cddc
Exists in master

produk tidak tersedia

Showing 1 changed file with 1 additions and 1 deletions Inline Diff

1 var winston = require('winston'); 1 var winston = require('winston');
2 var crypto = require('crypto'); 2 var crypto = require('crypto');
3 var xml = require('xml'); 3 var xml = require('xml');
4 var url = require('url'); 4 var url = require('url');
5 var http = require('http'); 5 var http = require('http');
6 var xml2js = require('xml2js').parseString; 6 var xml2js = require('xml2js').parseString;
7 7
8 var config; 8 var config;
9 var callbackReport; 9 var callbackReport;
10 var aaa; 10 var aaa;
11 var logger; 11 var logger;
12 var options; 12 var options;
13 13
14 function start(_config, _callbackReport, options) { 14 function start(_config, _callbackReport, options) {
15 config = _config; 15 config = _config;
16 callbackReport = _callbackReport 16 callbackReport = _callbackReport
17 17
18 if (options && options.aaa) { 18 if (options && options.aaa) {
19 aaa = options.aaa; 19 aaa = options.aaa;
20 } 20 }
21 21
22 if (options && options.logger) { 22 if (options && options.logger) {
23 logger = options.logger; 23 logger = options.logger;
24 } else { 24 } else {
25 logger = new winston.Logger({ 25 logger = new winston.Logger({
26 transports: [ 26 transports: [
27 new (winston.transports.Console)() 27 new (winston.transports.Console)()
28 ] 28 ]
29 }); 29 });
30 } 30 }
31 } 31 }
32 32
33 function calculateSignature(params) { 33 function calculateSignature(params) {
34 var passwordHash = crypto.createHash('sha1').update(params.password).digest().toString('hex'); 34 var passwordHash = crypto.createHash('sha1').update(params.password).digest().toString('hex');
35 var plain = params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid + passwordHash; 35 var plain = params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid + passwordHash;
36 var signature = crypto.createHash('sha256').update(plain).digest().toString('hex'); 36 var signature = crypto.createHash('sha256').update(plain).digest().toString('hex');
37 37
38 try { 38 try {
39 logger.verbose('Signature calculated', {plain: plain, signature: signature}); 39 logger.verbose('Signature calculated', {plain: plain, signature: signature});
40 } 40 }
41 catch(err) {} 41 catch(err) {}
42 42
43 return signature; 43 return signature;
44 } 44 }
45 45
46 function createXmlPayload(params) { 46 function createXmlPayload(params) {
47 var payload = "<?xml version=\"1.0\" ?>\n" + xml({ 47 var payload = "<?xml version=\"1.0\" ?>\n" + xml({
48 ciwaru: [ 48 ciwaru: [
49 {trxtype: params.trxtype}, 49 {trxtype: params.trxtype},
50 {prdcode: params.prdcode}, 50 {prdcode: params.prdcode},
51 {value: params.value}, 51 {value: params.value},
52 {msisdn: params.msisdn}, 52 {msisdn: params.msisdn},
53 {trxid: params.trxid}, 53 {trxid: params.trxid},
54 {uid: params.uid}, 54 {uid: params.uid},
55 {hash: calculateSignature(params)} 55 {hash: calculateSignature(params)}
56 ] 56 ]
57 }); 57 });
58 58
59 //logger.verbose(payload); 59 //logger.verbose(payload);
60 return payload; 60 return payload;
61 } 61 }
62 62
63 function getSNFromMessage(message) { 63 function getSNFromMessage(message) {
64 try { 64 try {
65 var sn_match = message.match(/SN: (\w+)/); 65 var sn_match = message.match(/SN: (\w+)/);
66 return sn_match[1]; 66 return sn_match[1];
67 } 67 }
68 catch(err) { 68 catch(err) {
69 return ''; 69 return '';
70 } 70 }
71 } 71 }
72 72
73 function hasSuccessKeywords(message) { 73 function hasSuccessKeywords(message) {
74 var keywords = ['SUKSES', 'Finish']; 74 var keywords = ['SUKSES', 'Finish'];
75 75
76 var count = keywords.length; 76 var count = keywords.length;
77 for (var i=0; i < count; i++) { 77 for (var i=0; i < count; i++) {
78 if (message.indexOf(keywords[i]) >= 0) { 78 if (message.indexOf(keywords[i]) >= 0) {
79 return true; 79 return true;
80 } 80 }
81 } 81 }
82 return false; 82 return false;
83 } 83 }
84 84
85 function supplierRcToST24Rc(rc) { 85 function supplierRcToST24Rc(rc) {
86 var rcs = { 86 var rcs = {
87 '0001': '40', 87 '0001': '40',
88 '0019': '51', 88 '0019': '13', // produk tidak tersedia
89 } 89 }
90 90
91 if (rcs[rc]) { 91 if (rcs[rc]) {
92 return rcs[rc]; 92 return rcs[rc];
93 } else { 93 } else {
94 return; 94 return;
95 } 95 }
96 } 96 }
97 97
98 function topupResponseHandler(body) { 98 function topupResponseHandler(body) {
99 //logger.info('Got reply from partner', {body: body}); 99 //logger.info('Got reply from partner', {body: body});
100 xml2js(body, function(err, result) { 100 xml2js(body, function(err, result) {
101 if (err) { 101 if (err) {
102 logger.warn('Got invalid XML from partner', {err: err, body: body}); 102 logger.warn('Got invalid XML from partner', {err: err, body: body});
103 } 103 }
104 logger.info('XML message from partner', {result: result}); 104 logger.info('XML message from partner', {result: result});
105 105
106 var rc = '68'; 106 var rc = '68';
107 var message = result.ciwaru.msg[0]; 107 var message = result.ciwaru.msg[0];
108 108
109 var trxid = 0; 109 var trxid = 0;
110 try { 110 try {
111 trxid = result.ciwaru.reqnum[0]; 111 trxid = result.ciwaru.reqnum[0];
112 } 112 }
113 catch(err) { 113 catch(err) {
114 trxid = result.ciwaru.trxid[0]; 114 trxid = result.ciwaru.trxid[0];
115 } 115 }
116 116
117 if (message.indexOf('PENDING') >= 0) { 117 if (message.indexOf('PENDING') >= 0) {
118 rc = '68'; 118 rc = '68';
119 } 119 }
120 else if (hasSuccessKeywords(message)) { 120 else if (hasSuccessKeywords(message)) {
121 var sn = getSNFromMessage(result.ciwaru.msg); 121 var sn = getSNFromMessage(result.ciwaru.msg);
122 message = 'SN=' + sn + '; ' + message; 122 message = 'SN=' + sn + '; ' + message;
123 rc = '00'; 123 rc = '00';
124 } else { 124 } else {
125 rc = supplierRcToST24Rc(result.ciwaru.rc[0]); 125 rc = supplierRcToST24Rc(result.ciwaru.rc[0]);
126 } 126 }
127 127
128 callbackReport(trxid, rc, message); 128 callbackReport(trxid, rc, message);
129 }); 129 });
130 } 130 }
131 131
132 function topupRequest(task, retry) { 132 function topupRequest(task, retry) {
133 var remoteProduct = task.remoteProduct.split(','); 133 var remoteProduct = task.remoteProduct.split(',');
134 134
135 var params = { 135 var params = {
136 trxtype: '01', 136 trxtype: '01',
137 prdcode: remoteProduct[0], 137 prdcode: remoteProduct[0],
138 value: remoteProduct[1], 138 value: remoteProduct[1],
139 msisdn: task.destination, 139 msisdn: task.destination,
140 trxid: task.requestId, 140 trxid: task.requestId,
141 uid: config.h2h_out.userid, 141 uid: config.h2h_out.userid,
142 password: config.h2h_out.password, 142 password: config.h2h_out.password,
143 }; 143 };
144 144
145 var postBody = createXmlPayload(params); 145 var postBody = createXmlPayload(params);
146 146
147 var partnerUrl = url.parse(config.h2h_out.partner); 147 var partnerUrl = url.parse(config.h2h_out.partner);
148 var postRequest = { 148 var postRequest = {
149 host: partnerUrl.hostname, 149 host: partnerUrl.hostname,
150 path: partnerUrl.path, 150 path: partnerUrl.path,
151 port: partnerUrl.port, 151 port: partnerUrl.port,
152 method: "POST", 152 method: "POST",
153 headers: { 153 headers: {
154 'Content-Type': 'text/xml', 154 'Content-Type': 'text/xml',
155 'Content-Length': Buffer.byteLength(postBody) 155 'Content-Length': Buffer.byteLength(postBody)
156 } 156 }
157 }; 157 };
158 158
159 logger.info('POST to partner', {postRequest: postRequest}); 159 logger.info('POST to partner', {postRequest: postRequest});
160 var req = http.request(postRequest, function( res ) { 160 var req = http.request(postRequest, function( res ) {
161 161
162 logger.info('Status code: ' + res.statusCode ); 162 logger.info('Status code: ' + res.statusCode );
163 var buffer = ""; 163 var buffer = "";
164 res.on( "data", function( data ) { buffer = buffer + data; } ); 164 res.on( "data", function( data ) { buffer = buffer + data; } );
165 res.on( "end", function( data ) { 165 res.on( "end", function( data ) {
166 topupResponseHandler(buffer); 166 topupResponseHandler(buffer);
167 }); 167 });
168 }); 168 });
169 169
170 req.on('error', function(e) { 170 req.on('error', function(e) {
171 logger.warn('problem with request: ' + e.message); 171 logger.warn('problem with request: ' + e.message);
172 callbackReport(task['requestId'], '40', e.message); 172 callbackReport(task['requestId'], '40', e.message);
173 }); 173 });
174 174
175 req.write(postBody); 175 req.write(postBody);
176 req.end(); 176 req.end();
177 } 177 }
178 178
179 exports.start = start; 179 exports.start = start;
180 exports.topupRequest = topupRequest; 180 exports.topupRequest = topupRequest;
181 exports.calculateSignature = calculateSignature; 181 exports.calculateSignature = calculateSignature;
182 exports.createXmlPayload = createXmlPayload; 182 exports.createXmlPayload = createXmlPayload;
183 exports.getSNFromMessage = getSNFromMessage; 183 exports.getSNFromMessage = getSNFromMessage;
184 184