Commit bf636f78efdc5e8e04d06342d2e1b0d678f88a03
1 parent
1616520506
Exists in
master
penanganan trx gagal
Showing 1 changed file with 32 additions and 23 deletions Inline Diff
partner-trustlink.js
1 | var winston = require('winston'); | 1 | var winston = require('winston'); |
2 | var request = require('request'); | 2 | var request = require('request'); |
3 | var strftime = require('strftime'); | 3 | var strftime = require('strftime'); |
4 | var url = require('url'); | 4 | var url = require('url'); |
5 | var xor = require('base64-xor'); | 5 | var xor = require('base64-xor'); |
6 | var http = require('http'); | 6 | var http = require('http'); |
7 | var xml = require('xml'); | 7 | var xml = require('xml'); |
8 | var xml2js = require('xml2js').parseString; | 8 | var xml2js = require('xml2js').parseString; |
9 | 9 | ||
10 | var max_retry = 3; | 10 | var max_retry = 3; |
11 | var sleep_before_retry = 2000; | 11 | var sleep_before_retry = 2000; |
12 | 12 | ||
13 | var config; | 13 | var config; |
14 | var callbackReport; | 14 | var callbackReport; |
15 | var aaa; | 15 | var aaa; |
16 | var logger; | 16 | var logger; |
17 | var options; | 17 | var options; |
18 | 18 | ||
19 | function start(_config, _callbackReport, options) { | 19 | function start(_config, _callbackReport, options) { |
20 | config = _config; | 20 | config = _config; |
21 | callbackReport = _callbackReport | 21 | callbackReport = _callbackReport |
22 | 22 | ||
23 | if (options && options.aaa) { | 23 | if (options && options.aaa) { |
24 | aaa = options.aaa; | 24 | aaa = options.aaa; |
25 | } | 25 | } |
26 | 26 | ||
27 | if (options && options.logger) { | 27 | if (options && options.logger) { |
28 | logger = options.logger; | 28 | logger = options.logger; |
29 | } else { | 29 | } else { |
30 | logger = new winston.Logger({ | 30 | logger = new winston.Logger({ |
31 | transports: [ | 31 | transports: [ |
32 | new (winston.transports.Console)() | 32 | new (winston.transports.Console)() |
33 | ] | 33 | ] |
34 | }); | 34 | }); |
35 | } | 35 | } |
36 | 36 | ||
37 | createReverseReportServer(); | 37 | createReverseReportServer(); |
38 | } | 38 | } |
39 | 39 | ||
40 | function createReverseReportServer() { | 40 | function createReverseReportServer() { |
41 | var httpServer = http.createServer(onReverseReport).listen(config.h2h_out.listen_port, function() { | 41 | var httpServer = http.createServer(onReverseReport).listen(config.h2h_out.listen_port, function() { |
42 | logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); | 42 | logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); |
43 | }); | 43 | }); |
44 | } | 44 | } |
45 | 45 | ||
46 | function onReverseReport(req, res) { | 46 | function onReverseReport(req, res) { |
47 | res.end('OK'); | 47 | res.end('OK'); |
48 | 48 | ||
49 | var qs = url.parse(req.url, true).query; | 49 | var qs = url.parse(req.url, true).query; |
50 | logger.info('Reverse Report', {qs: qs}); | 50 | logger.info('Reverse Report', {qs: qs}); |
51 | } | 51 | } |
52 | 52 | ||
53 | function calculateSignature(ts, destination, password) { | 53 | function calculateSignature(ts, destination, password) { |
54 | var a = ts + destination.substr(destination.length - 4); | 54 | var a = ts + destination.substr(destination.length - 4); |
55 | var b = destination.substr(destination.length - 4).split('').reverse().join('') + password; | 55 | var b = destination.substr(destination.length - 4).split('').reverse().join('') + password; |
56 | 56 | ||
57 | return xor.encode(a,b); | 57 | return xor.encode(a,b); |
58 | } | 58 | } |
59 | 59 | ||
60 | function createXmlPayload(task, userid, password) { | 60 | function createXmlPayload(task, userid, password) { |
61 | var ts = strftime('%H%M%S', new Date()); | 61 | var ts = strftime('%H%M%S', new Date()); |
62 | 62 | ||
63 | var signature = calculateSignature(ts, task.destination, password); | 63 | var signature = calculateSignature(ts, task.destination, password); |
64 | 64 | ||
65 | var payload = { | 65 | var payload = { |
66 | evoucher: [ | 66 | evoucher: [ |
67 | {command: 'TOPUP'}, | 67 | {command: 'TOPUP'}, |
68 | {product: task.remoteProduct}, | 68 | {product: task.remoteProduct}, |
69 | {userid: userid}, | 69 | {userid: userid}, |
70 | {time: ts}, | 70 | {time: ts}, |
71 | {msisdn: task.destination}, | 71 | {msisdn: task.destination}, |
72 | {partner_trxid: task.requestId}, | 72 | {partner_trxid: task.requestId}, |
73 | {signature: signature}, | 73 | {signature: signature}, |
74 | {trxke: 1}, | 74 | {trxke: 1}, |
75 | ] | 75 | ] |
76 | }; | 76 | }; |
77 | 77 | ||
78 | if (logger) { | 78 | if (logger) { |
79 | logger.verbose('Generate xml payload', {payload: payload}); | 79 | logger.verbose('Generate xml payload', {payload: payload}); |
80 | } | 80 | } |
81 | 81 | ||
82 | return "<?xml version=\"1.0\" ?>\n" + xml(payload); | 82 | return "<?xml version=\"1.0\" ?>\n" + xml(payload); |
83 | } | 83 | } |
84 | 84 | ||
85 | function topupRequest(task, retry) { | 85 | function topupRequest(task, retry) { |
86 | if (retry === undefined) { | 86 | if (retry === undefined) { |
87 | retry = max_retry; | 87 | retry = max_retry; |
88 | } | 88 | } |
89 | 89 | ||
90 | var payload = createXmlPayload(task, config.h2h_out.userid, config.h2h_out.password); | 90 | var payload = createXmlPayload(task, config.h2h_out.userid, config.h2h_out.password); |
91 | 91 | ||
92 | var partner = url.parse(config.h2h_out.partner); | 92 | var partner = url.parse(config.h2h_out.partner); |
93 | 93 | ||
94 | var request_options = { | 94 | var request_options = { |
95 | host: partner.hostname, | 95 | host: partner.hostname, |
96 | path: partner.path, | 96 | path: partner.path, |
97 | port: partner.port, | 97 | port: partner.port, |
98 | method: "POST", | 98 | method: "POST", |
99 | headers: { | 99 | headers: { |
100 | 'Content-Type': 'text/xml', | 100 | 'Content-Type': 'text/xml', |
101 | 'Content-Length': Buffer.byteLength(payload) | 101 | 'Content-Length': Buffer.byteLength(payload) |
102 | } | 102 | } |
103 | }; | 103 | }; |
104 | 104 | ||
105 | var buffer = ""; | 105 | var buffer = ""; |
106 | 106 | ||
107 | logger.info('Requesting to partner', {request_options: request_options}); | 107 | logger.info('Requesting to partner', {request_options: request_options}); |
108 | 108 | ||
109 | var req = http.request(request_options, function( res ) { | 109 | var req = http.request(request_options, function( res ) { |
110 | 110 | ||
111 | logger.verbose('Status code: ' + res.statusCode ); | 111 | logger.verbose('Status code: ' + res.statusCode ); |
112 | var buffer = ""; | 112 | var buffer = ""; |
113 | res.on( "data", function( data ) { buffer = buffer + data; } ); | 113 | res.on( "data", function( data ) { buffer = buffer + data; } ); |
114 | res.on( "end", function( data ) { | 114 | res.on( "end", function( data ) { |
115 | logger.verbose('Got direct response from partner', {resp: buffer}); | 115 | logger.verbose('Got direct response from partner', {resp: buffer}); |
116 | directResponseHandler(buffer, task); | 116 | directResponseHandler(buffer, task); |
117 | }); | 117 | }); |
118 | 118 | ||
119 | }); | 119 | }); |
120 | 120 | ||
121 | req.on('error', function(e) { | 121 | req.on('error', function(e) { |
122 | logger.warn('problem with request: ' + e.message); | 122 | logger.warn('problem with request: ' + e.message); |
123 | callbackReport(task.requestId, '68', e.message); | 123 | callbackReport(task.requestId, '68', e.message); |
124 | return; | 124 | return; |
125 | }); | 125 | }); |
126 | 126 | ||
127 | logger.verbose('Sending payload to partner', {payload: payload}); | 127 | logger.verbose('Sending payload to partner', {payload: payload}); |
128 | req.write( payload ); | 128 | req.write( payload ); |
129 | req.end(); | 129 | req.end(); |
130 | } | 130 | } |
131 | 131 | ||
132 | function directResponseHandler(body, task) { | 132 | function directResponseHandler(body, task) { |
133 | 133 | ||
134 | logger.info('Got direct response'); | 134 | logger.info('Got direct response'); |
135 | 135 | ||
136 | xml2js(body, function (err, result) { | 136 | xml2js(body, function (err, result) { |
137 | if (err) { | 137 | if (err) { |
138 | logger.warn('Error parsing xml', {body: body}); | 138 | logger.warn('Error parsing xml', {body: body}); |
139 | callbackReport(request_id, '68', buffer); | 139 | callbackReport(request_id, '68', buffer); |
140 | return; | 140 | return; |
141 | } | 141 | } |
142 | 142 | ||
143 | logger.info('Direct response parsed', {result: result}); | 143 | logger.info('Direct response parsed', {result: result}); |
144 | 144 | ||
145 | var response_code = '68'; | 145 | var response_code = '68'; |
146 | 146 | ||
147 | var request_id = task.requestId; | 147 | var request_id = task.requestId; |
148 | var status = result.evoucher.result[0].trim(); | 148 | var status = result.evoucher.result[0].trim(); |
149 | var message = result.evoucher.value[0].string[0].trim(); | 149 | var message = result.evoucher.value[0].string[0].trim(); |
150 | 150 | ||
151 | if (status == '0') { | 151 | if (status == '0') { |
152 | response_code = '00'; | 152 | if (message.indexOf('SUKSES') >= 0) { |
153 | response_code = '00'; | ||
154 | } | ||
155 | else if (message.indexOf('GAGAL') >= 0) { | ||
156 | response_code = '40'; | ||
157 | } | ||
158 | else { | ||
159 | response_code = '68'; | ||
160 | } | ||
161 | |||
153 | } | 162 | } |
154 | else if (status == "-1") { | 163 | else if (status == "-1") { |
155 | response_code = '40'; | 164 | response_code = '40'; |
156 | 165 | ||
157 | /* | 166 | /* |
158 | var new_response_code = responseCodeFromMessage(message); | 167 | var new_response_code = responseCodeFromMessage(message); |
159 | if (new_response_code) { | 168 | if (new_response_code) { |
160 | response_code = new_response_code; | 169 | response_code = new_response_code; |
161 | } | 170 | } |
162 | */ | 171 | */ |
163 | 172 | ||
164 | } else { | 173 | } else { |
165 | response_code = '68'; | 174 | response_code = '68'; |
166 | } | 175 | } |
167 | 176 | ||
168 | callbackReport(request_id, response_code, message); | 177 | callbackReport(request_id, response_code, message); |
169 | }); | 178 | }); |
170 | } | 179 | } |
171 | 180 | ||
172 | exports.start = start; | 181 | exports.start = start; |
173 | exports.topupRequest = topupRequest; | 182 | exports.topupRequest = topupRequest; |
174 | exports.calculateSignature = calculateSignature; | 183 | exports.calculateSignature = calculateSignature; |
175 | 184 |