Commit 8857ca77d89093284cc7dd6ac74d8acac36e5702

Authored by Adhidarma Hadiwinoto
1 parent 5002b4a0de
Exists in master

require xml

Showing 2 changed files with 2 additions and 0 deletions Inline Diff

1 { 1 {
2 "name": "sate24-to-trustlink", 2 "name": "sate24-to-trustlink",
3 "version": "1.0.0", 3 "version": "1.0.0",
4 "description": "ST24 to TrustLink", 4 "description": "ST24 to TrustLink",
5 "main": "index.js", 5 "main": "index.js",
6 "scripts": { 6 "scripts": {
7 "test": "mocha" 7 "test": "mocha"
8 }, 8 },
9 "repository": { 9 "repository": {
10 "type": "git", 10 "type": "git",
11 "url": "git@gitlab.kodesumber.com:reload97/sate24-to-trustlink.git" 11 "url": "git@gitlab.kodesumber.com:reload97/sate24-to-trustlink.git"
12 }, 12 },
13 "keywords": [ 13 "keywords": [
14 "st24", 14 "st24",
15 "ppob", 15 "ppob",
16 "r97", 16 "r97",
17 "trust" 17 "trust"
18 ], 18 ],
19 "author": "Adhidarma Hadiwinoto <adhisimon@host2host.id>", 19 "author": "Adhidarma Hadiwinoto <adhisimon@host2host.id>",
20 "license": "ISC", 20 "license": "ISC",
21 "dependencies": { 21 "dependencies": {
22 "base64-xor": "^0.10.0", 22 "base64-xor": "^0.10.0",
23 "ini": "^1.3.4", 23 "ini": "^1.3.4",
24 "request": "^2.72.0", 24 "request": "^2.72.0",
25 "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git", 25 "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
26 "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git", 26 "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git",
27 "strftime": "^0.9.2", 27 "strftime": "^0.9.2",
28 "winston": "^2.2.0", 28 "winston": "^2.2.0",
29 "xml": "^1.0.1",
29 "xml2js": "^0.4.16" 30 "xml2js": "^0.4.16"
30 } 31 }
31 } 32 }
32 33
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 xml2js = require('xml2js').parseString; 8 var xml2js = require('xml2js').parseString;
8 9
9 var max_retry = 3; 10 var max_retry = 3;
10 var sleep_before_retry = 2000; 11 var sleep_before_retry = 2000;
11 12
12 var config; 13 var config;
13 var callbackReport; 14 var callbackReport;
14 var aaa; 15 var aaa;
15 var logger; 16 var logger;
16 var options; 17 var options;
17 18
18 function start(_config, _callbackReport, options) { 19 function start(_config, _callbackReport, options) {
19 config = _config; 20 config = _config;
20 callbackReport = _callbackReport 21 callbackReport = _callbackReport
21 22
22 if (options && options.aaa) { 23 if (options && options.aaa) {
23 aaa = options.aaa; 24 aaa = options.aaa;
24 } 25 }
25 26
26 if (options && options.logger) { 27 if (options && options.logger) {
27 logger = options.logger; 28 logger = options.logger;
28 } else { 29 } else {
29 logger = new winston.Logger({ 30 logger = new winston.Logger({
30 transports: [ 31 transports: [
31 new (winston.transports.Console)() 32 new (winston.transports.Console)()
32 ] 33 ]
33 }); 34 });
34 } 35 }
35 36
36 createReverseReportServer(); 37 createReverseReportServer();
37 } 38 }
38 39
39 function createReverseReportServer() { 40 function createReverseReportServer() {
40 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() {
41 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);
42 }); 43 });
43 } 44 }
44 45
45 function onReverseReport(req, res) { 46 function onReverseReport(req, res) {
46 res.end('OK'); 47 res.end('OK');
47 48
48 var qs = url.parse(req.url, true).query; 49 var qs = url.parse(req.url, true).query;
49 logger.info('Reverse Report', {qs: qs}); 50 logger.info('Reverse Report', {qs: qs});
50 } 51 }
51 52
52 function calculateSignature(ts, destination, password) { 53 function calculateSignature(ts, destination, password) {
53 var a = ts + destination.substr(destination.length - 4); 54 var a = ts + destination.substr(destination.length - 4);
54 var b = destination.substr(destination.length - 4).split('').reverse().join('') + password; 55 var b = destination.substr(destination.length - 4).split('').reverse().join('') + password;
55 56
56 return xor.encode(a,b); 57 return xor.encode(a,b);
57 } 58 }
58 59
59 function createXmlPayload(task, userid, password) { 60 function createXmlPayload(task, userid, password) {
60 var ts = strftime('%H%M%S', new Date()); 61 var ts = strftime('%H%M%S', new Date());
61 62
62 var signature = calculateSignature(ts, task.destination, password); 63 var signature = calculateSignature(ts, task.destination, password);
63 64
64 var payload = { 65 var payload = {
65 evoucher: [ 66 evoucher: [
66 {command: 'TOPUP'}, 67 {command: 'TOPUP'},
67 {product: task.remoteProduct}, 68 {product: task.remoteProduct},
68 {userid: userid}, 69 {userid: userid},
69 {time: ts}, 70 {time: ts},
70 {msisdn: task.destination}, 71 {msisdn: task.destination},
71 {partner_trxid: task.requestId}, 72 {partner_trxid: task.requestId},
72 {signature: signature}, 73 {signature: signature},
73 {trxke: 1}, 74 {trxke: 1},
74 ] 75 ]
75 }; 76 };
76 77
77 if (logger) { 78 if (logger) {
78 logger.verbose('Generate xml payload', {payload: payload}); 79 logger.verbose('Generate xml payload', {payload: payload});
79 } 80 }
80 81
81 return "<?xml version=\"1.0\" ?>\n" + xml(payload); 82 return "<?xml version=\"1.0\" ?>\n" + xml(payload);
82 } 83 }
83 84
84 function topupRequest(task, retry) { 85 function topupRequest(task, retry) {
85 if (retry === undefined) { 86 if (retry === undefined) {
86 retry = max_retry; 87 retry = max_retry;
87 } 88 }
88 89
89 var payload = createXmlPayload(task, config.globals.userid, config.globals.password); 90 var payload = createXmlPayload(task, config.globals.userid, config.globals.password);
90 91
91 var partner = url.parse(config.h2h_out.partner); 92 var partner = url.parse(config.h2h_out.partner);
92 93
93 var request_options = { 94 var request_options = {
94 host: partner.hostname, 95 host: partner.hostname,
95 path: partner.path, 96 path: partner.path,
96 port: partner.port, 97 port: partner.port,
97 method: "POST", 98 method: "POST",
98 headers: { 99 headers: {
99 'Content-Type': 'text/xml', 100 'Content-Type': 'text/xml',
100 'Content-Length': Buffer.byteLength(payload) 101 'Content-Length': Buffer.byteLength(payload)
101 } 102 }
102 }; 103 };
103 104
104 var buffer = ""; 105 var buffer = "";
105 106
106 logger.info('Requesting to partner', {request_options: request_options}); 107 logger.info('Requesting to partner', {request_options: request_options});
107 108
108 var req = http.request(request_options, function( res ) { 109 var req = http.request(request_options, function( res ) {
109 110
110 logger.info('Status code: ' + res.statusCode ); 111 logger.info('Status code: ' + res.statusCode );
111 var buffer = ""; 112 var buffer = "";
112 res.on( "data", function( data ) { buffer = buffer + data; } ); 113 res.on( "data", function( data ) { buffer = buffer + data; } );
113 res.on( "end", function( data ) { 114 res.on( "end", function( data ) {
114 //directResponseHandler(buffer, task); 115 //directResponseHandler(buffer, task);
115 logger.info('Got direct response from partner', {resp: buffer}); 116 logger.info('Got direct response from partner', {resp: buffer});
116 }); 117 });
117 118
118 }); 119 });
119 120
120 req.on('error', function(e) { 121 req.on('error', function(e) {
121 logger.warn('problem with request: ' + e.message); 122 logger.warn('problem with request: ' + e.message);
122 callbackReport(task.requestId, '68', e.message); 123 callbackReport(task.requestId, '68', e.message);
123 return; 124 return;
124 }); 125 });
125 126
126 logger.verbose('Sending payload to partner', {payload: payload}); 127 logger.verbose('Sending payload to partner', {payload: payload});
127 req.write( payload ); 128 req.write( payload );
128 req.end(); 129 req.end();
129 } 130 }
130 131
131 function directResponseHandler(body, task) { 132 function directResponseHandler(body, task) {
132 133
133 logger.info('Got direct response'); 134 logger.info('Got direct response');
134 135
135 xml2js(body, function (err, result) { 136 xml2js(body, function (err, result) {
136 if (err) { 137 if (err) {
137 logger.warn('Error parsing xml', {body: body}); 138 logger.warn('Error parsing xml', {body: body});
138 callbackReport(request_id, '68', buffer); 139 callbackReport(request_id, '68', buffer);
139 return; 140 return;
140 } 141 }
141 142
142 logger.info('Direct response parsed', {result: result}); 143 logger.info('Direct response parsed', {result: result});
143 144
144 var response_code = '68'; 145 var response_code = '68';
145 146
146 var request_id = result.evoucher.partner_trxid[0].trim(); 147 var request_id = result.evoucher.partner_trxid[0].trim();
147 var message = result.evoucher.message[0].trim(); 148 var message = result.evoucher.message[0].trim();
148 var status = result.evoucher.result[0].trim(); 149 var status = result.evoucher.result[0].trim();
149 150
150 if (status === 'failed') { 151 if (status === 'failed') {
151 response_code = '40'; 152 response_code = '40';
152 153
153 var new_response_code = responseCodeFromMessage(message); 154 var new_response_code = responseCodeFromMessage(message);
154 if (new_response_code) { 155 if (new_response_code) {
155 response_code = new_response_code; 156 response_code = new_response_code;
156 } 157 }
157 158
158 } 159 }
159 160
160 callbackReport(request_id, response_code, message); 161 callbackReport(request_id, response_code, message);
161 }); 162 });
162 } 163 }
163 164
164 exports.start = start; 165 exports.start = start;
165 exports.topupRequest = topupRequest; 166 exports.topupRequest = topupRequest;
166 167