Commit 9e047c12240b1d93d5e075b4dae92f7fa17e6cc5

Authored by Adhidarma Hadiwinoto
1 parent e2e928e50c
Exists in master

saldoCheck

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