Commit 5a78b49fa17ed47738f20b42019a532fd4dfd86c
1 parent
5849195e3e
Exists in
master
soapaction
Showing 1 changed file with 2 additions and 1 deletions Inline Diff
partner-kospinjasa.js
1 | var winston = require('winston'); | 1 | var winston = require('winston'); |
2 | var soap = require('soap'); | 2 | var soap = require('soap'); |
3 | var crypto = require('crypto'); | 3 | var crypto = require('crypto'); |
4 | var strftime = require('strftime'); | 4 | var strftime = require('strftime'); |
5 | var fs = require("fs"); | 5 | var fs = require("fs"); |
6 | var whiskers = require("whiskers"); | 6 | var whiskers = require("whiskers"); |
7 | var http = require("http"); | 7 | var http = require("http"); |
8 | var url = require("url"); | 8 | var url = require("url"); |
9 | 9 | ||
10 | process.chdir(__dirname); | 10 | process.chdir(__dirname); |
11 | var soapTemplate = fs.readFileSync("message.xml"); | 11 | var soapTemplate = fs.readFileSync("message.xml"); |
12 | 12 | ||
13 | var max_retry = 10; | 13 | var max_retry = 10; |
14 | var sleep_before_retry = 5000; | 14 | var sleep_before_retry = 5000; |
15 | 15 | ||
16 | var config; | 16 | var config; |
17 | var callbackReport; | 17 | var callbackReport; |
18 | var aaa; | 18 | var aaa; |
19 | var logger; | 19 | var logger; |
20 | var options; | 20 | var options; |
21 | 21 | ||
22 | function start(_config, _callbackReport, options) { | 22 | function start(_config, _callbackReport, options) { |
23 | config = _config; | 23 | config = _config; |
24 | callbackReport = _callbackReport | 24 | callbackReport = _callbackReport |
25 | 25 | ||
26 | if (options && options.aaa) { | 26 | if (options && options.aaa) { |
27 | aaa = options.aaa; | 27 | aaa = options.aaa; |
28 | } | 28 | } |
29 | 29 | ||
30 | if (options && options.logger) { | 30 | if (options && options.logger) { |
31 | logger = options.logger; | 31 | logger = options.logger; |
32 | } else { | 32 | } else { |
33 | logger = new winston.Logger({ | 33 | logger = new winston.Logger({ |
34 | transports: [ | 34 | transports: [ |
35 | new (winston.transports.Console)() | 35 | new (winston.transports.Console)() |
36 | ] | 36 | ] |
37 | }); | 37 | }); |
38 | } | 38 | } |
39 | } | 39 | } |
40 | 40 | ||
41 | function topupRequest(task, retry) { | 41 | function topupRequest(task, retry) { |
42 | if (retry === undefined) { | 42 | if (retry === undefined) { |
43 | retry = max_retry; | 43 | retry = max_retry; |
44 | } | 44 | } |
45 | 45 | ||
46 | var remoteProduct = task.remoteProduct.split(','); | 46 | var remoteProduct = task.remoteProduct.split(','); |
47 | var params = { | 47 | var params = { |
48 | userName: config.h2h_out.userid, | 48 | userName: config.h2h_out.userid, |
49 | productCode: remoteProduct[0] , | 49 | productCode: remoteProduct[0] , |
50 | terminal: 'terminal0', | 50 | terminal: 'terminal0', |
51 | transactionType: '50', | 51 | transactionType: '50', |
52 | billNumber: createBillNumber(task.destination), | 52 | billNumber: createBillNumber(task.destination), |
53 | amount: remoteProduct[1], | 53 | amount: remoteProduct[1], |
54 | bit61: createBillNumber(task.destination), | 54 | bit61: createBillNumber(task.destination), |
55 | reff: task.requestId, | 55 | reff: task.requestId, |
56 | timeStamp: strftime('%d-%m-%Y %H:%M:%S', new Date()) | 56 | timeStamp: strftime('%d-%m-%Y %H:%M:%S', new Date()) |
57 | } | 57 | } |
58 | 58 | ||
59 | var signature = createSignature(params, config.h2h_out.password); | 59 | var signature = createSignature(params, config.h2h_out.password); |
60 | params.signature = signature; | 60 | params.signature = signature; |
61 | 61 | ||
62 | topupRequestSoapDIY(task, params, retry); | 62 | topupRequestSoapDIY(task, params, retry); |
63 | } | 63 | } |
64 | 64 | ||
65 | function topupRequestSoap(task, params, retry) { | 65 | function topupRequestSoap(task, params, retry) { |
66 | 66 | ||
67 | soap.createClient(config.h2h_out.partner, function(err, soapClient) { | 67 | soap.createClient(config.h2h_out.partner, function(err, soapClient) { |
68 | 68 | ||
69 | var _params = { | 69 | var _params = { |
70 | userName: params.userName, | 70 | userName: params.userName, |
71 | signature: params.signature, | 71 | signature: params.signature, |
72 | productCode: params.productCode, | 72 | productCode: params.productCode, |
73 | terminal: params.terminal, | 73 | terminal: params.terminal, |
74 | transactionType: params.transactionType, | 74 | transactionType: params.transactionType, |
75 | billNumber: params.billNumber, | 75 | billNumber: params.billNumber, |
76 | amount: params.amount, | 76 | amount: params.amount, |
77 | bit61: params.bit61, | 77 | bit61: params.bit61, |
78 | reff: params.reff, | 78 | reff: params.reff, |
79 | timeStamp: params.timeStamp | 79 | timeStamp: params.timeStamp |
80 | } | 80 | } |
81 | 81 | ||
82 | logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); | 82 | logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); |
83 | 83 | ||
84 | soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { | 84 | soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { |
85 | 85 | ||
86 | logger.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint}); | 86 | logger.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint}); |
87 | 87 | ||
88 | if (err) { | 88 | if (err) { |
89 | logger.warn('Error requesting service', {err: err}); | 89 | logger.warn('Error requesting service', {err: err}); |
90 | callbackReport(task.requestId, '68', 'something wrong'); | 90 | callbackReport(task.requestId, '68', 'something wrong'); |
91 | return; | 91 | return; |
92 | } | 92 | } |
93 | 93 | ||
94 | var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value; | 94 | var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value; |
95 | 95 | ||
96 | logger.info('Got result: ' + responseMessageToST24, {result: result}); | 96 | logger.info('Got result: ' + responseMessageToST24, {result: result}); |
97 | 97 | ||
98 | callbackReport(task.requestId, '68', responseMessageToST24); | 98 | callbackReport(task.requestId, '68', responseMessageToST24); |
99 | }); | 99 | }); |
100 | }); | 100 | }); |
101 | } | 101 | } |
102 | 102 | ||
103 | function topupRequestSoapDIY(task, params, retry) { | 103 | function topupRequestSoapDIY(task, params, retry) { |
104 | var message = whiskers.render(soapTemplate, params); | 104 | var message = whiskers.render(soapTemplate, params); |
105 | logger.verbose("Generating SOAP message", {message: message}); | 105 | logger.verbose("Generating SOAP message", {message: message}); |
106 | 106 | ||
107 | var partnerUrl = url.parse(config.h2h_out.partner_endpoint); | 107 | var partnerUrl = url.parse(config.h2h_out.partner_endpoint); |
108 | var postRequest = { | 108 | var postRequest = { |
109 | host: partnerUrl.hostname, | 109 | host: partnerUrl.hostname, |
110 | path: partnerUrl.path, | 110 | path: partnerUrl.path, |
111 | port: partnerUrl.port, | 111 | port: partnerUrl.port, |
112 | method: "POST", | 112 | method: "POST", |
113 | headers: { | 113 | headers: { |
114 | 'Content-Type': 'application/soap+xml', | 114 | 'Content-Type': 'application/soap+xml', |
115 | 'Content-Length': Buffer.byteLength(message) | 115 | 'Content-Length': Buffer.byteLength(message), |
116 | 'SOAPAction': 'billpayment' | ||
116 | } | 117 | } |
117 | }; | 118 | }; |
118 | 119 | ||
119 | logger.info('POST to partner', {postRequest: postRequest}); | 120 | logger.info('POST to partner', {postRequest: postRequest}); |
120 | var req = http.request(postRequest, function( res ) { | 121 | var req = http.request(postRequest, function( res ) { |
121 | 122 | ||
122 | logger.verbose('Request status code: ' + res.statusCode ); | 123 | logger.verbose('Request status code: ' + res.statusCode ); |
123 | var buffer = ""; | 124 | var buffer = ""; |
124 | 125 | ||
125 | res.on( "data", function( data ) { | 126 | res.on( "data", function( data ) { |
126 | buffer = buffer + data; | 127 | buffer = buffer + data; |
127 | }); | 128 | }); |
128 | 129 | ||
129 | res.on( "end", function( data ) { | 130 | res.on( "end", function( data ) { |
130 | topupResponseHandler(buffer, task); | 131 | topupResponseHandler(buffer, task); |
131 | }); | 132 | }); |
132 | 133 | ||
133 | }); | 134 | }); |
134 | 135 | ||
135 | req.on('error', function(e) { | 136 | req.on('error', function(e) { |
136 | logger.warn('problem with request: ' + e.message); | 137 | logger.warn('problem with request: ' + e.message); |
137 | callbackReport(task.requestId, '68', e.message); | 138 | callbackReport(task.requestId, '68', e.message); |
138 | 139 | ||
139 | topupRequestRetry(task); | 140 | topupRequestRetry(task); |
140 | }); | 141 | }); |
141 | 142 | ||
142 | req.write(message); | 143 | req.write(message); |
143 | req.end(); | 144 | req.end(); |
144 | } | 145 | } |
145 | 146 | ||
146 | function topupResponseHandler(response, task) { | 147 | function topupResponseHandler(response, task) { |
147 | logger.verbose('Got response', {response: response, task: task}); | 148 | logger.verbose('Got response', {response: response, task: task}); |
148 | callbackReport(task.requestId, '68', 'Got response'); | 149 | callbackReport(task.requestId, '68', 'Got response'); |
149 | } | 150 | } |
150 | 151 | ||
151 | function topupRequestRetry(task) { | 152 | function topupRequestRetry(task) { |
152 | task.retry--; | 153 | task.retry--; |
153 | 154 | ||
154 | if (task.retry > 0) { | 155 | if (task.retry > 0) { |
155 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); | 156 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); |
156 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); | 157 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); |
157 | } | 158 | } |
158 | else { | 159 | else { |
159 | logger.warn('Maximum retry for pending status exceeded', {task: task}); | 160 | logger.warn('Maximum retry for pending status exceeded', {task: task}); |
160 | } | 161 | } |
161 | } | 162 | } |
162 | 163 | ||
163 | 164 | ||
164 | 165 | ||
165 | 166 | ||
166 | function createSignature(params, password) { | 167 | function createSignature(params, password) { |
167 | var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); | 168 | var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); |
168 | 169 | ||
169 | var plain = | 170 | var plain = |
170 | params.userName | 171 | params.userName |
171 | + passwordHash | 172 | + passwordHash |
172 | + params.productCode | 173 | + params.productCode |
173 | + params.terminal | 174 | + params.terminal |
174 | + params.transactionType | 175 | + params.transactionType |
175 | + params.billNumber | 176 | + params.billNumber |
176 | + params.amount | 177 | + params.amount |
177 | + params.reff | 178 | + params.reff |
178 | + params.timeStamp; | 179 | + params.timeStamp; |
179 | 180 | ||
180 | var result = crypto.createHash('sha1').update(plain).digest().toString('hex'); | 181 | var result = crypto.createHash('sha1').update(plain).digest().toString('hex'); |
181 | 182 | ||
182 | if (logger) { | 183 | if (logger) { |
183 | logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password}); | 184 | logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password}); |
184 | } | 185 | } |
185 | 186 | ||
186 | return result; | 187 | return result; |
187 | } | 188 | } |
188 | 189 | ||
189 | function createBillNumber(destination) { | 190 | function createBillNumber(destination) { |
190 | return ("0000000000000" + destination).slice(-13); | 191 | return ("0000000000000" + destination).slice(-13); |
191 | } | 192 | } |
192 | 193 | ||
193 | exports.start = start; | 194 | exports.start = start; |
194 | exports.topupRequest = topupRequest; | 195 | exports.topupRequest = topupRequest; |
195 | exports.createSignature = createSignature; | 196 | exports.createSignature = createSignature; |
196 | exports.createBillNumber = createBillNumber; | 197 | exports.createBillNumber = createBillNumber; |
197 | 198 |