Commit aa561d430c00d5fdea29a1942b957557a12cd278

Authored by Adhidarma Hadiwinoto
1 parent 13e965f4e1
Exists in master

sn

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