Commit 64e3e4b8c70d03304e713ba70abc6de94dcf3317

Authored by Adhidarma Hadiwinoto
1 parent 2af28a3988
Exists in master

set parsedResponse

Showing 1 changed file with 16 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 var mongoClient = require('mongodb').MongoClient; 9 var mongoClient = require('mongodb').MongoClient;
10 var moment = require('moment'); 10 var moment = require('moment');
11 11
12 process.chdir(__dirname); 12 process.chdir(__dirname);
13 var soapTemplate = fs.readFileSync("message.xml"); 13 var soapTemplate = fs.readFileSync("message.xml");
14 14
15 var max_retry = 10; 15 var max_retry = 10;
16 var sleep_before_retry = 5000; 16 var sleep_before_retry = 5000;
17 17
18 var config; 18 var config;
19 var callbackReport; 19 var callbackReport;
20 var aaa; 20 var aaa;
21 var logger; 21 var logger;
22 var options; 22 var options;
23 var mongodb; 23 var mongodb;
24 24
25 function start(_config, _callbackReport, options) { 25 function start(_config, _callbackReport, options) {
26 config = _config; 26 config = _config;
27 callbackReport = _callbackReport 27 callbackReport = _callbackReport
28 28
29 if (options && options.aaa) { 29 if (options && options.aaa) {
30 aaa = options.aaa; 30 aaa = options.aaa;
31 } 31 }
32 32
33 if (options && options.logger) { 33 if (options && options.logger) {
34 logger = options.logger; 34 logger = options.logger;
35 } else { 35 } else {
36 logger = new winston.Logger({ 36 logger = new winston.Logger({
37 transports: [ 37 transports: [
38 new (winston.transports.Console)() 38 new (winston.transports.Console)()
39 ] 39 ]
40 }); 40 });
41 } 41 }
42 42
43 initMongoClient(); 43 initMongoClient();
44 } 44 }
45 45
46 function initMongoClient() { 46 function initMongoClient() {
47 if (!config || !config.mongodb || !config.mongodb.url) { 47 if (!config || !config.mongodb || !config.mongodb.url) {
48 return; 48 return;
49 } 49 }
50 50
51 try { 51 try {
52 var url = config.mongodb.url; 52 var url = config.mongodb.url;
53 53
54 mongoClient.connect(url, function(err, db) { 54 mongoClient.connect(url, function(err, db) {
55 if (err) { 55 if (err) {
56 logger.warn('Failed to connect to mongodb', {err: err}); 56 logger.warn('Failed to connect to mongodb', {err: err});
57 return; 57 return;
58 } 58 }
59 mongodb = db; 59 mongodb = db;
60 logger.info('MongoDB connected'); 60 logger.info('MongoDB connected');
61 }); 61 });
62 } 62 }
63 catch(err) { 63 catch(err) {
64 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 64 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
65 } 65 }
66 } 66 }
67 67
68 function insertTaskToMongoDb(task) { 68 function insertTaskToMongoDb(task) {
69 if (!isMongoReady()) { return; } 69 if (!isMongoReady()) { return; }
70 70
71 task.supplier = config.globals.gateway_name; 71 task.supplier = config.globals.gateway_name;
72 task.rc = '68'; 72 task.rc = '68';
73 73
74 try { 74 try {
75 mongodb.collection(config.mongodb.collection).insertOne(task); 75 mongodb.collection(config.mongodb.collection).insertOne(task);
76 } 76 }
77 catch(err) { 77 catch(err) {
78 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task}); 78 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
79 } 79 }
80 } 80 }
81 81
82 function pushResponseToMongoDb(task, response, rc) { 82 function pushResponseToMongoDb(task, response, rc) {
83 if (!isMongoReady()) { return; } 83 if (!isMongoReady()) { return; }
84 84
85 85
86 try { 86 try {
87 if (!response.ts) { 87 if (!response.ts) {
88 response.ts = strftime('%Y-%m-%d %H:%M:%S', new Date()); 88 response.ts = strftime('%Y-%m-%d %H:%M:%S', new Date());
89 } 89 }
90 90
91 mongodb.collection(config.mongodb.collection).updateOne( 91 mongodb.collection(config.mongodb.collection).updateOne(
92 {requestId: task.requestId}, 92 {requestId: task.requestId},
93 { 93 {
94 $set: { 94 $set: {
95 lastResponse: response, 95 lastResponse: response,
96 supplier: config.globals.gateway_name, 96 supplier: config.globals.gateway_name,
97 rc: rc 97 rc: rc
98 }, 98 },
99 $push: { 99 $push: {
100 responses: response 100 responses: response
101 } 101 }
102 }, 102 },
103 function(err, result) { 103 function(err, result) {
104 if (err) { 104 if (err) {
105 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response}); 105 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
106 return; 106 return;
107 } 107 }
108 } 108 }
109 ); 109 );
110 } 110 }
111 catch(err) { 111 catch(err) {
112 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response}); 112 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
113 } 113 }
114 } 114 }
115 115
116 function isMongoReady() { 116 function isMongoReady() {
117 if (!config.mongodb) { return; } 117 if (!config.mongodb) { return; }
118 if (!config.mongodb.collection) { return; } 118 if (!config.mongodb.collection) { return; }
119 if (!mongodb) { return; } 119 if (!mongodb) { return; }
120 120
121 return true; 121 return true;
122 } 122 }
123 123
124 function topupRequest(task, retry) { 124 function topupRequest(task, retry) {
125 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); 125 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
126 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); 126 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
127 127
128 insertTaskToMongoDb(task); 128 insertTaskToMongoDb(task);
129 129
130 saldoCheck(billpayment, task); 130 saldoCheck(billpayment, task);
131 } 131 }
132 132
133 function saldoCheck(callback, task) { 133 function saldoCheck(callback, task) {
134 134
135 var params = { 135 var params = {
136 userName: config.h2h_out.userid, 136 userName: config.h2h_out.userid,
137 productCode: '00000' , 137 productCode: '00000' ,
138 terminal: 'H2HIPN10', 138 terminal: 'H2HIPN10',
139 transactionType: '61', 139 transactionType: '61',
140 reff: Math.ceil( Math.random() * 99999999 ), 140 reff: Math.ceil( Math.random() * 99999999 ),
141 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 141 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
142 } 142 }
143 143
144 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password); 144 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password);
145 145
146 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 146 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
147 147
148 if (err) { 148 if (err) {
149 149
150 var errorMessage = 'Error creating soap client for saldoCheck: ' + err; 150 var errorMessage = 'Error creating soap client for saldoCheck: ' + err;
151 151
152 logger.warn(errorMessage, {err: err}); 152 logger.warn(errorMessage, {err: err});
153 callbackReport(task.requestId, '40', errorMessage); 153 callbackReport(task.requestId, '40', errorMessage);
154 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40'); 154 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40');
155 155
156 return; 156 return;
157 } 157 }
158 158
159 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params}); 159 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params});
160 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) { 160 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) {
161 161
162 logger.verbose( 162 logger.verbose(
163 'Got saldoCheck response', 163 'Got saldoCheck response',
164 { 164 {
165 lastEndpoint: soapClient.lastEndpoint, 165 lastEndpoint: soapClient.lastEndpoint,
166 lastRequest: soapClient.lastRequest, 166 lastRequest: soapClient.lastRequest,
167 lastMessage: soapClient.lastMessage, 167 lastMessage: soapClient.lastMessage,
168 lastResponse: soapClient.lastResponse, 168 lastResponse: soapClient.lastResponse,
169 } 169 }
170 ); 170 );
171 171
172 if (err) { 172 if (err) {
173 var errorMessage = 'Error requesting saldoCheck: ' + err; 173 var errorMessage = 'Error requesting saldoCheck: ' + err;
174 174
175 logger.warn(errorMessage, {err: err}); 175 logger.warn(errorMessage, {err: err});
176 callbackReport(task.requestId, '40', errorMessage); 176 callbackReport(task.requestId, '40', errorMessage);
177 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40'); 177 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: errorMessage}, '40');
178 } 178 }
179 179
180 var balance; 180 var balance;
181 logger.verbose('saldoCheck result', {result: result}); 181 logger.verbose('saldoCheck result', {result: result});
182 182
183 try { 183 try {
184 balance = result.outputParameter.bit61.$value; 184 balance = result.outputParameter.bit61.$value;
185 } 185 }
186 catch(e) { 186 catch(e) {
187 balance = 'UNKNOWN'; 187 balance = 'UNKNOWN';
188 } 188 }
189 189
190 190
191 if (task) { 191 if (task) {
192 callback(task, balance); 192 callback(task, balance);
193 } 193 }
194 }); 194 });
195 }); 195 });
196 196
197 } 197 }
198 198
199 function billpayment(task, balance) { 199 function billpayment(task, balance) {
200 200
201 var remoteProduct = task.remoteProduct.split(','); 201 var remoteProduct = task.remoteProduct.split(',');
202 var params = { 202 var params = {
203 userName: config.h2h_out.userid, 203 userName: config.h2h_out.userid,
204 productCode: remoteProduct[0] , 204 productCode: remoteProduct[0] ,
205 terminal: 'H2HIPN10', 205 terminal: 'H2HIPN10',
206 transactionType: '50', 206 transactionType: '50',
207 billNumber: createBillNumber(task.destination), 207 billNumber: createBillNumber(task.destination),
208 amount: remoteProduct[1], 208 amount: remoteProduct[1],
209 bit61: createBillNumber(task.destination), 209 bit61: createBillNumber(task.destination),
210 reff: task.requestId, 210 reff: task.requestId,
211 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 211 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
212 } 212 }
213 213
214 var signature = createSignature(params, config.h2h_out.password); 214 var signature = createSignature(params, config.h2h_out.password);
215 params.signature = signature; 215 params.signature = signature;
216 216
217 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 217 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
218 218
219 var _params = { 219 var _params = {
220 userName: params.userName, 220 userName: params.userName,
221 signature: params.signature, 221 signature: params.signature,
222 productCode: params.productCode, 222 productCode: params.productCode,
223 terminal: params.terminal, 223 terminal: params.terminal,
224 transactionType: params.transactionType, 224 transactionType: params.transactionType,
225 billNumber: params.billNumber, 225 billNumber: params.billNumber,
226 amount: params.amount, 226 amount: params.amount,
227 bit61: params.bit61, 227 bit61: params.bit61,
228 reff: params.reff, 228 reff: params.reff,
229 timeStamp: params.timeStamp 229 timeStamp: params.timeStamp
230 } 230 }
231 231
232 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); 232 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
233 233
234 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { 234 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
235 logger.verbose( 235 logger.verbose(
236 'Got response', 236 'Got response',
237 { 237 {
238 lastEndpoint: soapClient.lastEndpoint, 238 lastEndpoint: soapClient.lastEndpoint,
239 lastRequest: soapClient.lastRequest, 239 lastRequest: soapClient.lastRequest,
240 lastMessage: soapClient.lastMessage, 240 lastMessage: soapClient.lastMessage,
241 lastResponse: soapClient.lastResponse, 241 lastResponse: soapClient.lastResponse,
242 } 242 }
243 ); 243 );
244 244
245 if (err) { 245 if (err) {
246 var errorMessage = 'Error requesting service: ' + err; 246 var errorMessage = 'Error requesting service: ' + err;
247 247
248 logger.warn(errorMessage, {err: err}); 248 logger.warn(errorMessage, {err: err});
249 callbackReport(task.requestId, '68', errorMessage); 249 callbackReport(task.requestId, '68', errorMessage);
250 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: soapClient.lastResponse, parsed: result}, '68'); 250 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: soapClient.lastResponse}, '68');
251 251
252 return; 252 return;
253 } 253 }
254 254
255 topupResponseHandler(task, result, balance, soapClient.lastResponse); 255 topupResponseHandler(task, result, balance, soapClient.lastResponse);
256 }); 256 });
257 }); 257 });
258 } 258 }
259 259
260 function topupResponseHandler(task, response, balance, rawResponse) { 260 function topupResponseHandler(task, response, balance, rawResponse) {
261 var st24rc = '68'; 261 var st24rc = '68';
262 var st24message = response.outputParameter.resultDesc.$value; 262 var st24message = response.outputParameter.resultDesc.$value;
263 263
264 var resultCode = parseInt(response.outputParameter.resultCode.$value); 264 var resultCode = parseInt(response.outputParameter.resultCode.$value);
265 var bit39 = parseInt(response.outputParameter.bit39.$value); 265 var bit39 = parseInt(response.outputParameter.bit39.$value);
266 266
267 if ( resultCode == 1 ) { 267 if ( resultCode == 1 ) {
268 // product disabled 268 // product disabled
269 st24rc = '13'; 269 st24rc = '13';
270 } 270 }
271 else if ( resultCode == 2 ) { 271 else if ( resultCode == 2 ) {
272 // prodcode disable 272 // prodcode disable
273 st24rc = '13'; 273 st24rc = '13';
274 } 274 }
275 else if ( resultCode == 3 ) { 275 else if ( resultCode == 3 ) {
276 // duplicate reff 276 // duplicate reff
277 st24rc = '55'; 277 st24rc = '55';
278 } 278 }
279 else if ( resultCode == 4 ) { 279 else if ( resultCode == 4 ) {
280 // not enough balance 280 // not enough balance
281 st24rc = '40'; 281 st24rc = '40';
282 } 282 }
283 else if ( resultCode == 5 ) { 283 else if ( resultCode == 5 ) {
284 // username blocked 284 // username blocked
285 st24rc = '40'; 285 st24rc = '40';
286 } 286 }
287 else if ( resultCode == 6 ) { 287 else if ( resultCode == 6 ) {
288 // not exists username 288 // not exists username
289 st24rc = '40'; 289 st24rc = '40';
290 } 290 }
291 else if ( resultCode == 11 ) { 291 else if ( resultCode == 11 ) {
292 // invalid request 292 // invalid request
293 st24rc = '40' 293 st24rc = '40'
294 } 294 }
295 else if ( resultCode == 12 ) { 295 else if ( resultCode == 12 ) {
296 // no route to host 296 // no route to host
297 st24rc = '40' 297 st24rc = '40'
298 } 298 }
299 else if ( resultCode == 13 ) { 299 else if ( resultCode == 13 ) {
300 // invalid signature 300 // invalid signature
301 st24rc = '40' 301 st24rc = '40'
302 } 302 }
303 else if ( bit39 == 6 ) { 303 else if ( bit39 == 6 ) {
304 st24rc = '40'; 304 st24rc = '40';
305 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; 305 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
306 } 306 }
307 else if ( bit39 == 12 ) { 307 else if ( bit39 == 12 ) {
308 st24rc = '40'; 308 st24rc = '40';
309 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; 309 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
310 } 310 }
311 else if ( bit39 == 13 ) { 311 else if ( bit39 == 13 ) {
312 st24rc = '13'; 312 st24rc = '13';
313 st24message = 'Invalid voucher nominal'; 313 st24message = 'Invalid voucher nominal';
314 } 314 }
315 else if ( bit39 == 14 ) { 315 else if ( bit39 == 14 ) {
316 st24rc = '14'; 316 st24rc = '14';
317 st24message = 'MSISDN tidak ditemukan'; 317 st24message = 'MSISDN tidak ditemukan';
318 } 318 }
319 else if ( bit39 == 30 ) { 319 else if ( bit39 == 30 ) {
320 st24rc = '40'; 320 st24rc = '40';
321 st24message = 'Format Error'; 321 st24message = 'Format Error';
322 } 322 }
323 else if ( bit39 == 31 ) { 323 else if ( bit39 == 31 ) {
324 st24rc = '40'; 324 st24rc = '40';
325 st24message = 'Kode bank tidak terdaftar'; 325 st24message = 'Kode bank tidak terdaftar';
326 } 326 }
327 else if ( bit39 == 63 ) { 327 else if ( bit39 == 63 ) {
328 st24rc = '40'; 328 st24rc = '40';
329 st24message = 'Reversal denied'; 329 st24message = 'Reversal denied';
330 } 330 }
331 else if ( bit39 == 68 ) { 331 else if ( bit39 == 68 ) {
332 st24rc = '68'; 332 st24rc = '68';
333 st24message = 'Transaksi sedang dalam proses'; 333 st24message = 'Transaksi sedang dalam proses';
334 } 334 }
335 else if ( bit39 == 69 ) { 335 else if ( bit39 == 69 ) {
336 st24rc = '68'; 336 st24rc = '68';
337 st24message = 'Respon Ok lebih dari 24 detik'; 337 st24message = 'Respon Ok lebih dari 24 detik';
338 } 338 }
339 else if ( bit39 == 70 ) { 339 else if ( bit39 == 70 ) {
340 st24rc = '13'; 340 st24rc = '13';
341 st24message = 'Voucher out of stock'; 341 st24message = 'Voucher out of stock';
342 } 342 }
343 else if ( bit39 == 79 ) { 343 else if ( bit39 == 79 ) {
344 st24rc = '14'; 344 st24rc = '14';
345 st24message = 'Phone number is blocked by Telkomsel'; 345 st24message = 'Phone number is blocked by Telkomsel';
346 } 346 }
347 else if ( bit39 == 81 ) { 347 else if ( bit39 == 81 ) {
348 st24rc = '14'; 348 st24rc = '14';
349 st24message = 'Phone number is expired'; 349 st24message = 'Phone number is expired';
350 } 350 }
351 else if ( bit39 == 89 ) { 351 else if ( bit39 == 89 ) {
352 st24rc = '40'; 352 st24rc = '40';
353 st24message = 'Link to billing provider is down'; 353 st24message = 'Link to billing provider is down';
354 } 354 }
355 else if ( bit39 == 91 ) { 355 else if ( bit39 == 91 ) {
356 st24rc = '40'; 356 st24rc = '40';
357 st24message = 'Database problem'; 357 st24message = 'Database problem';
358 } 358 }
359 else if ( bit39 == 92 ) { 359 else if ( bit39 == 92 ) {
360 st24rc = '40'; 360 st24rc = '40';
361 st24message = 'Unable to route transaction'; 361 st24message = 'Unable to route transaction';
362 } 362 }
363 else if ( bit39 == 94 ) { 363 else if ( bit39 == 94 ) {
364 st24rc = '40'; 364 st24rc = '40';
365 st24message = 'Duplicate reversal request'; 365 st24message = 'Duplicate reversal request';
366 } 366 }
367 else if ( resultCode == 0 && bit39 == 0) { 367 else if ( resultCode == 0 && bit39 == 0) {
368 368
369 var sn = ''; 369 var sn = '';
370 370
371 try { 371 try {
372 sn = response.outputParameter.bit61.$value.substring(43); 372 sn = response.outputParameter.bit61.$value.substring(43);
373 } 373 }
374 catch(e) { 374 catch(e) {
375 sn = ''; 375 sn = '';
376 } 376 }
377 377
378 st24message = 'SN=' + sn + '; ' + st24message; 378 st24message = 'SN=' + sn + '; ' + st24message;
379 st24rc = '00'; 379 st24rc = '00';
380 } 380 }
381 381
382 var message = 382 var message =
383 response.outputParameter.resultCode.$value 383 response.outputParameter.resultCode.$value
384 + " " + response.outputParameter.resultDesc.$value 384 + " " + response.outputParameter.resultDesc.$value
385 + "; BIT39: " + response.outputParameter.bit39.$value 385 + "; BIT39: " + response.outputParameter.bit39.$value
386 ; 386 ;
387 387
388 if (response.outputParameter.resultDesc.$value != st24message) { 388 if (response.outputParameter.resultDesc.$value != st24message) {
389 var message = message + " " + st24message; 389 var message = message + " " + st24message;
390 } 390 }
391 391
392 message = message + ' -- Prev Balance: ' + balance; 392 message = message + ' -- Prev Balance: ' + balance;
393 393
394 var parsedResponse = {
395 productCode: response.productCode,
396 terminal: response.terminal,
397 transactionType: response.transactionType,
398 billNumber: response.billNumber,
399 amount: response.amount,
400 bit61: response.bit61,
401 reff: response.reff,
402 timeStamp: response.timeStamp,
403 resultCode: response.resultCode,
404 resultDesc: response.resultDesc,
405 bit39: response.bit39
406 }
407
394 logger.info('Got result: ' + message, {response: response}); 408 logger.info('Got result: ' + message, {response: response});
395 callbackReport(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance); 409 callbackReport(task.requestId, st24rc, st24message + ' -- Prev Balance: ' + balance);
396 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: rawResponse, parsed: response}, st24rc); 410 pushResponseToMongoDb(task, {supplier: config.globals.gateway_name, raw: rawResponse, parsed: parsedResponse}, st24rc);
397 } 411 }
398 412
399 function createSignature(params, password) { 413 function createSignature(params, password) {
400 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 414 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
401 var plain = 415 var plain =
402 params.userName 416 params.userName
403 + passwordHash 417 + passwordHash
404 + params.productCode 418 + params.productCode
405 + params.terminal 419 + params.terminal
406 + params.transactionType 420 + params.transactionType
407 + params.billNumber 421 + params.billNumber
408 + params.amount 422 + params.amount
409 + params.reff 423 + params.reff
410 + params.timeStamp; 424 + params.timeStamp;
411 425
412 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 426 return crypto.createHash('sha1').update(plain).digest().toString('hex');
413 } 427 }
414 428
415 function createSignatureForSaldoCheck(params, password) { 429 function createSignatureForSaldoCheck(params, password) {
416 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 430 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
417 var plain = 431 var plain =
418 params.userName 432 params.userName
419 + passwordHash 433 + passwordHash
420 + params.productCode 434 + params.productCode
421 + params.terminal 435 + params.terminal
422 + params.transactionType 436 + params.transactionType
423 + params.reff 437 + params.reff
424 + params.timeStamp; 438 + params.timeStamp;
425 439
426 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 440 return crypto.createHash('sha1').update(plain).digest().toString('hex');
427 } 441 }
428 442
429 function createBillNumber(destination) { 443 function createBillNumber(destination) {
430 return ("0000000000000" + destination).slice(-13); 444 return ("0000000000000" + destination).slice(-13);
431 } 445 }
432 446
433 exports.start = start; 447 exports.start = start;
434 exports.topupRequest = topupRequest; 448 exports.topupRequest = topupRequest;
435 exports.createSignature = createSignature; 449 exports.createSignature = createSignature;
436 exports.createBillNumber = createBillNumber; 450 exports.createBillNumber = createBillNumber;
437 451