diff --git a/message.xml b/message.xml new file mode 100644 index 0000000..488e57b --- /dev/null +++ b/message.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> + +<SOAP-ENV:Envelope + SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" + xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" + xmlns:tns="urn:apih2h"> + + <SOAP-ENV:Body> + <tns:billpayment xmlns:tns="urn:apih2h"> + <inputCheck xsi:type="tns:inputCheck"> + <userName xsi:type="xsd:string">{ params.userName }</userName> + <signature xsi:type="xsd:string">{ params.signature }</signature> + <productCode xsi:type="xsd:string">{ params.productCode }</productCode> + <terminal xsi:type="xsd:string">{ params.terminal }</terminal> + <transactionType xsi:type="xsd:string">{ params.transactionType }</transactionType> + <billNumber xsi:type="xsd:string">{ params.billNumber }</billNumber> + <amount xsi:type="xsd:string">{ params.amount }</amount> + <bit61 xsi:type="xsd:string">{ params.bit61 }</bit61> + <reff xsi:type="xsd:string">{ params.reff }</reff> + <timeStamp xsi:type="xsd:string">{ params.timeStamp }</timeStamp> + </inputCheck> + </tns:billpayment> + </SOAP-ENV:Body> +</SOAP-ENV:Envelope> diff --git a/package.json b/package.json index 95003de..bcd8eef 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git", "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git", "soap": "^0.15.0", + "whiskers": "^0.3.3", "winston": "^2.2.0" }, "devDependencies": { diff --git a/partner-kospinjasa.js b/partner-kospinjasa.js index 96d17b2..d0c6e20 100644 --- a/partner-kospinjasa.js +++ b/partner-kospinjasa.js @@ -2,6 +2,12 @@ var winston = require('winston'); var soap = require('soap'); var crypto = require('crypto'); var strftime = require('strftime'); +var fs = require("fs"); +var whiskers = require("whiskers"); +var http = require("http"); + +process.chdir(__dirname); +var soapTemplate = fs.readFileSync("message.xml"); var max_retry = 10; var sleep_before_retry = 5000; @@ -52,7 +58,7 @@ function topupRequest(task, retry) { var signature = createSignature(params, config.h2h_out.password); params.signature = signature; - topupRequestSoap(task, params, retry); + topupRequestSoapDIY(task, params, retry); } function topupRequestSoap(task, params, retry) { @@ -93,6 +99,67 @@ function topupRequestSoap(task, params, retry) { }); } +function topupRequestSoapDIY(task, params, retry) { + var message = whiskers.render(soapTemplate, params); + logger.verbose("Generating SOAP message", {message: message}); + + var partnerUrl = url.parse(config.h2h_out.partner); + var postRequest = { + host: partnerUrl.hostname, + path: partnerUrl.path, + port: partnerUrl.port, + method: "POST", + headers: { + 'Content-Type': 'application/soap', + 'Content-Length': Buffer.byteLength(message) + } + }; + + logger.info('POST to partner', {postRequest: postRequest}); + var req = http.request(postRequest, function( res ) { + + logger.verbose('Request status code: ' + res.statusCode ); + var buffer = ""; + + res.on( "data", function( data ) { + buffer = buffer + data; + }); + + res.on( "end", function( data ) { + topupResponseHandler(buffer, task); + }); + + }); + + req.on('error', function(e) { + logger.warn('problem with request: ' + e.message); + callbackReport(task.requestId, '68', e.message); + + topupRequestRetry(task); + }); + + req.write(message); + req.end(); +} + +function topupResponseHandler(response, task) { + logger.verbose('Got response', {response: response, task: task}); + callbackReport(task.requestId, '68', 'Got response'); +} + +function topupRequestRetry(task) { + task.retry--; + + if (task.retry > 0) { + logger.info('Retrying in ' + sleepBeforeRetry + 's'); + setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); + } + else { + logger.warn('Maximum retry for pending status exceeded', {task: task}); + } +} + + function createSignature(params, password) {