Commit 13e965f4e1af9ba65c42ac5c1222cdac634f318b
1 parent
4252c28180
Exists in
master
typo
Showing 1 changed file with 1 additions and 1 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 | if ( response.outputParameter.resultCode.$value == '001' ) { |
112 | // product disabled | 112 | // product disabled |
113 | st24rc = '13'; | 113 | st24rc = '13'; |
114 | } | 114 | } |
115 | else if ( response.outputParameter.resultCode.$value == '002' ) { | 115 | else if ( response.outputParameter.resultCode.$value == '002' ) { |
116 | // prodcode disable | 116 | // prodcode disable |
117 | st24rc = '13'; | 117 | st24rc = '13'; |
118 | } | 118 | } |
119 | else if ( response.outputParameter.resultCode.$value == '003' ) { | 119 | else if ( response.outputParameter.resultCode.$value == '003' ) { |
120 | // duplicate reff | 120 | // duplicate reff |
121 | st24rc = '55'; | 121 | st24rc = '55'; |
122 | } | 122 | } |
123 | else if ( response.outputParameter.resultCode.$value == '004' ) { | 123 | else if ( response.outputParameter.resultCode.$value == '004' ) { |
124 | // not enough balance | 124 | // not enough balance |
125 | st24rc = '40'; | 125 | st24rc = '40'; |
126 | } | 126 | } |
127 | else if ( response.outputParameter.resultCode.$value == '005' ) { | 127 | else if ( response.outputParameter.resultCode.$value == '005' ) { |
128 | // username blocked | 128 | // username blocked |
129 | st24rc = '40'; | 129 | st24rc = '40'; |
130 | } | 130 | } |
131 | else if ( response.outputParameter.resultCode.$value == '006' ) { | 131 | else if ( response.outputParameter.resultCode.$value == '006' ) { |
132 | // not exists username | 132 | // not exists username |
133 | st24rc = '40'; | 133 | st24rc = '40'; |
134 | } | 134 | } |
135 | else if ( response.outputParameter.resultCode.$value == '011' ) { | 135 | else if ( response.outputParameter.resultCode.$value == '011' ) { |
136 | // invalid request | 136 | // invalid request |
137 | st24rc = '40' | 137 | st24rc = '40' |
138 | } | 138 | } |
139 | else if ( response.outputParameter.resultCode.$value == '012' ) { | 139 | else if ( response.outputParameter.resultCode.$value == '012' ) { |
140 | // no route to host | 140 | // no route to host |
141 | st24rc = '40' | 141 | st24rc = '40' |
142 | } | 142 | } |
143 | else if ( response.outputParameter.resultCode.$value == '013' ) { | 143 | else if ( response.outputParameter.resultCode.$value == '013' ) { |
144 | // invalid signature | 144 | // invalid signature |
145 | st24rc = '40' | 145 | st24rc = '40' |
146 | } | 146 | } |
147 | else if ( response.outputParameter.bit39.$value == '06' ) { | 147 | else if ( response.outputParameter.bit39.$value == '06' ) { |
148 | st24rc = '40'; | 148 | st24rc = '40'; |
149 | st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; | 149 | st24message = 'Error Transaksi ditolak karena terjadi error di H2H dengan response code diluar daftar ini. Silahkan hubungi H2H'; |
150 | } | 150 | } |
151 | else if ( response.outputParameter.bit39.$value == '12' ) { | 151 | else if ( response.outputParameter.bit39.$value == '12' ) { |
152 | st24rc = '40'; | 152 | st24rc = '40'; |
153 | st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; | 153 | st24message = 'Invalid Transaction Transaksi ditolak karena flow transaksi tidak valid'; |
154 | } | 154 | } |
155 | else if ( response.outputParameter.bit39.$value == '13' ) { | 155 | else if ( response.outputParameter.bit39.$value == '13' ) { |
156 | st24rc = '13'; | 156 | st24rc = '13'; |
157 | st24message = 'Invalid voucher nominal'; | 157 | st24message = 'Invalid voucher nominal'; |
158 | } | 158 | } |
159 | else if ( response.outputParameter.bit39.$value == '14' ) { | 159 | else if ( response.outputParameter.bit39.$value == '14' ) { |
160 | st24rc = '14'; | 160 | st24rc = '14'; |
161 | st24message = 'MSISDN tidak ditemukan'; | 161 | st24message = 'MSISDN tidak ditemukan'; |
162 | } | 162 | } |
163 | else if ( response.outputParameter.bit39.$value == '30' ) { | 163 | else if ( response.outputParameter.bit39.$value == '30' ) { |
164 | st24rc = '40'; | 164 | st24rc = '40'; |
165 | st24message = 'Format Error'; | 165 | st24message = 'Format Error'; |
166 | } | 166 | } |
167 | else if ( response.outputParameter.bit39.$value == '31' ) { | 167 | else if ( response.outputParameter.bit39.$value == '31' ) { |
168 | st24rc = '40'; | 168 | st24rc = '40'; |
169 | st24message = 'Kode bank tidak terdaftar'; | 169 | st24message = 'Kode bank tidak terdaftar'; |
170 | } | 170 | } |
171 | else if ( response.outputParameter.bit39.$value == '63' ) { | 171 | else if ( response.outputParameter.bit39.$value == '63' ) { |
172 | st24rc = '40'; | 172 | st24rc = '40'; |
173 | st24message = 'Reversal denied'; | 173 | st24message = 'Reversal denied'; |
174 | } | 174 | } |
175 | else if ( response.outputParameter.bit39.$value == '68' ) { | 175 | else if ( response.outputParameter.bit39.$value == '68' ) { |
176 | st24rc = '68'; | 176 | st24rc = '68'; |
177 | st24message = 'Transaksi sedang dalam proses'; | 177 | st24message = 'Transaksi sedang dalam proses'; |
178 | } | 178 | } |
179 | else if ( response.outputParameter.bit39.$value == '69' ) { | 179 | else if ( response.outputParameter.bit39.$value == '69' ) { |
180 | st24rc = '68'; | 180 | st24rc = '68'; |
181 | st24message = 'Respon Ok lebih dari 24 detik'; | 181 | st24message = 'Respon Ok lebih dari 24 detik'; |
182 | } | 182 | } |
183 | else if ( response.outputParameter.bit39.$value == '70' ) { | 183 | else if ( response.outputParameter.bit39.$value == '70' ) { |
184 | st24rc = '13'; | 184 | st24rc = '13'; |
185 | st24message = 'Voucher out of stock'; | 185 | st24message = 'Voucher out of stock'; |
186 | } | 186 | } |
187 | else if ( response.outputParameter.bit39.$value == '79' ) { | 187 | else if ( response.outputParameter.bit39.$value == '79' ) { |
188 | st24rc = '14'; | 188 | st24rc = '14'; |
189 | st24message = 'Phone number is blocked by Telkomsel'; | 189 | st24message = 'Phone number is blocked by Telkomsel'; |
190 | } | 190 | } |
191 | else if ( response.outputParameter.bit39.$value == '81' ) { | 191 | else if ( response.outputParameter.bit39.$value == '81' ) { |
192 | st24rc = '14'; | 192 | st24rc = '14'; |
193 | st24message = 'Phone number is expired'; | 193 | st24message = 'Phone number is expired'; |
194 | } | 194 | } |
195 | else if ( response.outputParameter.bit39.$value == '89' ) { | 195 | else if ( response.outputParameter.bit39.$value == '89' ) { |
196 | st24rc = '40'; | 196 | st24rc = '40'; |
197 | st24message = 'Link to billing provider is down'; | 197 | st24message = 'Link to billing provider is down'; |
198 | } | 198 | } |
199 | else if ( response.outputParameter.bit39.$value == '91' ) { | 199 | else if ( response.outputParameter.bit39.$value == '91' ) { |
200 | st24rc = '40'; | 200 | st24rc = '40'; |
201 | st24message = 'Database problem'; | 201 | st24message = 'Database problem'; |
202 | } | 202 | } |
203 | else if ( response.outputParameter.bit39.$value == '92' ) { | 203 | else if ( response.outputParameter.bit39.$value == '92' ) { |
204 | st24rc = '40'; | 204 | st24rc = '40'; |
205 | st24message = 'Unable to route transaction'; | 205 | st24message = 'Unable to route transaction'; |
206 | } | 206 | } |
207 | else if ( response.outputParameter.bit39.$value == '94' ) { | 207 | else if ( response.outputParameter.bit39.$value == '94' ) { |
208 | st24rc = '40'; | 208 | st24rc = '40'; |
209 | st24message = 'Duplicate reversal request'; | 209 | st24message = 'Duplicate reversal request'; |
210 | } | 210 | } |
211 | 211 | ||
212 | var message = | 212 | var message = |
213 | response.outputParameter.resultCode.$value | 213 | response.outputParameter.resultCode.$value |
214 | + " " + response.outputParameter.resultDesc.$value | 214 | + " " + response.outputParameter.resultDesc.$value |
215 | + "; " + response.outputParameter.bit39.$value | 215 | + "; " + response.outputParameter.bit39.$value |
216 | ; | 216 | ; |
217 | 217 | ||
218 | if (response.outputParameter.resultDesc.$value != st24message) { | 218 | if (response.outputParameter.resultDesc.$value != st24message) { |
219 | var message = message + " " + st24message; | 219 | var message = message + " " + st24message; |
220 | } | 220 | } |
221 | 221 | ||
222 | logger.info('Got result: ' + message, {result: result}); | 222 | logger.info('Got result: ' + message, {response: response}); |
223 | callbackReport(task.requestId, st24rc, st24message); | 223 | callbackReport(task.requestId, st24rc, st24message); |
224 | } | 224 | } |
225 | 225 | ||
226 | function topupRequestRetry(task) { | 226 | function topupRequestRetry(task) { |
227 | task.retry--; | 227 | task.retry--; |
228 | 228 | ||
229 | if (task.retry > 0) { | 229 | if (task.retry > 0) { |
230 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); | 230 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); |
231 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); | 231 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); |
232 | } | 232 | } |
233 | else { | 233 | else { |
234 | logger.warn('Maximum retry for pending status exceeded', {task: task}); | 234 | logger.warn('Maximum retry for pending status exceeded', {task: task}); |
235 | } | 235 | } |
236 | } | 236 | } |
237 | 237 | ||
238 | 238 | ||
239 | function createSignature(params, password) { | 239 | function createSignature(params, password) { |
240 | var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); | 240 | var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); |
241 | var plain = | 241 | var plain = |
242 | params.userName | 242 | params.userName |
243 | + passwordHash | 243 | + passwordHash |
244 | + params.productCode | 244 | + params.productCode |
245 | + params.terminal | 245 | + params.terminal |
246 | + params.transactionType | 246 | + params.transactionType |
247 | + params.billNumber | 247 | + params.billNumber |
248 | + params.amount | 248 | + params.amount |
249 | + params.reff | 249 | + params.reff |
250 | + params.timeStamp; | 250 | + params.timeStamp; |
251 | 251 | ||
252 | return crypto.createHash('sha1').update(plain).digest().toString('hex'); | 252 | return crypto.createHash('sha1').update(plain).digest().toString('hex'); |
253 | } | 253 | } |
254 | 254 | ||
255 | function createBillNumber(destination) { | 255 | function createBillNumber(destination) { |
256 | return ("0000000000000" + destination).slice(-13); | 256 | return ("0000000000000" + destination).slice(-13); |
257 | } | 257 | } |
258 | 258 | ||
259 | exports.start = start; | 259 | exports.start = start; |
260 | exports.topupRequest = topupRequest; | 260 | exports.topupRequest = topupRequest; |
261 | exports.createSignature = createSignature; | 261 | exports.createSignature = createSignature; |
262 | exports.createBillNumber = createBillNumber; | 262 | exports.createBillNumber = createBillNumber; |
263 | 263 |