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