Commit 6108ae8041c9b01147429a2e3902c4144e35ffe6

Authored by Adhidarma Hadiwinoto
1 parent a5668f44fe
Exists in master

cleaning service

Showing 2 changed files with 0 additions and 4 deletions Inline Diff

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