Commit 9b569c12be3e29bd4e741909b1ee5b7a63a30334

Authored by Adhidarma Hadiwinoto
1 parent 26408d42df
Exists in master

create soapclient for saldoCheck

Showing 1 changed file with 28 additions and 19 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 9
10 process.chdir(__dirname); 10 process.chdir(__dirname);
11 var soapTemplate = fs.readFileSync("message.xml"); 11 var soapTemplate = fs.readFileSync("message.xml");
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 callbackReport; 17 var callbackReport;
18 var aaa; 18 var aaa;
19 var logger; 19 var logger;
20 var options; 20 var options;
21 21
22 function start(_config, _callbackReport, options) { 22 function start(_config, _callbackReport, options) {
23 config = _config; 23 config = _config;
24 callbackReport = _callbackReport 24 callbackReport = _callbackReport
25 25
26 if (options && options.aaa) { 26 if (options && options.aaa) {
27 aaa = options.aaa; 27 aaa = options.aaa;
28 } 28 }
29 29
30 if (options && options.logger) { 30 if (options && options.logger) {
31 logger = options.logger; 31 logger = options.logger;
32 } else { 32 } else {
33 logger = new winston.Logger({ 33 logger = new winston.Logger({
34 transports: [ 34 transports: [
35 new (winston.transports.Console)() 35 new (winston.transports.Console)()
36 ] 36 ]
37 }); 37 });
38 } 38 }
39 } 39 }
40 40
41 function topupRequest(task, retry) { 41 function topupRequest(task, retry) {
42 saldoCheck(billpayment, task); 42 saldoCheck(billpayment, task);
43 } 43 }
44 44
45 function saldoCheck(callback, task) { 45 function saldoCheck(callback, task) {
46 46
47 var params = { 47 var params = {
48 userName: config.h2h_out.userid, 48 userName: config.h2h_out.userid,
49 productCode: '00000' , 49 productCode: '00000' ,
50 terminal: 'H2HIPN10', 50 terminal: 'H2HIPN10',
51 transactionType: '61', 51 transactionType: '61',
52 reff: Math.ceil( Math.random() * 99999999 ), 52 reff: Math.ceil( Math.random() * 99999999 ),
53 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 53 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
54 } 54 }
55 55
56 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password); 56 params.signature = createSignatureForSaldoCheck(params, config.h2h_out.password);
57 57
58 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params}); 58 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
59 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) {
60
61 logger.verbose(
62 'Got saldoCheck response',
63 {
64 lastEndpoint: soapClient.lastEndpoint,
65 lastRequest: soapClient.lastRequest,
66 lastMessage: soapClient.lastMessage,
67 lastResponse: soapClient.lastResponse,
68 }
69 );
70 59
71 if (err) { 60 if (err) {
72 logger.warn('Error requesting saldoCheck', {err: err}); 61 logger.warn('Error creating soap client for saldoCheck', {err: err});
62 callbackReport(task.requestId, '40', 'Error creating soap client for saldoCheck: ' + err);
63 return;
73 } 64 }
74 65
75 var balance; 66 logger.info('Requesting to service', {url: config.h2h_out.partner, params: params});
76 logger.verbose('saldoCheck result', {result: result}); 67 soapClient.apih2h.apih2hPort.saldoCheck({ inputSaldo: params }, function(err, result) {
68
69 logger.verbose(
70 'Got saldoCheck response',
71 {
72 lastEndpoint: soapClient.lastEndpoint,
73 lastRequest: soapClient.lastRequest,
74 lastMessage: soapClient.lastMessage,
75 lastResponse: soapClient.lastResponse,
76 }
77 );
78
79 if (err) {
80 logger.warn('Error requesting saldoCheck', {err: err});
81 }
77 82
83 var balance;
84 logger.verbose('saldoCheck result', {result: result});
78 85
79 if (task) { 86
80 callback(task, balance); 87 if (task) {
81 } 88 callback(task, balance);
82 }); 89 }
90 });
91 }
83 92
84 } 93 }
85 94
86 function billpayment(task, balance) { 95 function billpayment(task, balance) {
87 96
88 var remoteProduct = task.remoteProduct.split(','); 97 var remoteProduct = task.remoteProduct.split(',');
89 var params = { 98 var params = {
90 userName: config.h2h_out.userid, 99 userName: config.h2h_out.userid,
91 productCode: remoteProduct[0] , 100 productCode: remoteProduct[0] ,
92 terminal: 'H2HIPN10', 101 terminal: 'H2HIPN10',
93 transactionType: '50', 102 transactionType: '50',
94 billNumber: createBillNumber(task.destination), 103 billNumber: createBillNumber(task.destination),
95 amount: remoteProduct[1], 104 amount: remoteProduct[1],
96 bit61: createBillNumber(task.destination), 105 bit61: createBillNumber(task.destination),
97 reff: task.requestId, 106 reff: task.requestId,
98 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date()) 107 timeStamp: strftime('%Y-%m-%d %H:%M:%S', new Date())
99 } 108 }
100 109
101 var signature = createSignature(params, config.h2h_out.password); 110 var signature = createSignature(params, config.h2h_out.password);
102 params.signature = signature; 111 params.signature = signature;
103 112
104 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 113 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
105 114
106 var _params = { 115 var _params = {
107 userName: params.userName, 116 userName: params.userName,
108 signature: params.signature, 117 signature: params.signature,
109 productCode: params.productCode, 118 productCode: params.productCode,
110 terminal: params.terminal, 119 terminal: params.terminal,
111 transactionType: params.transactionType, 120 transactionType: params.transactionType,
112 billNumber: params.billNumber, 121 billNumber: params.billNumber,
113 amount: params.amount, 122 amount: params.amount,
114 bit61: params.bit61, 123 bit61: params.bit61,
115 reff: params.reff, 124 reff: params.reff,
116 timeStamp: params.timeStamp 125 timeStamp: params.timeStamp
117 } 126 }
118 127
119 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); 128 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
120 129
121 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { 130 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
122 logger.verbose( 131 logger.verbose(
123 'Got response', 132 'Got response',
124 { 133 {
125 lastEndpoint: soapClient.lastEndpoint, 134 lastEndpoint: soapClient.lastEndpoint,
126 lastRequest: soapClient.lastRequest, 135 lastRequest: soapClient.lastRequest,
127 lastMessage: soapClient.lastMessage, 136 lastMessage: soapClient.lastMessage,
128 lastResponse: soapClient.lastResponse, 137 lastResponse: soapClient.lastResponse,
129 } 138 }
130 ); 139 );
131 140
132 if (err) { 141 if (err) {
133 logger.warn('Error requesting service', {err: err}); 142 logger.warn('Error requesting service', {err: err});
134 callbackReport(task.requestId, '68', 'something wrong'); 143 callbackReport(task.requestId, '68', 'something wrong');
135 return; 144 return;
136 } 145 }
137 146
138 topupResponseHandler(task, result); 147 topupResponseHandler(task, result);
139 }); 148 });
140 }); 149 });
141 } 150 }
142 151
143 function topupResponseHandler(task, response) { 152 function topupResponseHandler(task, response) {
144 var st24rc = '68'; 153 var st24rc = '68';
145 var st24message = response.outputParameter.resultDesc.$value; 154 var st24message = response.outputParameter.resultDesc.$value;
146 155
147 var resultCode = parseInt(response.outputParameter.resultCode.$value); 156 var resultCode = parseInt(response.outputParameter.resultCode.$value);
148 var bit39 = parseInt(response.outputParameter.bit39.$value); 157 var bit39 = parseInt(response.outputParameter.bit39.$value);
149 158
150 if ( resultCode == 1 ) { 159 if ( resultCode == 1 ) {
151 // product disabled 160 // product disabled
152 st24rc = '13'; 161 st24rc = '13';
153 } 162 }
154 else if ( resultCode == 2 ) { 163 else if ( resultCode == 2 ) {
155 // prodcode disable 164 // prodcode disable
156 st24rc = '13'; 165 st24rc = '13';
157 } 166 }
158 else if ( resultCode == 3 ) { 167 else if ( resultCode == 3 ) {
159 // duplicate reff 168 // duplicate reff
160 st24rc = '55'; 169 st24rc = '55';
161 } 170 }
162 else if ( resultCode == 4 ) { 171 else if ( resultCode == 4 ) {
163 // not enough balance 172 // not enough balance
164 st24rc = '40'; 173 st24rc = '40';
165 } 174 }
166 else if ( resultCode == 5 ) { 175 else if ( resultCode == 5 ) {
167 // username blocked 176 // username blocked
168 st24rc = '40'; 177 st24rc = '40';
169 } 178 }
170 else if ( resultCode == 6 ) { 179 else if ( resultCode == 6 ) {
171 // not exists username 180 // not exists username
172 st24rc = '40'; 181 st24rc = '40';
173 } 182 }
174 else if ( resultCode == 11 ) { 183 else if ( resultCode == 11 ) {
175 // invalid request 184 // invalid request
176 st24rc = '40' 185 st24rc = '40'
177 } 186 }
178 else if ( resultCode == 12 ) { 187 else if ( resultCode == 12 ) {
179 // no route to host 188 // no route to host
180 st24rc = '40' 189 st24rc = '40'
181 } 190 }
182 else if ( resultCode == 13 ) { 191 else if ( resultCode == 13 ) {
183 // invalid signature 192 // invalid signature
184 st24rc = '40' 193 st24rc = '40'
185 } 194 }
186 else if ( bit39 == 6 ) { 195 else if ( bit39 == 6 ) {
187 st24rc = '40'; 196 st24rc = '40';
188 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; 197 st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H';
189 } 198 }
190 else if ( bit39 == 12 ) { 199 else if ( bit39 == 12 ) {
191 st24rc = '40'; 200 st24rc = '40';
192 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; 201 st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid';
193 } 202 }
194 else if ( bit39 == 13 ) { 203 else if ( bit39 == 13 ) {
195 st24rc = '13'; 204 st24rc = '13';
196 st24message = 'Invalid voucher nominal'; 205 st24message = 'Invalid voucher nominal';
197 } 206 }
198 else if ( bit39 == 14 ) { 207 else if ( bit39 == 14 ) {
199 st24rc = '14'; 208 st24rc = '14';
200 st24message = 'MSISDN tidak ditemukan'; 209 st24message = 'MSISDN tidak ditemukan';
201 } 210 }
202 else if ( bit39 == 30 ) { 211 else if ( bit39 == 30 ) {
203 st24rc = '40'; 212 st24rc = '40';
204 st24message = 'Format Error'; 213 st24message = 'Format Error';
205 } 214 }
206 else if ( bit39 == 31 ) { 215 else if ( bit39 == 31 ) {
207 st24rc = '40'; 216 st24rc = '40';
208 st24message = 'Kode bank tidak terdaftar'; 217 st24message = 'Kode bank tidak terdaftar';
209 } 218 }
210 else if ( bit39 == 63 ) { 219 else if ( bit39 == 63 ) {
211 st24rc = '40'; 220 st24rc = '40';
212 st24message = 'Reversal denied'; 221 st24message = 'Reversal denied';
213 } 222 }
214 else if ( bit39 == 68 ) { 223 else if ( bit39 == 68 ) {
215 st24rc = '68'; 224 st24rc = '68';
216 st24message = 'Transaksi sedang dalam proses'; 225 st24message = 'Transaksi sedang dalam proses';
217 } 226 }
218 else if ( bit39 == 69 ) { 227 else if ( bit39 == 69 ) {
219 st24rc = '68'; 228 st24rc = '68';
220 st24message = 'Respon Ok lebih dari 24 detik'; 229 st24message = 'Respon Ok lebih dari 24 detik';
221 } 230 }
222 else if ( bit39 == 70 ) { 231 else if ( bit39 == 70 ) {
223 st24rc = '13'; 232 st24rc = '13';
224 st24message = 'Voucher out of stock'; 233 st24message = 'Voucher out of stock';
225 } 234 }
226 else if ( bit39 == 79 ) { 235 else if ( bit39 == 79 ) {
227 st24rc = '14'; 236 st24rc = '14';
228 st24message = 'Phone number is blocked by Telkomsel'; 237 st24message = 'Phone number is blocked by Telkomsel';
229 } 238 }
230 else if ( bit39 == 81 ) { 239 else if ( bit39 == 81 ) {
231 st24rc = '14'; 240 st24rc = '14';
232 st24message = 'Phone number is expired'; 241 st24message = 'Phone number is expired';
233 } 242 }
234 else if ( bit39 == 89 ) { 243 else if ( bit39 == 89 ) {
235 st24rc = '40'; 244 st24rc = '40';
236 st24message = 'Link to billing provider is down'; 245 st24message = 'Link to billing provider is down';
237 } 246 }
238 else if ( bit39 == 91 ) { 247 else if ( bit39 == 91 ) {
239 st24rc = '40'; 248 st24rc = '40';
240 st24message = 'Database problem'; 249 st24message = 'Database problem';
241 } 250 }
242 else if ( bit39 == 92 ) { 251 else if ( bit39 == 92 ) {
243 st24rc = '40'; 252 st24rc = '40';
244 st24message = 'Unable to route transaction'; 253 st24message = 'Unable to route transaction';
245 } 254 }
246 else if ( bit39 == 94 ) { 255 else if ( bit39 == 94 ) {
247 st24rc = '40'; 256 st24rc = '40';
248 st24message = 'Duplicate reversal request'; 257 st24message = 'Duplicate reversal request';
249 } 258 }
250 else if ( resultCode == 0 && bit39 == 0) { 259 else if ( resultCode == 0 && bit39 == 0) {
251 260
252 var sn = ''; 261 var sn = '';
253 262
254 try { 263 try {
255 sn = response.outputParameter.bit61.$value.substring(43); 264 sn = response.outputParameter.bit61.$value.substring(43);
256 } 265 }
257 catch(e) { 266 catch(e) {
258 sn = ''; 267 sn = '';
259 } 268 }
260 269
261 st24message = 'SN=' + sn + '; ' + st24message; 270 st24message = 'SN=' + sn + '; ' + st24message;
262 st24rc = '00'; 271 st24rc = '00';
263 } 272 }
264 273
265 var message = 274 var message =
266 response.outputParameter.resultCode.$value 275 response.outputParameter.resultCode.$value
267 + " " + response.outputParameter.resultDesc.$value 276 + " " + response.outputParameter.resultDesc.$value
268 + "; BIT39: " + response.outputParameter.bit39.$value 277 + "; BIT39: " + response.outputParameter.bit39.$value
269 ; 278 ;
270 279
271 if (response.outputParameter.resultDesc.$value != st24message) { 280 if (response.outputParameter.resultDesc.$value != st24message) {
272 var message = message + " " + st24message; 281 var message = message + " " + st24message;
273 } 282 }
274 283
275 logger.info('Got result: ' + message, {response: response}); 284 logger.info('Got result: ' + message, {response: response});
276 callbackReport(task.requestId, st24rc, st24message); 285 callbackReport(task.requestId, st24rc, st24message);
277 } 286 }
278 287
279 function createSignature(params, password) { 288 function createSignature(params, password) {
280 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 289 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
281 var plain = 290 var plain =
282 params.userName 291 params.userName
283 + passwordHash 292 + passwordHash
284 + params.productCode 293 + params.productCode
285 + params.terminal 294 + params.terminal
286 + params.transactionType 295 + params.transactionType
287 + params.billNumber 296 + params.billNumber
288 + params.amount 297 + params.amount
289 + params.reff 298 + params.reff
290 + params.timeStamp; 299 + params.timeStamp;
291 300
292 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 301 return crypto.createHash('sha1').update(plain).digest().toString('hex');
293 } 302 }
294 303
295 function createSignatureForSaldoCheck(params, password) { 304 function createSignatureForSaldoCheck(params, password) {
296 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 305 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
297 var plain = 306 var plain =
298 params.userName 307 params.userName
299 + passwordHash 308 + passwordHash
300 + params.productCode 309 + params.productCode
301 + params.terminal 310 + params.terminal
302 + params.transactionType 311 + params.transactionType
303 + params.reff 312 + params.reff
304 + params.timeStamp; 313 + params.timeStamp;
305 314
306 return crypto.createHash('sha1').update(plain).digest().toString('hex'); 315 return crypto.createHash('sha1').update(plain).digest().toString('hex');