Commit 6108ae8041c9b01147429a2e3902c4144e35ffe6
1 parent
a5668f44fe
Exists in
master
cleaning service
Showing 2 changed files with 0 additions and 4 deletions Inline Diff
package.json
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 |