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