Commit 6fc0cd5de057ab0b10c0f36950b021901864170c

Authored by Adhidarma Hadiwinoto
1 parent d309c00e08
Exists in master

pass balance to topupResponseBalance

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

partner-kospinjasa.js
1 var winston = require('winston'); 1 var winston = require('winston');
2 var soap = require('soap'); 2 var soap = require('soap');
3 var crypto = require('crypto'); 3 var crypto = require('crypto');
4 var strftime = require('strftime'); 4 var strftime = require('strftime');
5 var fs = require("fs"); 5 var fs = require("fs");
6 var whiskers = require("whiskers"); 6 var whiskers = require("whiskers");
7 var http = require("http"); 7 var http = require("http");
8 var url = require("url"); 8 var url = require("url");
9 9
10 process.chdir(__dirname); 10 process.chdir(__dirname);
11 var soapTemplate = fs.readFileSync("message.xml"); 11 var soapTemplate = fs.readFileSync("message.xml");
12 12
13 var max_retry = 10; 13 var max_retry = 10;
14 var sleep_before_retry = 5000; 14 var sleep_before_retry = 5000;
15 15
16 var config; 16 var config;
17 var callbackReport; 17 var callbackReport;
18 var aaa; 18 var aaa;
19 var logger; 19 var logger;
20 var options; 20 var options;
21 21
22 function start(_config, _callbackReport, options) { 22 function start(_config, _callbackReport, options) {
23 config = _config; 23 config = _config;
24 callbackReport = _callbackReport 24 callbackReport = _callbackReport
25 25
26 if (options && options.aaa) { 26 if (options && options.aaa) {
27 aaa = options.aaa; 27 aaa = options.aaa;
28 } 28 }
29 29
30 if (options && options.logger) { 30 if (options && options.logger) {
31 logger = options.logger; 31 logger = options.logger;
32 } else { 32 } else {
33 logger = new winston.Logger({ 33 logger = new winston.Logger({
34 transports: [ 34 transports: [
35 new (winston.transports.Console)() 35 new (winston.transports.Console)()
36 ] 36 ]
37 }); 37 });
38 } 38 }
39 } 39 }
40 40
41 function topupRequest(task, retry) { 41 function topupRequest(task, retry) {
42 saldoCheck(billpayment, task); 42 saldoCheck(billpayment, task);
43 } 43 }
44 44
45 function saldoCheck(callback, task) { 45 function saldoCheck(callback, task) {
46 46
47 var params = { 47 var params = {
48 userName: config.h2h_out.userid, 48 userName: config.h2h_out.userid,
49 productCode: '00000' , 49 productCode: '00000' ,
50 terminal: 'H2HIPN10', 50 terminal: 'H2HIPN10',
51 transactionType: '61', 51 transactionType: '61',
52 reff: Math.ceil( Math.random() * 99999999 ), 52 reff: Math.ceil( Math.random() * 99999999 ),
53 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 53 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
54 } 54 }
55 55
56 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password); 56 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password);
57 57
58 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 58 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
59 59
60 if (err) { 60 if (err) {
61 logger.warn('Error creating soap client for saldoCheck', {err: err}); 61 logger.warn('Error creating soap client for saldoCheck', {err: err});
62 callbackReport(task.requestId, '40', 'Error creating soap client for saldoCheck: ' + err); 62 callbackReport(task.requestId, '40', 'Error creating soap client for saldoCheck: ' + err);
63 return; 63 return;
64 } 64 }
65 65
66 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params}); 66 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params});
67 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) { 67 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) {
68 68
69 logger.verbose( 69 logger.verbose(
70 'Got saldoCheck response', 70 'Got saldoCheck response',
71 { 71 {
72 lastEndpoint: soapClient.lastEndpoint, 72 lastEndpoint: soapClient.lastEndpoint,
73 lastRequest: soapClient.lastRequest, 73 lastRequest: soapClient.lastRequest,
74 lastMessage: soapClient.lastMessage, 74 lastMessage: soapClient.lastMessage,
75 lastResponse: soapClient.lastResponse, 75 lastResponse: soapClient.lastResponse,
76 } 76 }
77 ); 77 );
78 78
79 if (err) { 79 if (err) {
80 logger.warn('Error requesting saldoCheck', {err: err}); 80 logger.warn('Error requesting saldoCheck', {err: err});
81 callbackReport(task.requestId, '40', 'Gagal check saldo'); 81 callbackReport(task.requestId, '40', 'Gagal check saldo');
82 } 82 }
83 83
84 var balance; 84 var balance;
85 logger.verbose('saldoCheck result', {result: result}); 85 logger.verbose('saldoCheck result', {result: result});
86 86
87 try { 87 try {
88 balance = result.outputParameter.bit61.$value; 88 balance = result.outputParameter.bit61.$value;
89 } 89 }
90 catch(e) { 90 catch(e) {
91 balance = 'UNKNOWN'; 91 balance = 'UNKNOWN';
92 } 92 }
93 93
94 94
95 if (task) { 95 if (task) {
96 callback(task, balance); 96 callback(task, balance);
97 } 97 }
98 }); 98 });
99 }); 99 });
100 100
101 } 101 }
102 102
103 function billpayment(task, balance) { 103 function billpayment(task, balance) {
104 104
105 var remoteProduct = task.remoteProduct.split(','); 105 var remoteProduct = task.remoteProduct.split(',');
106 var params = { 106 var params = {
107 userName: config.h2h_out.userid, 107 userName: config.h2h_out.userid,
108 productCode: remoteProduct[0] , 108 productCode: remoteProduct[0] ,
109 terminal: 'H2HIPN10', 109 terminal: 'H2HIPN10',
110 transactionType: '50', 110 transactionType: '50',
111 billNumber: createBillNumber(task.destination), 111 billNumber: createBillNumber(task.destination),
112 amount: remoteProduct[1], 112 amount: remoteProduct[1],
113 bit61: createBillNumber(task.destination), 113 bit61: createBillNumber(task.destination),
114 reff: task.requestId, 114 reff: task.requestId,
115 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 115 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
116 } 116 }
117 117
118 var signature = createSignature(params, config.h2h_out.password); 118 var signature = createSignature(params, config.h2h_out.password);
119 params.signature = signature; 119 params.signature = signature;
120 120
121 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 121 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
122 122
123 var _params = { 123 var _params = {
124 userName: params.userName, 124 userName: params.userName,
125 signature: params.signature, 125 signature: params.signature,
126 productCode: params.productCode, 126 productCode: params.productCode,
127 terminal: params.terminal, 127 terminal: params.terminal,
128 transactionType: params.transactionType, 128 transactionType: params.transactionType,
129 billNumber: params.billNumber, 129 billNumber: params.billNumber,
130 amount: params.amount, 130 amount: params.amount,
131 bit61: params.bit61, 131 bit61: params.bit61,
132 reff: params.reff, 132 reff: params.reff,
133 timeStamp: params.timeStamp 133 timeStamp: params.timeStamp
134 } 134 }
135 135
136 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); 136 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
137 137
138 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { 138 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
139 logger.verbose( 139 logger.verbose(
140 'Got response', 140 'Got response',
141 { 141 {
142 lastEndpoint: soapClient.lastEndpoint, 142 lastEndpoint: soapClient.lastEndpoint,
143 lastRequest: soapClient.lastRequest, 143 lastRequest: soapClient.lastRequest,
144 lastMessage: soapClient.lastMessage, 144 lastMessage: soapClient.lastMessage,
145 lastResponse: soapClient.lastResponse, 145 lastResponse: soapClient.lastResponse,
146 } 146 }
147 ); 147 );
148 148
149 if (err) { 149 if (err) {
150 logger.warn('Error requesting service', {err: err}); 150 logger.warn('Error requesting service', {err: err});
151 callbackReport(task.requestId, '68', 'something wrong'); 151 callbackReport(task.requestId, '68', 'something wrong');
152 return; 152 return;
153 } 153 }
154 154
155 topupResponseHandler(task, result); 155 topupResponseHandler(task, result, balance);
156 }); 156 });
157 }); 157 });
158 } 158 }
159 159
160 function topupResponseHandler(task, response) { 160 function topupResponseHandler(task, response, balance) {
161 var st24rc = '68'; 161 var st24rc = '68';
162 var st24message = response.outputParameter.resultDesc.$value; 162 var st24message = response.outputParameter.resultDesc.$value;
163 163
164 var resultCode = parseInt(response.outputParameter.resultCode.$value); 164 var resultCode = parseInt(response.outputParameter.resultCode.$value);
165 var bit39 = parseInt(response.outputParameter.bit39.$value); 165 var bit39 = parseInt(response.outputParameter.bit39.$value);
166 166
167 if ( resultCode == 1 ) { 167 if ( resultCode == 1 ) {
168 // product disabled 168 // product disabled
169 st24rc = '13'; 169 st24rc = '13';
170 } 170 }
171 else if ( resultCode == 2 ) { 171 else if ( resultCode == 2 ) {
172 // prodcode disable 172 // prodcode disable
173 st24rc = '13'; 173 st24rc = '13';
174 } 174 }
175 else if ( resultCode == 3 ) { 175 else if ( resultCode == 3 ) {
176 // duplicate reff 176 // duplicate reff
177 st24rc = '55'; 177 st24rc = '55';
178 } 178 }
179 else if ( resultCode == 4 ) { 179 else if ( resultCode == 4 ) {
180 // not enough balance 180 // not enough balance
181 st24rc = '40'; 181 st24rc = '40';
182 } 182 }
183 else if ( resultCode == 5 ) { 183 else if ( resultCode == 5 ) {
184 // username blocked 184 // username blocked
185 st24rc = '40'; 185 st24rc = '40';
186 } 186 }
187 else if ( resultCode == 6 ) { 187 else if ( resultCode == 6 ) {
188 // not exists username 188 // not exists username
189 st24rc = '40'; 189 st24rc = '40';
190 } 190 }
191 else if ( resultCode == 11 ) { 191 else if ( resultCode == 11 ) {
192 // invalid request 192 // invalid request
193 st24rc = '40' 193 st24rc = '40'
194 } 194 }
195 else if ( resultCode == 12 ) { 195 else if ( resultCode == 12 ) {
196 // no route to host 196 // no route to host
197 st24rc = '40' 197 st24rc = '40'
198 } 198 }
199 else if ( resultCode == 13 ) { 199 else if ( resultCode == 13 ) {
200 // invalid signature 200 // invalid signature
201 st24rc = '40' 201 st24rc = '40'
202 } 202 }
203 else if ( bit39 == 6 ) { 203 else if ( bit39 == 6 ) {
204 st24rc = '40'; 204 st24rc = '40';
205 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; 205 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
206 } 206 }
207 else if ( bit39 == 12 ) { 207 else if ( bit39 == 12 ) {
208 st24rc = '40'; 208 st24rc = '40';
209 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; 209 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
210 } 210 }
211 else if ( bit39 == 13 ) { 211 else if ( bit39 == 13 ) {
212 st24rc = '13'; 212 st24rc = '13';
213 st24message = 'Invalid voucher nominal'; 213 st24message = 'Invalid voucher nominal';
214 } 214 }
215 else if ( bit39 == 14 ) { 215 else if ( bit39 == 14 ) {
216 st24rc = '14'; 216 st24rc = '14';
217 st24message = 'MSISDN tidak ditemukan'; 217 st24message = 'MSISDN tidak ditemukan';
218 } 218 }
219 else if ( bit39 == 30 ) { 219 else if ( bit39 == 30 ) {
220 st24rc = '40'; 220 st24rc = '40';
221 st24message = 'Format Error'; 221 st24message = 'Format Error';
222 } 222 }
223 else if ( bit39 == 31 ) { 223 else if ( bit39 == 31 ) {
224 st24rc = '40'; 224 st24rc = '40';
225 st24message = 'Kode bank tidak terdaftar'; 225 st24message = 'Kode bank tidak terdaftar';
226 } 226 }
227 else if ( bit39 == 63 ) { 227 else if ( bit39 == 63 ) {
228 st24rc = '40'; 228 st24rc = '40';
229 st24message = 'Reversal denied'; 229 st24message = 'Reversal denied';
230 } 230 }
231 else if ( bit39 == 68 ) { 231 else if ( bit39 == 68 ) {
232 st24rc = '68'; 232 st24rc = '68';
233 st24message = 'Transaksi sedang dalam proses'; 233 st24message = 'Transaksi sedang dalam proses';
234 } 234 }
235 else if ( bit39 == 69 ) { 235 else if ( bit39 == 69 ) {
236 st24rc = '68'; 236 st24rc = '68';
237 st24message = 'Respon Ok lebih dari 24 detik'; 237 st24message = 'Respon Ok lebih dari 24 detik';
238 } 238 }
239 else if ( bit39 == 70 ) { 239 else if ( bit39 == 70 ) {
240 st24rc = '13'; 240 st24rc = '13';
241 st24message = 'Voucher out of stock'; 241 st24message = 'Voucher out of stock';
242 } 242 }
243 else if ( bit39 == 79 ) { 243 else if ( bit39 == 79 ) {
244 st24rc = '14'; 244 st24rc = '14';
245 st24message = 'Phone number is blocked by Telkomsel'; 245 st24message = 'Phone number is blocked by Telkomsel';
246 } 246 }
247 else if ( bit39 == 81 ) { 247 else if ( bit39 == 81 ) {
248 st24rc = '14'; 248 st24rc = '14';
249 st24message = 'Phone number is expired'; 249 st24message = 'Phone number is expired';
250 } 250 }
251 else if ( bit39 == 89 ) { 251 else if ( bit39 == 89 ) {
252 st24rc = '40'; 252 st24rc = '40';
253 st24message = 'Link to billing provider is down'; 253 st24message = 'Link to billing provider is down';
254 } 254 }
255 else if ( bit39 == 91 ) { 255 else if ( bit39 == 91 ) {
256 st24rc = '40'; 256 st24rc = '40';
257 st24message = 'Database problem'; 257 st24message = 'Database problem';
258 } 258 }
259 else if ( bit39 == 92 ) { 259 else if ( bit39 == 92 ) {
260 st24rc = '40'; 260 st24rc = '40';
261 st24message = 'Unable to route transaction'; 261 st24message = 'Unable to route transaction';
262 } 262 }
263 else if ( bit39 == 94 ) { 263 else if ( bit39 == 94 ) {
264 st24rc = '40'; 264 st24rc = '40';
265 st24message = 'Duplicate reversal request'; 265 st24message = 'Duplicate reversal request';
266 } 266 }
267 else if ( resultCode == 0 && bit39 == 0) { 267 else if ( resultCode == 0 && bit39 == 0) {
268 268
269 var sn = ''; 269 var sn = '';
270 270
271 try { 271 try {
272 sn = response.outputParameter.bit61.$value.substring(43); 272 sn = response.outputParameter.bit61.$value.substring(43);
273 } 273 }
274 catch(e) { 274 catch(e) {
275 sn = ''; 275 sn = '';
276 } 276 }
277 277
278 st24message = 'SN=' + sn + '; ' + st24message; 278 st24message = 'SN=' + sn + '; ' + st24message;
279 st24rc = '00'; 279 st24rc = '00';
280 } 280 }
281 281
282 var message = 282 var message =
283 response.outputParameter.resultCode.$value 283 response.outputParameter.resultCode.$value
284 + " " + response.outputParameter.resultDesc.$value 284 + " " + response.outputParameter.resultDesc.$value
285 + "; BIT39: " + response.outputParameter.bit39.$value 285 + "; BIT39: " + response.outputParameter.bit39.$value
286 ; 286 ;
287 287
288 if (response.outputParameter.resultDesc.$value != st24message) { 288 if (response.outputParameter.resultDesc.$value != st24message) {
289 var message = message + " " + st24message; 289 var message = message + " " + st24message;
290 } 290 }
291 291
292 message = message + ' -- Prev Balance: ' + balance; 292 message = message + ' -- Prev Balance: ' + balance;
293 293
294 logger.info('Got result: ' + message, {response: response}); 294 logger.info('Got result: ' + message, {response: response});
295 callbackReport(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance); 295 callbackReport(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance);
296 } 296 }
297 297
298 function createSignature(params, password) { 298 function createSignature(params, password) {
299 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 299 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
300 var plain = 300 var plain =
301 params.userName 301 params.userName
302 + passwordHash 302 + passwordHash
303 + params.productCode 303 + params.productCode
304 + params.terminal 304 + params.terminal
305 + params.transactionType 305 + params.transactionType
306 + params.billNumber 306 + params.billNumber
307 + params.amount 307 + params.amount
308 + params.reff 308 + params.reff
309 + params.timeStamp; 309 + params.timeStamp;
310 310
311 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 311 return crypto.createHash('sha1').update(plain).digest().toString('hex');
312 } 312 }
313 313
314 function createSignatureForSaldoCheck(params, password) { 314 function createSignatureForSaldoCheck(params, password) {
315 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 315 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
316 var plain = 316 var plain =
317 params.userName 317 params.userName
318 + passwordHash 318 + passwordHash
319 + params.productCode 319 + params.productCode
320 + params.terminal 320 + params.terminal
321 + params.transactionType 321 + params.transactionType
322 + params.reff 322 + params.reff
323 + params.timeStamp; 323 + params.timeStamp;
324 324
325 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 325 return crypto.createHash('sha1').update(plain).digest().toString('hex');
326 } 326 }
327 327
328 function createBillNumber(destination) { 328 function createBillNumber(destination) {
329 return ("0000000000000" + destination).slice(-13); 329 return ("0000000000000" + destination).slice(-13);
330 } 330 }
331 331
332 exports.start = start; 332 exports.start = start;
333 exports.topupRequest = topupRequest; 333 exports.topupRequest = topupRequest;
334 exports.createSignature = createSignature; 334 exports.createSignature = createSignature;
335 exports.createBillNumber = createBillNumber; 335 exports.createBillNumber = createBillNumber;
336 336