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