Commit f916d1abf59d08096496c17c54ea4a080ae36c5b

Authored by Adhidarma Hadiwinoto
1 parent 6505ca7877
Exists in master

tambah keyword sukses

Showing 1 changed file with 3 additions and 0 deletions Inline Diff

1 "use strict"; 1 "use strict";
2 2
3 var request = require('request'); 3 var request = require('request');
4 var crypto = require('crypto'); 4 var crypto = require('crypto');
5 var url = require('url'); 5 var url = require('url');
6 var http = require('http'); 6 var http = require('http');
7 7
8 var resendDelay = require('sate24/resend-delay'); 8 var resendDelay = require('sate24/resend-delay');
9 var taskHistory = require('sate24/task-history'); 9 var taskHistory = require('sate24/task-history');
10 var RedisClient = require('sate24/redis-client'); 10 var RedisClient = require('sate24/redis-client');
11 var AntiSameDayDupe = require('sate24/anti-same-day-dupe-oo'); 11 var AntiSameDayDupe = require('sate24/anti-same-day-dupe-oo');
12 var antiSameDayDupe; 12 var antiSameDayDupe;
13 13
14 var config; 14 var config;
15 var aaa; 15 var aaa;
16 var logger; 16 var logger;
17 17
18 http.globalAgent.maxSockets = Infinity; 18 http.globalAgent.maxSockets = Infinity;
19 19
20 function start(options) { 20 function start(options) {
21 if (!options) { 21 if (!options) {
22 console.log('Undefined options, terminating....'); 22 console.log('Undefined options, terminating....');
23 process.exit(1); 23 process.exit(1);
24 } 24 }
25 25
26 if (options.config) { 26 if (options.config) {
27 config = options.config; 27 config = options.config;
28 } else { 28 } else {
29 console.log('Undefined options.config, terminating....') 29 console.log('Undefined options.config, terminating....')
30 process.exit(1); 30 process.exit(1);
31 } 31 }
32 32
33 if (options.aaa) { 33 if (options.aaa) {
34 aaa = options.aaa; 34 aaa = options.aaa;
35 } else { 35 } else {
36 console.log('Undefined options.aaa, terminating....') 36 console.log('Undefined options.aaa, terminating....')
37 process.exit(1); 37 process.exit(1);
38 } 38 }
39 39
40 if (options && options.logger) { 40 if (options && options.logger) {
41 logger = options.logger; 41 logger = options.logger;
42 } else { 42 } else {
43 console.log('Undefined options.logger, terminating....') 43 console.log('Undefined options.logger, terminating....')
44 process.exit(1); 44 process.exit(1);
45 } 45 }
46 46
47 resendDelay.init({ 47 resendDelay.init({
48 config: config, 48 config: config,
49 topupRequest: checkStatus, 49 topupRequest: checkStatus,
50 logger: logger 50 logger: logger
51 }); 51 });
52 52
53 taskHistory.init(options); 53 taskHistory.init(options);
54 //antiSameDayDupe.init(options); 54 //antiSameDayDupe.init(options);
55 55
56 createReverseHttpServer(); 56 createReverseHttpServer();
57 } 57 }
58 58
59 function _unregSameDayDupeIfTrxFail(requestId, rc) { 59 function _unregSameDayDupeIfTrxFail(requestId, rc) {
60 if (!Number(config.globals.unreg_same_day_dupe_if_trx_fail)) { 60 if (!Number(config.globals.unreg_same_day_dupe_if_trx_fail)) {
61 return; 61 return;
62 } 62 }
63 63
64 if (rc == '68' || rc == '00') { 64 if (rc == '68' || rc == '00') {
65 return; 65 return;
66 } 66 }
67 67
68 logger.verbose('Unregistering failed trx', {request_id: requestId, rc: rc}); 68 logger.verbose('Unregistering failed trx', {request_id: requestId, rc: rc});
69 antiSameDayDupe.unregister(requestId); 69 antiSameDayDupe.unregister(requestId);
70 } 70 }
71 71
72 function callbackReport(requestId, rc, message) { 72 function callbackReport(requestId, rc, message) {
73 if (rc != '68') { 73 if (rc != '68') {
74 resendDelay.cancel(requestId); 74 resendDelay.cancel(requestId);
75 _unregSameDayDupeIfTrxFail(requestId, rc); 75 _unregSameDayDupeIfTrxFail(requestId, rc);
76 } else { 76 } else {
77 taskHistory.get(requestId, function(err, archivedTask) { 77 taskHistory.get(requestId, function(err, archivedTask) {
78 if (archivedTask) { 78 if (archivedTask) {
79 resendDelay.register(archivedTask); 79 resendDelay.register(archivedTask);
80 } else { 80 } else {
81 logger.warn('Can not find task from history', {request_id: requestId}); 81 logger.warn('Can not find task from history', {request_id: requestId});
82 } 82 }
83 }); 83 });
84 } 84 }
85 85
86 aaa.callbackReportWithPushToMongoDb(requestId, rc, message); 86 aaa.callbackReportWithPushToMongoDb(requestId, rc, message);
87 } 87 }
88 88
89 function _initSameDayDupe() { 89 function _initSameDayDupe() {
90 RedisClient.init({config: config, logger: logger}); 90 RedisClient.init({config: config, logger: logger});
91 var redisClient = RedisClient.getClient(); 91 var redisClient = RedisClient.getClient();
92 92
93 logger.info('Initializing antiSameDayDupe'); 93 logger.info('Initializing antiSameDayDupe');
94 antiSameDayDupe = new AntiSameDayDupe({ 94 antiSameDayDupe = new AntiSameDayDupe({
95 config: config, 95 config: config,
96 logger: logger, 96 logger: logger,
97 keyPrefix: 'otomax.', 97 keyPrefix: 'otomax.',
98 redisClient: redisClient 98 redisClient: redisClient
99 }); 99 });
100 } 100 }
101 101
102 function topupRequest(task) { 102 function topupRequest(task) {
103 if (!aaa.isTodayTrx(task)) { 103 if (!aaa.isTodayTrx(task)) {
104 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); 104 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
105 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); 105 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
106 resendDelay.cancel(task); 106 resendDelay.cancel(task);
107 return; 107 return;
108 } 108 }
109 109
110 aaa.insertTaskToMongoDb(task); 110 aaa.insertTaskToMongoDb(task);
111 111
112 if (!antiSameDayDupe) { 112 if (!antiSameDayDupe) {
113 _initSameDayDupe(); 113 _initSameDayDupe();
114 } 114 }
115 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, checkStatus); 115 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, checkStatus);
116 } 116 }
117 117
118 function _topupRequest(task) { 118 function _topupRequest(task) {
119 taskHistory.put(task, function() { 119 taskHistory.put(task, function() {
120 requestToPartner(task);; 120 requestToPartner(task);;
121 }); 121 });
122 } 122 }
123 123
124 function checkStatus(task) { 124 function checkStatus(task) {
125 logger.verbose('Going to request checkStatus', {task: task}); 125 logger.verbose('Going to request checkStatus', {task: task});
126 taskHistory.put(task, function() { 126 taskHistory.put(task, function() {
127 requestToPartner(task, true); 127 requestToPartner(task, true);
128 }); 128 });
129 } 129 }
130 130
131 function requestToPartner(task, pendingOnErrorConnect) { 131 function requestToPartner(task, pendingOnErrorConnect) {
132 let requestOptions = createRequestOptions(task); 132 let requestOptions = createRequestOptions(task);
133 133
134 logger.info('Requesting to partner', {task: task, request_options: requestOptions}); 134 logger.info('Requesting to partner', {task: task, request_options: requestOptions});
135 135
136 request(requestOptions, function(error, response, body) { 136 request(requestOptions, function(error, response, body) {
137 if (error) { 137 if (error) {
138 let rc = '68'; 138 let rc = '68';
139 139
140 if (!pendingOnErrorConnect && (error.syscall == 'connect')) { 140 if (!pendingOnErrorConnect && (error.syscall == 'connect')) {
141 rc = '91'; 141 rc = '91';
142 } 142 }
143 143
144 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error}); 144 logger.warn('Error requesting to partner', {task: task, rc: rc, error: error});
145 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error); 145 callbackReport(task.requestId, rc, 'Error requesting to partner. ' + error);
146 return; 146 return;
147 } 147 }
148 148
149 if (response.statusCode != 200) { 149 if (response.statusCode != 200) {
150 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); 150 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode});
151 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); 151 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode);
152 return; 152 return;
153 } 153 }
154 154
155 logger.verbose('Got response from partner', {task: task, body: body}); 155 logger.verbose('Got response from partner', {task: task, body: body});
156 156
157 parseMessage(task, body); 157 parseMessage(task, body);
158 }); 158 });
159 } 159 }
160 160
161 function getRequestIdFromTask(task) { 161 function getRequestIdFromTask(task) {
162 if (typeof task == 'string') { 162 if (typeof task == 'string') {
163 return task; 163 return task;
164 } 164 }
165 165
166 try { 166 try {
167 let requestId = task.requestId; 167 let requestId = task.requestId;
168 return requestId; 168 return requestId;
169 } 169 }
170 catch(e) {return}; 170 catch(e) {return};
171 } 171 }
172 172
173 function parseMessage(task, message) { 173 function parseMessage(task, message) {
174 let requestId = getRequestIdFromTask(task); 174 let requestId = getRequestIdFromTask(task);
175 175
176 if (!requestId) { 176 if (!requestId) {
177 logger.warn('Invalid requestId on parseMessage', {task: task, message: message}); 177 logger.warn('Invalid requestId on parseMessage', {task: task, message: message});
178 return; 178 return;
179 } 179 }
180 180
181 let rc = '68'; 181 let rc = '68';
182 182
183 if (message.indexOf('SUKSES') >= 0) { 183 if (message.indexOf('SUKSES') >= 0) {
184 rc = '00'; 184 rc = '00';
185 } 185 }
186 else if (message.indexOf('Sukses') >= 0) {
187 rc = '00';
188 }
186 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) { 189 else if (message.indexOf('GAGAL. Nomor tujuan salah') >= 0) {
187 rc = '14'; 190 rc = '14';
188 } 191 }
189 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) { 192 else if (message.indexOf('NO HP TIDAK TERDAFTAR ATAU BUKAN NOMOR PRA-BAYAR') >= 0) {
190 rc = '14'; 193 rc = '14';
191 } 194 }
192 else if (message.indexOf('Gagal.') >= 0) { 195 else if (message.indexOf('Gagal.') >= 0) {
193 rc = '40'; 196 rc = '40';
194 } 197 }
195 else if (message.indexOf('GAGAL') >= 0) { 198 else if (message.indexOf('GAGAL') >= 0) {
196 rc = '40'; 199 rc = '40';
197 } 200 }
198 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) { 201 else if (message.indexOf('gagal, dibatalkan SILAHKAN DICOBA KEMBALI') >= 0) {
199 rc = '40'; 202 rc = '40';
200 } 203 }
201 else if (message.indexOf('Invalid Signature') >= 0) { 204 else if (message.indexOf('Invalid Signature') >= 0) {
202 rc = '40'; 205 rc = '40';
203 } 206 }
204 207
205 if (rc == '00') { 208 if (rc == '00') {
206 let sn = parseSn(message, config.h2h_out.sn_pattern); 209 let sn = parseSn(message, config.h2h_out.sn_pattern);
207 if (sn) { 210 if (sn) {
208 message = "SN=" + sn + ";" + message; 211 message = "SN=" + sn + ";" + message;
209 } 212 }
210 } 213 }
211 214
212 callbackReport(requestId, rc, message); 215 callbackReport(requestId, rc, message);
213 } 216 }
214 217
215 function generateSign(userid, remoteProduct, destination, requestId, pin, password) { 218 function generateSign(userid, remoteProduct, destination, requestId, pin, password) {
216 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); 219 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|");
217 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); 220 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex');
218 //let buffer = new Buffer(sha1); 221 //let buffer = new Buffer(sha1);
219 let buffer = crypto.createHash('sha1').update(plain).digest(); 222 let buffer = crypto.createHash('sha1').update(plain).digest();
220 223
221 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-'); 224 return buffer.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
222 } 225 }
223 226
224 function createRequestOptions(task) { 227 function createRequestOptions(task) {
225 return { 228 return {
226 url: config.h2h_out.partner, 229 url: config.h2h_out.partner,
227 qs: { 230 qs: {
228 memberID: config.h2h_out.userid, 231 memberID: config.h2h_out.userid,
229 product: task.remoteProduct, 232 product: task.remoteProduct,
230 dest: task.destination, 233 dest: task.destination,
231 refID: task.requestId, 234 refID: task.requestId,
232 sign: generateSign( 235 sign: generateSign(
233 config.h2h_out.userid, 236 config.h2h_out.userid,
234 task.remoteProduct, 237 task.remoteProduct,
235 task.destination, 238 task.destination,
236 task.requestId, 239 task.requestId,
237 config.h2h_out.pin, 240 config.h2h_out.pin,
238 config.h2h_out.password 241 config.h2h_out.password
239 ) 242 )
240 } 243 }
241 }; 244 };
242 } 245 }
243 246
244 function onSameDayDupe(task) { 247 function onSameDayDupe(task) {
245 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); 248 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama');
246 } 249 }
247 250
248 function reverseHttpServerServerHandler(request, response) { 251 function reverseHttpServerServerHandler(request, response) {
249 let qs = url.parse(request.url, true).query; 252 let qs = url.parse(request.url, true).query;
250 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); 253 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs});
251 254
252 parseMessage(qs.refid, qs.message); 255 parseMessage(qs.refid, qs.message);
253 } 256 }
254 257
255 function createReverseHttpServer() { 258 function createReverseHttpServer() {
256 var httpServer = http.createServer(reverseHttpServerServerHandler); 259 var httpServer = http.createServer(reverseHttpServerServerHandler);
257 260
258 httpServer.listen(config.h2h_out.listen_port, function() { 261 httpServer.listen(config.h2h_out.listen_port, function() {
259 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); 262 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port);
260 }); 263 });
261 } 264 }
262 265
263 function parseSn(message, pattern) { 266 function parseSn(message, pattern) {
264 267
265 try { 268 try {
266 let sn_regex = new RegExp(pattern); 269 let sn_regex = new RegExp(pattern);
267 let sn_match = message.match(sn_regex); 270 let sn_match = message.match(sn_regex);
268 271
269 return sn_match[1].trim(); 272 return sn_match[1].trim();
270 } 273 }
271 catch(e) { 274 catch(e) {
272 return; 275 return;
273 } 276 }
274 277
275 } 278 }
276 279
277 exports.start = start; 280 exports.start = start;
278 exports.topupRequest = topupRequest; 281 exports.topupRequest = topupRequest;
279 exports.checkStatus = checkStatus; 282 exports.checkStatus = checkStatus;
280 exports.generateSign = generateSign; 283 exports.generateSign = generateSign;
281 exports.parseSn = parseSn; 284 exports.parseSn = parseSn;
282 285