Commit f47860980118b131a073f82b39ea176bc30a5cec

Authored by Adhidarma Hadiwinoto
1 parent 751feb0233
Exists in master

xml2js

Showing 2 changed files with 3 additions and 1 deletions Inline Diff

1 { 1 {
2 "name": "sate24-to-cjk", 2 "name": "sate24-to-cjk",
3 "version": "1.0.0", 3 "version": "1.0.0",
4 "description": "ST24 to CJK", 4 "description": "ST24 to CJK",
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-cjk.git" 11 "url": "git@gitlab.kodesumber.com:reload97/sate24-to-cjk.git"
12 }, 12 },
13 "keywords": [ 13 "keywords": [
14 "st24", 14 "st24",
15 "ciwaru", 15 "ciwaru",
16 "cjk", 16 "cjk",
17 "ppob" 17 "ppob"
18 ], 18 ],
19 "author": "Adhidarma Hadiwinoto <adhisimon@gmail.com>", 19 "author": "Adhidarma Hadiwinoto <adhisimon@gmail.com>",
20 "license": "ISC", 20 "license": "ISC",
21 "dependencies": { 21 "dependencies": {
22 "crypto": "0.0.3", 22 "crypto": "0.0.3",
23 "ini": "^1.3.4", 23 "ini": "^1.3.4",
24 "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git", 24 "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git",
25 "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git", 25 "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git",
26 "winston": "^2.2.0", 26 "winston": "^2.2.0",
27 "xml": "^1.0.1" 27 "xml": "^1.0.1",
28 "xml2js": "^0.4.16"
28 }, 29 },
29 "devDependencies": { 30 "devDependencies": {
30 "should": "^8.3.1" 31 "should": "^8.3.1"
31 } 32 }
32 } 33 }
33 34
1 var winston = require('winston'); 1 var winston = require('winston');
2 var crypto = require('crypto'); 2 var crypto = require('crypto');
3 var xml = require('xml'); 3 var xml = require('xml');
4 var url = require('url'); 4 var url = require('url');
5 var http = require('http'); 5 var http = require('http');
6 var xml2js = require('xml2js').parseString;
6 7
7 var config; 8 var config;
8 var callbackReport; 9 var callbackReport;
9 var aaa; 10 var aaa;
10 var logger; 11 var logger;
11 var options; 12 var options;
12 13
13 function start(_config, _callbackReport, options) { 14 function start(_config, _callbackReport, options) {
14 config = _config; 15 config = _config;
15 callbackReport = _callbackReport 16 callbackReport = _callbackReport
16 17
17 if (options && options.aaa) { 18 if (options && options.aaa) {
18 aaa = options.aaa; 19 aaa = options.aaa;
19 } 20 }
20 21
21 if (options && options.logger) { 22 if (options && options.logger) {
22 logger = options.logger; 23 logger = options.logger;
23 } else { 24 } else {
24 logger = new winston.Logger({ 25 logger = new winston.Logger({
25 transports: [ 26 transports: [
26 new (winston.transports.Console)() 27 new (winston.transports.Console)()
27 ] 28 ]
28 }); 29 });
29 } 30 }
30 } 31 }
31 32
32 function calculateSignature(params) { 33 function calculateSignature(params) {
33 return crypto.createHash('sha256').update( 34 return crypto.createHash('sha256').update(
34 params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid 35 params.trxtype + params.prdcode + params.value + params.msisdn + params.trxid + params.uid
35 ).digest().toString('hex'); 36 ).digest().toString('hex');
36 } 37 }
37 38
38 function createXmlPayload(params) { 39 function createXmlPayload(params) {
39 return "<?xml version=\"1.0\" ?>\n" + xml({ 40 return "<?xml version=\"1.0\" ?>\n" + xml({
40 ciwaru: [ 41 ciwaru: [
41 {trxtype: params.trxtype}, 42 {trxtype: params.trxtype},
42 {prdcode: params.prdcode}, 43 {prdcode: params.prdcode},
43 {value: params.value}, 44 {value: params.value},
44 {msisdn: params.msisdn}, 45 {msisdn: params.msisdn},
45 {trxid: params.trxid}, 46 {trxid: params.trxid},
46 {uid: params.uid}, 47 {uid: params.uid},
47 {hash: calculateSignature(params)} 48 {hash: calculateSignature(params)}
48 ] 49 ]
49 }); 50 });
50 } 51 }
51 52
52 function getSNFromMessage(message) { 53 function getSNFromMessage(message) {
53 var sn_match = message.match(/SN (\w+) /); 54 var sn_match = message.match(/SN (\w+) /);
54 return sn_match[1]; 55 return sn_match[1];
55 } 56 }
56 57
57 function topupResponseHandler(body) { 58 function topupResponseHandler(body) {
58 logger.info('Got reply from partner', {body: body}); 59 logger.info('Got reply from partner', {body: body});
59 xml2js(body, function(err, result) { 60 xml2js(body, function(err, result) {
60 if (err) { 61 if (err) {
61 logger.warn('XML parsing error', {err: err}); 62 logger.warn('XML parsing error', {err: err});
62 } 63 }
63 logger.info('XML message from partner', {result: result}); 64 logger.info('XML message from partner', {result: result});
64 }); 65 });
65 } 66 }
66 67
67 function topupRequest(task, retry) { 68 function topupRequest(task, retry) {
68 var remoteProduct = task.remoteProduct.split(','); 69 var remoteProduct = task.remoteProduct.split(',');
69 70
70 var params = { 71 var params = {
71 trxtype: '01', 72 trxtype: '01',
72 prdcode: remoteProduct[0], 73 prdcode: remoteProduct[0],
73 value: remoteProduct[1], 74 value: remoteProduct[1],
74 msisdn: task.destination, 75 msisdn: task.destination,
75 trxid: task.requestId, 76 trxid: task.requestId,
76 uid: config.h2h_out.userid, 77 uid: config.h2h_out.userid,
77 }; 78 };
78 79
79 var postBody = createXmlPayload(params); 80 var postBody = createXmlPayload(params);
80 81
81 var partnerUrl = url.parse(config.h2h_out.partner); 82 var partnerUrl = url.parse(config.h2h_out.partner);
82 var postRequest = { 83 var postRequest = {
83 host: partnerUrl.hostname, 84 host: partnerUrl.hostname,
84 path: partnerUrl.path, 85 path: partnerUrl.path,
85 port: partnerUrl.port, 86 port: partnerUrl.port,
86 method: "POST", 87 method: "POST",
87 headers: { 88 headers: {
88 'Content-Type': 'text/xml', 89 'Content-Type': 'text/xml',
89 'Content-Length': Buffer.byteLength(postBody) 90 'Content-Length': Buffer.byteLength(postBody)
90 } 91 }
91 }; 92 };
92 93
93 logger.info('POST to partner', {postRequest: postRequest}); 94 logger.info('POST to partner', {postRequest: postRequest});
94 var req = http.request(postRequest, function( res ) { 95 var req = http.request(postRequest, function( res ) {
95 96
96 logger.info('Status code: ' + res.statusCode ); 97 logger.info('Status code: ' + res.statusCode );
97 var buffer = ""; 98 var buffer = "";
98 res.on( "data", function( data ) { buffer = buffer + data; } ); 99 res.on( "data", function( data ) { buffer = buffer + data; } );
99 res.on( "end", function( data ) { 100 res.on( "end", function( data ) {
100 topupResponseHandler(buffer); 101 topupResponseHandler(buffer);
101 }); 102 });
102 }); 103 });
103 104
104 req.on('error', function(e) { 105 req.on('error', function(e) {
105 logger.warn('problem with request: ' + e.message); 106 logger.warn('problem with request: ' + e.message);
106 callbackReport(task['requestId'], '40', e.message); 107 callbackReport(task['requestId'], '40', e.message);
107 }); 108 });
108 109
109 req.write(postBody); 110 req.write(postBody);
110 req.end(); 111 req.end();
111 } 112 }
112 113
113 exports.start = start; 114 exports.start = start;
114 exports.topupRequest = topupRequest; 115 exports.topupRequest = topupRequest;
115 exports.calculateSignature = calculateSignature; 116 exports.calculateSignature = calculateSignature;
116 exports.createXmlPayload = createXmlPayload; 117 exports.createXmlPayload = createXmlPayload;
117 exports.getSNFromMessage = getSNFromMessage; 118 exports.getSNFromMessage = getSNFromMessage;
118 119