Commit 7ec4016657837ae777abb3c05de7038be30fb306
1 parent
f0303f53a1
Exists in
master
perbaikan parsesn
Showing 2 changed files with 19 additions and 32 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 | 5 | ||
6 | var config; | 6 | var config; |
7 | var callbackReport; | 7 | var callbackReport; |
8 | 8 | ||
9 | var max_retry = 3; | 9 | var max_retry = 3; |
10 | var sleep_before_retry = 3000; | 10 | var sleep_before_retry = 3000; |
11 | 11 | ||
12 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; | 12 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; |
13 | 13 | ||
14 | function parseSN(message) { | 14 | function parseSN(message, _config) { |
15 | var sn_regex = new RegExp(config.h2h_out.sn_pattern); | 15 | |
16 | if (!_config) { | ||
17 | _config = config; | ||
18 | } | ||
19 | |||
20 | var sn_regex = new RegExp(_config.h2h_out.sn_pattern); | ||
16 | var sn_match = message.match(sn_regex); | 21 | var sn_match = message.match(sn_regex); |
17 | 22 | ||
18 | if (sn_match <= 0) { | 23 | if (sn_match <= 0) { |
19 | console.log('SN Not found: ' + message); | 24 | console.log('SN Not found: ' + message); |
20 | return ''; | 25 | return ''; |
21 | } | 26 | } |
22 | 27 | ||
23 | var sn = sn_match[0]; | 28 | var sn = sn_match[0]; |
24 | var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator); | 29 | var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); |
25 | 30 | ||
26 | var count = sn_remove_patterns.length; | 31 | var count = sn_remove_patterns.length; |
27 | 32 | ||
28 | for(var i = 0; i < count; i++) { | 33 | for(var i = 0; i < count; i++) { |
29 | sn = sn.replace(sn_remove_patterns[i], ''); | 34 | sn = sn.replace(sn_remove_patterns[i], ''); |
30 | } | 35 | } |
31 | 36 | ||
32 | return sn.trim(); | 37 | return sn.trim(); |
33 | } | 38 | } |
34 | 39 | ||
35 | 40 | ||
36 | function topupRequest(task, retry) { | 41 | function topupRequest(task, retry) { |
37 | if (config.globals.requests_count == undefined) { | 42 | if (config.globals.requests_count == undefined) { |
38 | config.globals.requests_count = 1; | 43 | config.globals.requests_count = 1; |
39 | } else { | 44 | } else { |
40 | config.globals.requests_count++; | 45 | config.globals.requests_count++; |
41 | } | 46 | } |
42 | 47 | ||
43 | if (config.globals.active_requests_count == undefined) { | 48 | if (config.globals.active_requests_count == undefined) { |
44 | config.globals.active_requests_count = 1; | 49 | config.globals.active_requests_count = 1; |
45 | } else { | 50 | } else { |
46 | config.globals.active_requests_count++; | 51 | config.globals.active_requests_count++; |
47 | } | 52 | } |
48 | 53 | ||
49 | if (config.globals.max_active_requests_count == undefined) { | 54 | if (config.globals.max_active_requests_count == undefined) { |
50 | config.globals.max_active_requests_count = config.globals.active_requests_count; | 55 | config.globals.max_active_requests_count = config.globals.active_requests_count; |
51 | } else { | 56 | } else { |
52 | config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); | 57 | config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); |
53 | } | 58 | } |
54 | 59 | ||
55 | 60 | ||
56 | if (retry === undefined) { | 61 | if (retry === undefined) { |
57 | retry = max_retry; | 62 | retry = max_retry; |
58 | } | 63 | } |
59 | 64 | ||
60 | var params = { | 65 | var params = { |
61 | userid: config.h2h_out.userid, | 66 | userid: config.h2h_out.userid, |
62 | pwd: config.h2h_out.password, | 67 | pwd: config.h2h_out.password, |
63 | memberreff: task['requestId'], | 68 | memberreff: task['requestId'], |
64 | produk: task['remoteProduct'], | 69 | produk: task['remoteProduct'], |
65 | tujuan: task['destination'] | 70 | tujuan: task['destination'] |
66 | }; | 71 | }; |
67 | console.log('PARAMS:'); | 72 | console.log('PARAMS:'); |
68 | console.log(params); | 73 | console.log(params); |
69 | 74 | ||
70 | request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { | 75 | request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { |
71 | 76 | ||
72 | config.globals.active_requests_count--; | 77 | config.globals.active_requests_count--; |
73 | 78 | ||
74 | if (err) { | 79 | if (err) { |
75 | console.log('HTTP Request Error (' + task['requestId'] + '): '); | 80 | console.log('HTTP Request Error (' + task['requestId'] + '): '); |
76 | console.log(err); | 81 | console.log(err); |
77 | 82 | ||
78 | if (retry) { | 83 | if (retry) { |
79 | 84 | ||
80 | console.log('Retrying trx hit (' + retry + ')'); | 85 | console.log('Retrying trx hit (' + retry + ')'); |
81 | setTimeout(function() { | 86 | setTimeout(function() { |
82 | topupRequest(task, retry - 1); | 87 | topupRequest(task, retry - 1); |
83 | }, sleep_before_retry); | 88 | }, sleep_before_retry); |
84 | 89 | ||
85 | } else { | 90 | } else { |
86 | callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier'); | 91 | callbackReport(task['requestId'], '40', 'Gangguan koneksi ke suplier'); |
87 | } | 92 | } |
88 | return; | 93 | return; |
89 | } | 94 | } |
90 | 95 | ||
91 | console.log('Server Response: '); | 96 | console.log('Server Response: '); |
92 | console.log(httpResponseBody); | 97 | console.log(httpResponseBody); |
93 | 98 | ||
94 | if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { | 99 | if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { |
95 | callbackReport(task['requestId'], '40', '502 Proxy error'); | 100 | callbackReport(task['requestId'], '40', '502 Proxy error'); |
96 | return; | 101 | return; |
97 | } | 102 | } |
98 | 103 | ||
99 | xml(httpResponseBody, function(err, result) { | 104 | xml(httpResponseBody, function(err, result) { |
100 | if (err) { | 105 | if (err) { |
101 | console.log('Gagal parsing XML respon server'); | 106 | console.log('Gagal parsing XML respon server'); |
102 | //topupRequest(task, retry - 1); | 107 | //topupRequest(task, retry - 1); |
103 | callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); | 108 | callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); |
104 | return; | 109 | return; |
105 | } | 110 | } |
106 | 111 | ||
107 | console.log('Response Data:'); | 112 | console.log('Response Data:'); |
108 | console.log(result); | 113 | console.log(result); |
109 | 114 | ||
110 | var response_code = result.respon.rc[0].replace(/^00/, ''); | 115 | var response_code = result.respon.rc[0].replace(/^00/, ''); |
111 | 116 | ||
112 | var token = ''; | 117 | var token = ''; |
113 | if (result.respon.token) { | 118 | if (result.respon.token) { |
114 | token = result.respon.token[0]; | 119 | token = result.respon.token[0]; |
115 | } | 120 | } |
116 | 121 | ||
117 | var data_pelanggan = 'NO-DATA'; | 122 | var data_pelanggan = 'NO-DATA'; |
118 | if (result.respon.data) { | 123 | if (result.respon.data) { |
119 | data_pelanggan = result.respon.data[0].replace(/ /g, '-'); | 124 | data_pelanggan = result.respon.data[0].replace(/ /g, '-'); |
120 | } | 125 | } |
121 | 126 | ||
122 | var message = result.respon.pesan[0].replace(/\n/g, ' '); | 127 | var message = result.respon.pesan[0].replace(/\n/g, ' '); |
123 | 128 | ||
124 | 129 | ||
125 | if (response_code == '00') { | 130 | if (response_code == '00') { |
126 | 131 | ||
127 | var sn = ""; | 132 | var sn = ""; |
128 | 133 | ||
129 | if (config.h2h_out.parse_sn == 'YES') { | 134 | if (config.h2h_out.parse_sn == 'YES') { |
130 | sn = parseSN(message); | 135 | sn = parseSN(message); |
131 | } else if (token && data_pelanggan) { | 136 | } else if (token && data_pelanggan) { |
132 | sn = token + '/' + data_pelanggan; | 137 | sn = token + '/' + data_pelanggan; |
133 | } | 138 | } |
134 | 139 | ||
135 | message = 'SN=' + sn + '; ' + message; | 140 | message = 'SN=' + sn + '; ' + message; |
136 | } | 141 | } |
137 | 142 | ||
138 | callbackReport(task['requestId'], response_code, message); | 143 | callbackReport(task['requestId'], response_code, message); |
139 | 144 | ||
140 | if (response_code == '54' || response_code == '68') { | 145 | if (response_code == '54' || response_code == '68') { |
141 | setTimeout(function() { | 146 | setTimeout(function() { |
142 | topupRequest(task, 5); | 147 | topupRequest(task, 5); |
143 | }, 60000); | 148 | }, 60000); |
144 | } | 149 | } |
145 | 150 | ||
146 | }); | 151 | }); |
147 | }); | 152 | }); |
148 | } | 153 | } |
149 | 154 | ||
150 | function start(_config, _callbackReport) { | 155 | function start(_config, _callbackReport) { |
151 | config = _config; | 156 | config = _config; |
152 | callbackReport = _callbackReport | 157 | callbackReport = _callbackReport |
153 | } | 158 | } |
154 | 159 | ||
155 | function parseSN(message) { | ||
156 | var sn_regex = new RegExp(config.h2h_out.sn_pattern); | ||
157 | var sn_match = message.match(sn_regex); | ||
158 | |||
159 | //console.log('SN MATCH:'); | ||
160 | //console.log(sn_match); | ||
161 | |||
162 | if (sn_match <= 0) { | ||
163 | console.log('SN Not found: ' + message); | ||
164 | return ''; | ||
165 | } | ||
166 | |||
167 | var sn = sn_match[0]; | ||
168 | var sn_remove_patterns = config.h2h_out.sn_remove_patterns.split(config.h2h_out.sn_remove_patterns_separator); | ||
169 | //console.log('SN REMOVE PATTERNS:'); | ||
170 | //console.log (sn_remove_patterns); | ||
171 | |||
172 | var count = sn_remove_patterns.length; | ||
173 | |||
174 | for(var i = 0; i < count; i++) { | ||
175 | sn = sn.replace(sn_remove_patterns[i], ''); | ||
176 | } | ||
177 | |||
178 | return sn.trim(); | ||
179 | } | ||
180 | |||
181 | function parseResult(message) { | 160 | function parseResult(message) { |
182 | var data; | 161 | var data; |
183 | xml(message, function(err, result) { | 162 | xml(message, function(err, result) { |
184 | data = result; | 163 | data = result; |
185 | }); | 164 | }); |
186 | return data; | 165 | return data; |
187 | } | 166 | } |
188 | 167 |
test.js
1 | var assert = require("assert"); | 1 | var assert = require("assert"); |
2 | 2 | ||
3 | 3 | ||
4 | describe('aaa', function() { | 4 | describe('aaa', function() { |
5 | var aaa = require('./aaa'); | 5 | var aaa = require('./aaa'); |
6 | 6 | ||
7 | describe("#unaliasResponseCode()", function() { | 7 | describe("#unaliasResponseCode()", function() { |
8 | it('should return 68', function() { | 8 | it('should return 68', function() { |
9 | assert.equal('68', aaa.unaliasResponseCode('01', '01:68')); | 9 | assert.equal('68', aaa.unaliasResponseCode('01', '01:68')); |
10 | }); | 10 | }); |
11 | 11 | ||
12 | it('should return 68', function() { | 12 | it('should return 68', function() { |
13 | assert.equal('68', aaa.unaliasResponseCode('68', '01:68')); | 13 | assert.equal('68', aaa.unaliasResponseCode('68', '01:68')); |
14 | }); | 14 | }); |
15 | 15 | ||
16 | it('should return 00', function() { | 16 | it('should return 00', function() { |
17 | assert.equal('00', aaa.unaliasResponseCode('00', '01:68')); | 17 | assert.equal('00', aaa.unaliasResponseCode('00', '01:68')); |
18 | }); | 18 | }); |
19 | 19 | ||
20 | it('should return 40', function() { | 20 | it('should return 40', function() { |
21 | assert.equal('40', aaa.unaliasResponseCode('40', '')); | 21 | assert.equal('40', aaa.unaliasResponseCode('40', '')); |
22 | }); | 22 | }); |
23 | 23 | ||
24 | it('should return 40', function() { | 24 | it('should return 40', function() { |
25 | assert.equal('40', aaa.unaliasResponseCode('40', '')); | 25 | assert.equal('40', aaa.unaliasResponseCode('40', '')); |
26 | }); | 26 | }); |
27 | 27 | ||
28 | it('should return 40', function() { | 28 | it('should return 40', function() { |
29 | assert.equal('40', aaa.unaliasResponseCode('40')); | 29 | assert.equal('40', aaa.unaliasResponseCode('40')); |
30 | }); | 30 | }); |
31 | 31 | ||
32 | }); | 32 | }); |
33 | }); | 33 | }); |
34 | 34 | ||
35 | describe('httppulsakita', function() { | 35 | describe('httppulsakita', function() { |
36 | var partner = require('./httppulsakita'); | 36 | var partner = require('./httppulsakita'); |
37 | 37 | ||
38 | describe("#parseResult()", function() { | 38 | describe("#parseResult()", function() { |
39 | message = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><respon><tanggal>2015/6/16 15:43:35</tanggal><idagen>P0039</idagen><refid>AEE15B32987941D89FFF4BC7EF676C13</refid><produk>PLN20</produk><tujuan>14204279369</tujuan><rc>0000</rc><data> </data><token> </token><pesan>#14836 PLN20 ke:14204279369 SUKSES. SN:3520-2887-6627-6699-4826/TestDummyPanjang6955555/P1/7000VA/32,4. \ | 39 | message = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><respon><tanggal>2015/6/16 15:43:35</tanggal><idagen>P0039</idagen><refid>AEE15B32987941D89FFF4BC7EF676C13</refid><produk>PLN20</produk><tujuan>14204279369</tujuan><rc>0000</rc><data> </data><token> </token><pesan>#14836 PLN20 ke:14204279369 SUKSES. SN:3520-2887-6627-6699-4826/TestDummyPanjang6955555/P1/7000VA/32,4. \ |
40 | Sisa saldo Rp. 5,000,000 - Rp. 18,700 = Rp. 4,981,300</pesan></respon>'; | 40 | Sisa saldo Rp. 5,000,000 - Rp. 18,700 = Rp. 4,981,300</pesan></respon>'; |
41 | 41 | ||
42 | data = partner.parseResult(message); | 42 | data = partner.parseResult(message); |
43 | console.log(data); | 43 | console.log(data); |
44 | 44 | ||
45 | it('should return 2015/6/16 15:43:35', function() { | 45 | it('should return 2015/6/16 15:43:35', function() { |
46 | assert.equal('2015/6/16 15:43:35', data.respon.tanggal); | 46 | assert.equal('2015/6/16 15:43:35', data.respon.tanggal); |
47 | }); | 47 | }); |
48 | }); | 48 | }); |
49 | 49 | ||
50 | /* | 50 | |
51 | describe("parseSN()", function() { | 51 | describe("parseSN()", function() { |
52 | config = { | ||
53 | h2h_out: { | ||
54 | parse_sn: 'YES', | ||
55 | sn_pattern: 'refnum \\w* pada', | ||
56 | sn_remove_patterns_separator: '|', | ||
57 | sn_remove_patterns: 'refnum | pada' | ||
58 | } | ||
59 | }; | ||
52 | 60 | ||
53 | message = "#14837 XR5 ke:081809903333 SUKSES. Isi pulsa XR5 berhasil untuk nomor 6281809903333 sebesar 5.000, refnum B93D0792A47841AE03B0000000000000 pada tgl 16/06/15 15:47. \ | 61 | message = "#14837 XR5 ke:081809903333 SUKSES. Isi pulsa XR5 berhasil untuk nomor 6281809903333 sebesar 5.000, refnum B93D0792A47841AE03B0000000000000 pada tgl 16/06/15 15:47. \ |
54 | Sisa saldo Rp. 4,981,300 - Rp. 5,250 = Rp. 4,976,050"; | 62 | Sisa saldo Rp. 4,981,300 - Rp. 5,250 = Rp. 4,976,050"; |
55 | it ('should return B93D0792A47841AE03B0000000000000', function() { | 63 | it ('should return B93D0792A47841AE03B0000000000000', function() { |
56 | assert.equal('B93D0792A47841AE03B0000000000000', parseSN(message)); | 64 | assert.equal('B93D0792A47841AE03B0000000000000', partner.parseSN(message, config)); |
57 | }); | 65 | }); |
58 | 66 | ||
59 | }); | 67 | }); |
60 | */ | 68 | |
61 | }); | 69 | }); |
62 | 70 |