Commit 66ed02be497ca06728820681c86b47f6b7b57d36
1 parent
5a78b49fa1
Exists in
master
debug 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 | topupRequestSoap(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 | logger.info('SOAPAction', soapClient.SOAPAction); | ||
85 | 86 | ||
86 | logger.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint}); | 87 | logger.info('Got response', {lastRequest: soapClient.lastRequest, lastMessage: soapClient.lastMessage, lastEndpoint: soapClient.lastEndpoint}); |
87 | 88 | ||
88 | if (err) { | 89 | if (err) { |
89 | logger.warn('Error requesting service', {err: err}); | 90 | logger.warn('Error requesting service', {err: err}); |
90 | callbackReport(task.requestId, '68', 'something wrong'); | 91 | callbackReport(task.requestId, '68', 'something wrong'); |
91 | return; | 92 | return; |
92 | } | 93 | } |
93 | 94 | ||
94 | var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value; | 95 | var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value; |
95 | 96 | ||
96 | logger.info('Got result: ' + responseMessageToST24, {result: result}); | 97 | logger.info('Got result: ' + responseMessageToST24, {result: result}); |
97 | 98 | ||
98 | callbackReport(task.requestId, '68', responseMessageToST24); | 99 | callbackReport(task.requestId, '68', responseMessageToST24); |
99 | }); | 100 | }); |
100 | }); | 101 | }); |
101 | } | 102 | } |
102 | 103 | ||
103 | function topupRequestSoapDIY(task, params, retry) { | 104 | function topupRequestSoapDIY(task, params, retry) { |
104 | var message = whiskers.render(soapTemplate, params); | 105 | var message = whiskers.render(soapTemplate, params); |
105 | logger.verbose("Generating SOAP message", {message: message}); | 106 | logger.verbose("Generating SOAP message", {message: message}); |
106 | 107 | ||
107 | var partnerUrl = url.parse(config.h2h_out.partner_endpoint); | 108 | var partnerUrl = url.parse(config.h2h_out.partner_endpoint); |
108 | var postRequest = { | 109 | var postRequest = { |
109 | host: partnerUrl.hostname, | 110 | host: partnerUrl.hostname, |
110 | path: partnerUrl.path, | 111 | path: partnerUrl.path, |
111 | port: partnerUrl.port, | 112 | port: partnerUrl.port, |
112 | method: "POST", | 113 | method: "POST", |
113 | headers: { | 114 | headers: { |
114 | 'Content-Type': 'application/soap+xml', | 115 | 'Content-Type': 'application/soap+xml', |
115 | 'Content-Length': Buffer.byteLength(message), | 116 | 'Content-Length': Buffer.byteLength(message), |
116 | 'SOAPAction': 'billpayment' | 117 | 'SOAPAction': 'billpayment' |
117 | } | 118 | } |
118 | }; | 119 | }; |
119 | 120 | ||
120 | logger.info('POST to partner', {postRequest: postRequest}); | 121 | logger.info('POST to partner', {postRequest: postRequest}); |
121 | var req = http.request(postRequest, function( res ) { | 122 | var req = http.request(postRequest, function( res ) { |
122 | 123 | ||
123 | logger.verbose('Request status code: ' + res.statusCode ); | 124 | logger.verbose('Request status code: ' + res.statusCode ); |
124 | var buffer = ""; | 125 | var buffer = ""; |
125 | 126 | ||
126 | res.on( "data", function( data ) { | 127 | res.on( "data", function( data ) { |
127 | buffer = buffer + data; | 128 | buffer = buffer + data; |
128 | }); | 129 | }); |
129 | 130 | ||
130 | res.on( "end", function( data ) { | 131 | res.on( "end", function( data ) { |
131 | topupResponseHandler(buffer, task); | 132 | topupResponseHandler(buffer, task); |
132 | }); | 133 | }); |
133 | 134 | ||
134 | }); | 135 | }); |
135 | 136 | ||
136 | req.on('error', function(e) { | 137 | req.on('error', function(e) { |
137 | logger.warn('problem with request: ' + e.message); | 138 | logger.warn('problem with request: ' + e.message); |
138 | callbackReport(task.requestId, '68', e.message); | 139 | callbackReport(task.requestId, '68', e.message); |
139 | 140 | ||
140 | topupRequestRetry(task); | 141 | topupRequestRetry(task); |
141 | }); | 142 | }); |
142 | 143 | ||
143 | req.write(message); | 144 | req.write(message); |
144 | req.end(); | 145 | req.end(); |
145 | } | 146 | } |
146 | 147 | ||
147 | function topupResponseHandler(response, task) { | 148 | function topupResponseHandler(response, task) { |
148 | logger.verbose('Got response', {response: response, task: task}); | 149 | logger.verbose('Got response', {response: response, task: task}); |
149 | callbackReport(task.requestId, '68', 'Got response'); | 150 | callbackReport(task.requestId, '68', 'Got response'); |
150 | } | 151 | } |
151 | 152 | ||
152 | function topupRequestRetry(task) { | 153 | function topupRequestRetry(task) { |
153 | task.retry--; | 154 | task.retry--; |
154 | 155 | ||
155 | if (task.retry > 0) { | 156 | if (task.retry > 0) { |
156 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); | 157 | logger.info('Retrying in ' + sleepBeforeRetry + 's'); |
157 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); | 158 | setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); |
158 | } | 159 | } |
159 | else { | 160 | else { |
160 | logger.warn('Maximum retry for pending status exceeded', {task: task}); | 161 | logger.warn('Maximum retry for pending status exceeded', {task: task}); |
161 | } | 162 | } |
162 | } | 163 | } |
163 | 164 | ||
164 | 165 | ||
165 | 166 | ||
166 | 167 | ||
167 | function createSignature(params, password) { | 168 | function createSignature(params, password) { |
168 | var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); | 169 | var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); |
169 | 170 | ||
170 | var plain = | 171 | var plain = |
171 | params.userName | 172 | params.userName |
172 | + passwordHash | 173 | + passwordHash |
173 | + params.productCode | 174 | + params.productCode |
174 | + params.terminal | 175 | + params.terminal |
175 | + params.transactionType | 176 | + params.transactionType |
176 | + params.billNumber | 177 | + params.billNumber |
177 | + params.amount | 178 | + params.amount |
178 | + params.reff | 179 | + params.reff |
179 | + params.timeStamp; | 180 | + params.timeStamp; |
180 | 181 | ||
181 | var result = crypto.createHash('sha1').update(plain).digest().toString('hex'); | 182 | var result = crypto.createHash('sha1').update(plain).digest().toString('hex'); |
182 | 183 | ||
183 | if (logger) { | 184 | if (logger) { |
184 | logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password}); | 185 | logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password}); |
185 | } | 186 | } |
186 | 187 | ||
187 | return result; | 188 | return result; |
188 | } | 189 | } |
189 | 190 | ||
190 | function createBillNumber(destination) { | 191 | function createBillNumber(destination) { |
191 | return ("0000000000000" + destination).slice(-13); | 192 | return ("0000000000000" + destination).slice(-13); |
192 | } | 193 | } |
193 | 194 | ||
194 | exports.start = start; | 195 | exports.start = start; |
195 | exports.topupRequest = topupRequest; | 196 | exports.topupRequest = topupRequest; |
196 | exports.createSignature = createSignature; | 197 | exports.createSignature = createSignature; |
197 | exports.createBillNumber = createBillNumber; | 198 | exports.createBillNumber = createBillNumber; |
198 | 199 |