Commit 8217aa236d15d95117ea11704e1079a1803a1e67

Authored by Adhidarma Hadiwinoto
1 parent 98991daa27
Exists in master

generateSign digest menghasilkan buffer

Showing 2 changed files with 5 additions and 4 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 antiSameDayDupe = require('sate24/anti-same-day-dupe'); 10 var antiSameDayDupe = require('sate24/anti-same-day-dupe');
11 11
12 var config; 12 var config;
13 var aaa; 13 var aaa;
14 var logger; 14 var logger;
15 15
16 16
17 function start(options) { 17 function start(options) {
18 if (!options) { 18 if (!options) {
19 console.log('Undefined options, terminating....'); 19 console.log('Undefined options, terminating....');
20 process.exit(1); 20 process.exit(1);
21 } 21 }
22 22
23 if (options.config) { 23 if (options.config) {
24 config = options.config; 24 config = options.config;
25 } else { 25 } else {
26 console.log('Undefined options.config, terminating....') 26 console.log('Undefined options.config, terminating....')
27 process.exit(1); 27 process.exit(1);
28 } 28 }
29 29
30 if (options.aaa) { 30 if (options.aaa) {
31 aaa = options.aaa; 31 aaa = options.aaa;
32 } else { 32 } else {
33 console.log('Undefined options.aaa, terminating....') 33 console.log('Undefined options.aaa, terminating....')
34 process.exit(1); 34 process.exit(1);
35 } 35 }
36 36
37 if (options && options.logger) { 37 if (options && options.logger) {
38 logger = options.logger; 38 logger = options.logger;
39 } else { 39 } else {
40 console.log('Undefined options.logger, terminating....') 40 console.log('Undefined options.logger, terminating....')
41 process.exit(1); 41 process.exit(1);
42 } 42 }
43 43
44 resendDelay.init({ 44 resendDelay.init({
45 config: config, 45 config: config,
46 topupRequest: topupRequest, 46 topupRequest: topupRequest,
47 logger: logger 47 logger: logger
48 }); 48 });
49 49
50 taskHistory.init(options); 50 taskHistory.init(options);
51 antiSameDayDupe.init(options); 51 antiSameDayDupe.init(options);
52 52
53 createReverseHttpServer(); 53 createReverseHttpServer();
54 } 54 }
55 55
56 function callbackReport(requestId, rc, message) { 56 function callbackReport(requestId, rc, message) {
57 if (responseCode != '68' || dontResendDelay) { 57 if (responseCode != '68' || dontResendDelay) {
58 resendDelay.cancel(requestId); 58 resendDelay.cancel(requestId);
59 } else { 59 } else {
60 taskHistory.get(requestId, function(err, archivedTask) { 60 taskHistory.get(requestId, function(err, archivedTask) {
61 if (archivedTask) { 61 if (archivedTask) {
62 logger.verbose('DEBUG', {archivedTask: archivedTask}); 62 logger.verbose('DEBUG', {archivedTask: archivedTask});
63 resendDelay.register(archivedTask); 63 resendDelay.register(archivedTask);
64 } 64 }
65 }); 65 });
66 } 66 }
67 67
68 options.aaa.callbackReportWithPushToMongoDb(requestId, rc, message); 68 options.aaa.callbackReportWithPushToMongoDb(requestId, rc, message);
69 } 69 }
70 70
71 function topupRequest(task) { 71 function topupRequest(task) {
72 if (!aaa.isTodayTrx(task)) { 72 if (!aaa.isTodayTrx(task)) {
73 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan'); 73 logger.warn('Maaf, transaksi beda hari tidak dapat dilakukan');
74 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan'); 74 callbackReport(task.requestId, '68', 'Maaf, transaksi beda hari tidak dapat dilakukan');
75 resendDelay.cancel(task); 75 resendDelay.cancel(task);
76 return; 76 return;
77 } 77 }
78 78
79 aaa.insertTaskToMongoDb(task); 79 aaa.insertTaskToMongoDb(task);
80 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest); 80 antiSameDayDupe.check(task, _topupRequest, onSameDayDupe, _topupRequest);
81 } 81 }
82 82
83 function _topupRequest(task) { 83 function _topupRequest(task) {
84 taskHistory.put(task, function() { 84 taskHistory.put(task, function() {
85 requestToPartner(task);; 85 requestToPartner(task);;
86 }); 86 });
87 } 87 }
88 88
89 function requestToPartner(task) { 89 function requestToPartner(task) {
90 let requestOptions = createRequestOptions(task); 90 let requestOptions = createRequestOptions(task);
91 91
92 logger.info('Requesting to partner', {task: task, request_options: requestOptions}); 92 logger.info('Requesting to partner', {task: task, request_options: requestOptions});
93 93
94 request(requestOptions, function(error, response, body) { 94 request(requestOptions, function(error, response, body) {
95 if (error) { 95 if (error) {
96 logger.warn('Error requesting to partner', {task: task, error: error}); 96 logger.warn('Error requesting to partner', {task: task, error: error});
97 callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error); 97 callbackReport(task.requestId, '68', 'Error requesting to partner. ' + error);
98 return; 98 return;
99 } 99 }
100 100
101 if (response.statusCode != 200) { 101 if (response.statusCode != 200) {
102 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode}); 102 logger.warn('HTTP status code is not 200', {task: task, http_status_code: response.statusCode});
103 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode); 103 callbackReport(task.requestId, '40', 'HTTP status code ' + response.statusCode);
104 return; 104 return;
105 } 105 }
106 106
107 logger.verbose('Got response from partner', {task: task, body: body}); 107 logger.verbose('Got response from partner', {task: task, body: body});
108 108
109 parseMessage(task, body); 109 parseMessage(task, body);
110 }); 110 });
111 } 111 }
112 112
113 function parseMessage(task, message) { 113 function parseMessage(task, message) {
114 let rc = '68'; 114 let rc = '68';
115 115
116 if (message.indexOf('SUKSES') >= 0) { 116 if (message.indexOf('SUKSES') >= 0) {
117 rc = '00'; 117 rc = '00';
118 } 118 }
119 else if (message.indexOf('GAGAL') >= 0) { 119 else if (message.indexOf('GAGAL') >= 0) {
120 rc = '40'; 120 rc = '40';
121 } 121 }
122 122
123 callbackReport(task.requestId, rc, message); 123 callbackReport(task.requestId, rc, message);
124 } 124 }
125 125
126 function generateSign(userid, remoteProduct, destination, requestId, pin, password) { 126 function generateSign(userid, remoteProduct, destination, requestId, pin, password) {
127 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|"); 127 let plain = ["OtomaX", userid, remoteProduct, destination, requestId, pin, password].join("|");
128 let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex'); 128 //let sha1 = crypto.createHash('sha1').update(plain).digest().toString('hex');
129 let buffer = new Buffer(sha1); 129 //let buffer = new Buffer(sha1);
130 let buffer = crypto.createHash('sha1').update(plain).digest();
130 131
131 return buffer.toString('base64'); 132 return buffer.toString('base64').replace(/\//g, '_');
132 } 133 }
133 134
134 function createRequestOptions(task) { 135 function createRequestOptions(task) {
135 return { 136 return {
136 url: config.h2h_out.partner, 137 url: config.h2h_out.partner,
137 qs: { 138 qs: {
138 memberID: config.h2h_out.userid, 139 memberID: config.h2h_out.userid,
139 product: task.remoteProduct, 140 product: task.remoteProduct,
140 dest: task.destination, 141 dest: task.destination,
141 refID: task.requestId, 142 refID: task.requestId,
142 sign: generateSign( 143 sign: generateSign(
143 config.h2h_out.userid, 144 config.h2h_out.userid,
144 task.remoteProduct, 145 task.remoteProduct,
145 task.destination, 146 task.destination,
146 task.requestId, 147 task.requestId,
147 config.h2h_out.pin, 148 config.h2h_out.pin,
148 config.h2h_out.password 149 config.h2h_out.password
149 ) 150 )
150 } 151 }
151 }; 152 };
152 } 153 }
153 154
154 function onSameDayDupe(task) { 155 function onSameDayDupe(task) {
155 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama'); 156 callbackReport(task.requestId, '55', 'Transaksi duplikat dalam satu hari yang sama');
156 } 157 }
157 158
158 function createReverseHttpServer() { 159 function createReverseHttpServer() {
159 var httpServer = http.createServer(function(request, response) { 160 var httpServer = http.createServer(function(request, response) {
160 let qs = url.parse(request.url, true).query; 161 let qs = url.parse(request.url, true).query;
161 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs}); 162 logger.verbose('Hit on Reverse HTTP server', {url: request.url, qs: qs});
162 }); 163 });
163 164
164 httpServer.listen(config.h2h_out.listen_port, function() { 165 httpServer.listen(config.h2h_out.listen_port, function() {
165 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port); 166 logger.info('Reverse Report HTTP Server listen on %d', config.h2h_out.listen_port);
166 }); 167 });
167 } 168 }
168 169
169 exports.start = start; 170 exports.start = start;
170 exports.topupRequest = topupRequest; 171 exports.topupRequest = topupRequest;
171 exports.generateSign = generateSign; 172 exports.generateSign = generateSign;
172 173
1 var should = require('should'); 1 var should = require('should');
2 var partner = require('./partner-otomax'); 2 var partner = require('./partner-otomax');
3 3
4 describe ('#partner', function() { 4 describe ('#partner', function() {
5 describe('generateSign', function() { 5 describe('generateSign', function() {
6 it('should return correct sign based on example from otomax doc', function() { 6 it('should return correct sign based on example from otomax doc', function() {
7 partner.generateSign('YUSUF', 'XX10', '08123456789', '2140669', '1144', 'abcd').should.equal('YmU1YWNkZjU4YmFlZTMxMWMwNGZjZmRiNWM4NTA3MmIwZDhkOGM3YQ=='); 7 partner.generateSign('YUSUF', 'XX10', '08123456789', '2140669', '1144', 'abcd').should.equal('vlrN9Yuu4xHAT8_bXIUHKw2NjHo=');
8 }) 8 })
9 }); 9 });
10 }); 10 });
11 11