Commit aa561d430c00d5fdea29a1942b957557a12cd278
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 |