Commit f47860980118b131a073f82b39ea176bc30a5cec
1 parent
751feb0233
Exists in
master
xml2js
Showing 2 changed files with 3 additions and 1 deletions Inline Diff
package.json
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 |
partner-cjk.js
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 |