Commit 8bf3f8ad67d451db665fb10323add079551e8cc6
1 parent
adfd804cea
Exists in
master
menggunakan respon.response_code
Showing 1 changed file with 11 additions and 1 deletions Inline Diff
httppulsakita.js
1 | var url = require('url'); | 1 | var url = require('url'); |
2 | var math = require('mathjs'); | 2 | var math = require('mathjs'); |
3 | var request = require('request'); | 3 | var request = require('request'); |
4 | var xml = require("xml2js").parseString; | 4 | var xml = require("xml2js").parseString; |
5 | var winston = require('winston'); | 5 | var winston = require('winston'); |
6 | 6 | ||
7 | var logger; | 7 | var logger; |
8 | var config; | 8 | var config; |
9 | var callbackReport; | 9 | var callbackReport; |
10 | var aaa; | 10 | var aaa; |
11 | 11 | ||
12 | var max_retry = 15; | 12 | var max_retry = 15; |
13 | var sleep_before_retry = 60 * 1000; | 13 | var sleep_before_retry = 60 * 1000; |
14 | 14 | ||
15 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; | 15 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; |
16 | 16 | ||
17 | function parseSN(message, _config) { | 17 | function parseSN(message, _config) { |
18 | 18 | ||
19 | if (!_config) { | 19 | if (!_config) { |
20 | _config = config; | 20 | _config = config; |
21 | } | 21 | } |
22 | 22 | ||
23 | var sn_regex = new RegExp(_config.h2h_out.sn_pattern); | 23 | var sn_regex = new RegExp(_config.h2h_out.sn_pattern); |
24 | var sn_match = message.match(sn_regex); | 24 | var sn_match = message.match(sn_regex); |
25 | 25 | ||
26 | if (sn_match <= 0) { | 26 | if (sn_match <= 0) { |
27 | logger.info('SN Not found: ' + message); | 27 | logger.info('SN Not found: ' + message); |
28 | return ''; | 28 | return ''; |
29 | } | 29 | } |
30 | 30 | ||
31 | var sn = sn_match[0]; | 31 | var sn = sn_match[0]; |
32 | var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); | 32 | var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); |
33 | 33 | ||
34 | var count = sn_remove_patterns.length; | 34 | var count = sn_remove_patterns.length; |
35 | 35 | ||
36 | for(var i = 0; i < count; i++) { | 36 | for(var i = 0; i < count; i++) { |
37 | sn = sn.replace(sn_remove_patterns[i], ''); | 37 | sn = sn.replace(sn_remove_patterns[i], ''); |
38 | } | 38 | } |
39 | 39 | ||
40 | return sn.trim(); | 40 | return sn.trim(); |
41 | } | 41 | } |
42 | 42 | ||
43 | function topupRequest(task, retry) { | 43 | function topupRequest(task, retry) { |
44 | /* | 44 | /* |
45 | if (config.globals.requests_count == undefined) { | 45 | if (config.globals.requests_count == undefined) { |
46 | config.globals.requests_count = 1; | 46 | config.globals.requests_count = 1; |
47 | } else { | 47 | } else { |
48 | config.globals.requests_count++; | 48 | config.globals.requests_count++; |
49 | } | 49 | } |
50 | 50 | ||
51 | if (config.globals.active_requests_count == undefined) { | 51 | if (config.globals.active_requests_count == undefined) { |
52 | config.globals.active_requests_count = 1; | 52 | config.globals.active_requests_count = 1; |
53 | } else { | 53 | } else { |
54 | config.globals.active_requests_count++; | 54 | config.globals.active_requests_count++; |
55 | } | 55 | } |
56 | 56 | ||
57 | if (config.globals.max_active_requests_count == undefined) { | 57 | if (config.globals.max_active_requests_count == undefined) { |
58 | config.globals.max_active_requests_count = config.globals.active_requests_count; | 58 | config.globals.max_active_requests_count = config.globals.active_requests_count; |
59 | } else { | 59 | } else { |
60 | config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); | 60 | config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); |
61 | } | 61 | } |
62 | */ | 62 | */ |
63 | 63 | ||
64 | 64 | ||
65 | if (retry === undefined) { | 65 | if (retry === undefined) { |
66 | retry = max_retry; | 66 | retry = max_retry; |
67 | } | 67 | } |
68 | 68 | ||
69 | var params = { | 69 | var params = { |
70 | userid: config.h2h_out.userid, | 70 | userid: config.h2h_out.userid, |
71 | pwd: config.h2h_out.password, | 71 | pwd: config.h2h_out.password, |
72 | memberreff: task['requestId'], | 72 | memberreff: task['requestId'], |
73 | produk: task['remoteProduct'], | 73 | produk: task['remoteProduct'], |
74 | tujuan: task['destination'] | 74 | tujuan: task['destination'] |
75 | }; | 75 | }; |
76 | logger.info('Creating http request to gateway', {params: params}); | 76 | logger.info('Creating http request to gateway', {params: params}); |
77 | 77 | ||
78 | request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { | 78 | request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { |
79 | 79 | ||
80 | /* | 80 | /* |
81 | config.globals.active_requests_count--; | 81 | config.globals.active_requests_count--; |
82 | */ | 82 | */ |
83 | 83 | ||
84 | if (err) { | 84 | if (err) { |
85 | logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); | 85 | logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); |
86 | 86 | ||
87 | callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err); | 87 | callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err); |
88 | return; | 88 | return; |
89 | } | 89 | } |
90 | 90 | ||
91 | logger.verbose('Got response from gateway ', {response_body: httpResponseBody}); | 91 | logger.verbose('Got response from gateway ', {response_body: httpResponseBody}); |
92 | 92 | ||
93 | if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { | 93 | if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { |
94 | logger.warn('Proxy error', {task: task, params: params}); | 94 | logger.warn('Proxy error', {task: task, params: params}); |
95 | callbackReport(task['requestId'], '91', '502 Proxy error'); | 95 | callbackReport(task['requestId'], '91', '502 Proxy error'); |
96 | return; | 96 | return; |
97 | } | 97 | } |
98 | 98 | ||
99 | xml(httpResponseBody, function(err, result) { | 99 | xml(httpResponseBody, function(err, result) { |
100 | if (err) { | 100 | if (err) { |
101 | logger.warn('Gagal parsing XML respon server', {task: task, params: params}); | 101 | logger.warn('Gagal parsing XML respon server', {task: task, params: params}); |
102 | //topupRequest(task, retry - 1); | 102 | //topupRequest(task, retry - 1); |
103 | callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); | 103 | callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); |
104 | return; | 104 | return; |
105 | } | 105 | } |
106 | 106 | ||
107 | logger.info('Response Data:', {result: result}); | 107 | logger.info('Response Data:', {result: result}); |
108 | 108 | ||
109 | var message = result.respon.pesan[0].replace(/\n/g, ' '); | 109 | var message = result.respon.pesan[0].replace(/\n/g, ' '); |
110 | var response_code = result.respon.rc[0].replace(/^00/, ''); | 110 | |
111 | var response_code = '68'; | ||
112 | try { | ||
113 | response_code = result.respon.response_code[0].replace(/^00/, ''); | ||
114 | } | ||
115 | catch(rc_error_on_parse) { | ||
116 | |||
117 | logger.warn('respon.response_code tidak terdefinisi, gunakan respon.rc'); | ||
118 | response_code = result.respon.rc[0].replace(/^00/, ''); | ||
119 | |||
120 | } | ||
111 | 121 | ||
112 | if (response_code == '54' || response_code == '68') { | 122 | if (response_code == '54' || response_code == '68') { |
113 | logger.warn('Mendapat status pending / suspect', {task: task, params: params}); | 123 | logger.warn('Mendapat status pending / suspect', {task: task, params: params}); |
114 | if (retry) { | 124 | if (retry) { |
115 | callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.'); | 125 | callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.'); |
116 | 126 | ||
117 | setTimeout(function() { | 127 | setTimeout(function() { |
118 | 128 | ||
119 | logger.info('Sending advice', {task: task}); | 129 | logger.info('Sending advice', {task: task}); |
120 | 130 | ||
121 | task['remoteProduct'] = 'ADVPLN'; | 131 | task['remoteProduct'] = 'ADVPLN'; |
122 | topupRequest(task, retry - 1); | 132 | topupRequest(task, retry - 1); |
123 | 133 | ||
124 | }, sleep_before_retry); | 134 | }, sleep_before_retry); |
125 | 135 | ||
126 | } else { | 136 | } else { |
127 | logger.warn('Max retries exceeded', {task: task}); | 137 | logger.warn('Max retries exceeded', {task: task}); |
128 | callbackReport(task['requestId'], '40', message + '. Max retries exceeded'); | 138 | callbackReport(task['requestId'], '40', message + '. Max retries exceeded'); |
129 | } | 139 | } |
130 | return; | 140 | return; |
131 | } | 141 | } |
132 | 142 | ||
133 | var token = ''; | 143 | var token = ''; |
134 | if (result.respon.token) { | 144 | if (result.respon.token) { |
135 | token = result.respon.token[0]; | 145 | token = result.respon.token[0]; |
136 | } | 146 | } |
137 | 147 | ||
138 | var data_pelanggan = 'NO-DATA'; | 148 | var data_pelanggan = 'NO-DATA'; |
139 | if (result.respon.data) { | 149 | if (result.respon.data) { |
140 | 150 | ||
141 | try { | 151 | try { |
142 | var _data_pelanggan = result.respon.data[0].replace(/ /g, '-'); | 152 | var _data_pelanggan = result.respon.data[0].replace(/ /g, '-'); |
143 | var fields = _data_pelanggan.split('/'); | 153 | var fields = _data_pelanggan.split('/'); |
144 | 154 | ||
145 | data_pelanggan = [ | 155 | data_pelanggan = [ |
146 | fields[0], fields[1], fields[2], fields[3] | 156 | fields[0], fields[1], fields[2], fields[3] |
147 | ].join('/'); | 157 | ].join('/'); |
148 | } | 158 | } |
149 | catch(err) { | 159 | catch(err) { |
150 | logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan}); | 160 | logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan}); |
151 | } | 161 | } |
152 | 162 | ||
153 | 163 | ||
154 | } | 164 | } |
155 | 165 | ||
156 | if (response_code == '00') { | 166 | if (response_code == '00') { |
157 | 167 | ||
158 | var sn = ""; | 168 | var sn = ""; |
159 | 169 | ||
160 | if (config.h2h_out.parse_sn == 'YES') { | 170 | if (config.h2h_out.parse_sn == 'YES') { |
161 | sn = parseSN(message); | 171 | sn = parseSN(message); |
162 | } else if (token && data_pelanggan) { | 172 | } else if (token && data_pelanggan) { |
163 | sn = token + '/' + data_pelanggan; | 173 | sn = token + '/' + data_pelanggan; |
164 | } | 174 | } |
165 | 175 | ||
166 | message = 'SN=' + sn + '; ' + message; | 176 | message = 'SN=' + sn + '; ' + message; |
167 | } | 177 | } |
168 | 178 | ||
169 | callbackReport(task['requestId'], response_code, message); | 179 | callbackReport(task['requestId'], response_code, message); |
170 | 180 | ||
171 | }); | 181 | }); |
172 | }); | 182 | }); |
173 | } | 183 | } |
174 | 184 | ||
175 | function start(_config, _callbackReport, options) { | 185 | function start(_config, _callbackReport, options) { |
176 | config = _config; | 186 | config = _config; |
177 | callbackReport = _callbackReport; | 187 | callbackReport = _callbackReport; |
178 | 188 | ||
179 | if (options && options.aaa) { | 189 | if (options && options.aaa) { |
180 | aaa = options.aaa; | 190 | aaa = options.aaa; |
181 | } | 191 | } |
182 | 192 | ||
183 | if (options && options.logger) { | 193 | if (options && options.logger) { |
184 | logger = options.logger; | 194 | logger = options.logger; |
185 | } else { | 195 | } else { |
186 | logger = new winston.Logger({ | 196 | logger = new winston.Logger({ |
187 | transports: [ | 197 | transports: [ |
188 | new (winston.transports.Console)() | 198 | new (winston.transports.Console)() |
189 | ] | 199 | ] |
190 | }); | 200 | }); |
191 | } | 201 | } |
192 | } | 202 | } |
193 | 203 | ||
194 | function parseResult(message) { | 204 | function parseResult(message) { |
195 | var data; | 205 | var data; |
196 | xml(message, function(err, result) { | 206 | xml(message, function(err, result) { |
197 | data = result; | 207 | data = result; |
198 | }); | 208 | }); |
199 | return data; | 209 | return data; |
200 | } | 210 | } |
201 | 211 | ||
202 | exports.start = start; | 212 | exports.start = start; |
203 | exports.topupRequest = topupRequest; | 213 | exports.topupRequest = topupRequest; |
204 | exports.parseResult = parseResult; | 214 | exports.parseResult = parseResult; |
205 | exports.parseSN = parseSN; | 215 | exports.parseSN = parseSN; |
206 | 216 |