Commit 4252c28180225e8c13285d5a2b9e7dfbf0f61253
1 parent
a45d167eba
Exists in
master
penanganan rc
Showing 1 changed file with 124 additions and 59 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.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint}); | 86 | logger.verbose( |
87 | 'Got response', | ||
88 | { | ||
89 | lastEndpoint: soapClient.lastEndpoint, | ||
90 | lastRequest: soapClient.lastRequest, | ||
91 | lastMessage: soapClient.lastMessage, | ||
92 | lastResponse: soapClient.lastResponse, | ||
93 | } | ||
94 | ); | ||
87 | 95 | ||
88 | if (err) { | 96 | if (err) { |
89 | logger.warn('Error requesting service', {err: err}); | 97 | logger.warn('Error requesting service', {err: err}); |
90 | callbackReport(task.requestId, '68', 'something wrong'); | 98 | callbackReport(task.requestId, '68', 'something wrong'); |
91 | return; | 99 | return; |
92 | } | 100 | } |
93 | 101 | ||
94 | var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value; | 102 | topupResponseHandler(task, result); |
95 | |||
96 | logger.info('Got result: ' + responseMessageToST24, {result: result}); | ||
97 | |||
98 | callbackReport(task.requestId, '68', responseMessageToST24); | ||
99 | }); | 103 | }); |
100 | }); | 104 | }); |
101 | } | 105 | } |
102 | 106 | ||
103 | function topupRequestSoapDIY(task, params, retry) { | 107 | function topupResponseHandler(task, response) { |
104 | var message = whiskers.render(soapTemplate, params); | 108 | var st24rc = '68'; |
105 | logger.verbose("Generating SOAP message", {message: message}); | 109 | var st24message = response.outputParameter.resultDesc.$value; |
106 | |||
107 | var partnerUrl = url.parse(config.h2h_out.partner_endpoint); | ||
108 | var postRequest = { | ||
109 | host: partnerUrl.hostname, | ||
110 | path: partnerUrl.path, | ||
111 | port: partnerUrl.port, | ||
112 | method: "POST", | ||
113 | headers: { | ||
114 | 'Content-Type': 'text/xml', | ||
115 | 'Content-Length': Buffer.byteLength(message), | ||
116 | //'SOAPAction': "urn:apih2h#billpayment" | ||
117 | } | ||
118 | }; | ||
119 | |||
120 | logger.info('POST to partner', {postRequest: postRequest}); | ||
121 | var req = http.request(postRequest, function( res ) { | ||
122 | |||
123 | logger.verbose('Request status code: ' + res.statusCode ); | ||
124 | var buffer = ""; | ||
125 | |||
126 | res.on( "data", function( data ) { | ||
127 | buffer = buffer + data; | ||
128 | }); | ||
129 | |||
130 | res.on( "end", function( data ) { | ||
131 | topupResponseHandler(buffer, task); | ||
132 | }); | ||
133 | 110 | ||
134 | }); | 111 | if ( response.outputParameter.resultCode.$value == '001' ) { |
135 | 112 | // product disabled | |
136 | req.on('error', function(e) { | 113 | st24rc = '13'; |
137 | logger.warn('problem with request: ' + e.message); | 114 | } |
138 | callbackReport(task.requestId, '68', e.message); | 115 | else if ( response.outputParameter.resultCode.$value == '002' ) { |
116 | // prodcode disable | ||
117 | st24rc = '13'; | ||
118 | } | ||
119 | else if ( response.outputParameter.resultCode.$value == '003' ) { | ||
120 | // duplicate reff | ||
121 | st24rc = '55'; | ||
122 | } | ||
123 | else if ( response.outputParameter.resultCode.$value == '004' ) { | ||
124 | // not enough balance | ||
125 | st24rc = '40'; | ||
126 | } | ||
127 | else if ( response.outputParameter.resultCode.$value == '005' ) { | ||
128 | // username blocked | ||
129 | st24rc = '40'; | ||
130 | } | ||
131 | else if ( response.outputParameter.resultCode.$value == '006' ) { | ||
132 | // not exists username | ||
133 | st24rc = '40'; | ||
134 | } | ||
135 | else if ( response.outputParameter.resultCode.$value == '011' ) { | ||
136 | // invalid request | ||
137 | st24rc = '40' | ||
138 | } | ||
139 | else if ( response.outputParameter.resultCode.$value == '012' ) { | ||
140 | // no route to host | ||
141 | st24rc = '40' | ||
142 | } | ||
143 | else if ( response.outputParameter.resultCode.$value == '013' ) { | ||
144 | // invalid signature | ||
145 | st24rc = '40' | ||
146 | } | ||
147 | else if ( response.outputParameter.bit39.$value == '06' ) { | ||
148 | st24rc = '40'; | ||
149 | st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; | ||
150 | } | ||
151 | else if ( response.outputParameter.bit39.$value == '12' ) { | ||
152 | st24rc = '40'; | ||
153 | st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; | ||
154 | } | ||
155 | else if ( response.outputParameter.bit39.$value == '13' ) { | ||
156 | st24rc = '13'; | ||
157 | st24message = 'Invalid voucher nominal'; | ||
158 | } | ||
159 | else if ( response.outputParameter.bit39.$value == '14' ) { | ||
160 | st24rc = '14'; | ||
161 | st24message = 'MSISDN tidak ditemukan'; | ||
162 | } | ||
163 | else if ( response.outputParameter.bit39.$value == '30' ) { | ||
164 | st24rc = '40'; | ||
165 | st24message = 'Format Error'; | ||
166 | } | ||
167 | else if ( response.outputParameter.bit39.$value == '31' ) { | ||
168 | st24rc = '40'; | ||
169 | st24message = 'Kode bank tidak terdaftar'; | ||
170 | } | ||
171 | else if ( response.outputParameter.bit39.$value == '63' ) { | ||
172 | st24rc = '40'; | ||
173 | st24message = 'Reversal denied'; | ||
174 | } | ||
175 | else if ( response.outputParameter.bit39.$value == '68' ) { | ||
176 | st24rc = '68'; | ||
177 | st24message = 'Transaksi sedang dalam proses'; | ||
178 | } | ||
179 | else if ( response.outputParameter.bit39.$value == '69' ) { | ||
180 | st24rc = '68'; | ||
181 | st24message = 'Respon Ok lebih dari 24 detik'; | ||
182 | } | ||
183 | else if ( response.outputParameter.bit39.$value == '70' ) { | ||
184 | st24rc = '13'; | ||
185 | st24message = 'Voucher out of stock'; | ||
186 | } | ||
187 | else if ( response.outputParameter.bit39.$value == '79' ) { | ||
188 | st24rc = '14'; | ||
189 | st24message = 'Phone number is blocked by Telkomsel'; | ||
190 | } | ||
191 | else if ( response.outputParameter.bit39.$value == '81' ) { | ||
192 | st24rc = '14'; | ||
193 | st24message = 'Phone number is expired'; | ||
194 | } | ||
195 | else if ( response.outputParameter.bit39.$value == '89' ) { | ||
196 | st24rc = '40'; | ||
197 | st24message = 'Link to billing provider is down'; | ||
198 | } | ||
199 | else if ( response.outputParameter.bit39.$value == '91' ) { | ||
200 | st24rc = '40'; | ||
201 | st24message = 'Database problem'; | ||
202 | } | ||
203 | else if ( response.outputParameter.bit39.$value == '92' ) { | ||
204 | st24rc = '40'; | ||
205 | st24message = 'Unable to route transaction'; | ||
206 | } | ||
207 | else if ( response.outputParameter.bit39.$value == '94' ) { | ||
208 | st24rc = '40'; | ||
209 | st24message = 'Duplicate reversal request'; | ||
210 | } | ||
139 | 211 | ||
140 | topupRequestRetry(task); | 212 | var message = |
141 | }); | 213 | response.outputParameter.resultCode.$value |
214 | + " " + response.outputParameter.resultDesc.$value | ||
215 | + "; " + response.outputParameter.bit39.$value | ||
216 | ; | ||
142 | 217 | ||
143 | req.write(message); | 218 | if (response.outputParameter.resultDesc.$value != st24message) { |
144 | req.end(); | 219 | var message = message + " " + st24message; |
145 | } | 220 | } |
146 | 221 | ||
147 | function topupResponseHandler(response, task) { | 222 | logger.info('Got result: ' + message, {result: result}); |
148 | logger.verbose('Got response', {response: response, task: task}); | 223 | callbackReport(task.requestId, st24rc, st24message); |
149 | callbackReport(task.requestId, '68', 'Got response'); | ||
150 | } | 224 | } |
151 | 225 | ||
152 | function topupRequestRetry(task) { | 226 | function topupRequestRetry(task) { |
153 | task.retry--; | 227 | task.retry--; |
154 | 228 | ||
155 | if (task.retry > 0) { | 229 | if (task.retry > 0) { |
156 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); | 230 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); |
157 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); | 231 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); |