UNPKG

pxpay2

Version:

A node module for using the Payment Express PXPay 2.0 service for payment processing including response parsing

158 lines (144 loc) 5.63 kB
var request = require('request'); var xml = require('xml'); var url = 'https://sec.paymentexpress.com/pxaccess/pxpay.aspx'; var txtTypes = ['Purchase', 'Auth', 'Complete', 'Refund', 'Validate']; var SUCCESS_STATUS = 1; var FAIL_STATUS = 0; var logOutput = false; module.exports = { generateRequest: function (details) { if (details.logOutput) { logOutput = details.logOutput; } var dataPayload = [ { PxPayUserId: details.user }, { PxPayKey: details.password }, { TxnType: details.transactionType || 'Purchase' }, { AmountInput: details.amount }, { CurrencyInput: details.currency || 'NZD' } ]; if (details.successURL ) { dataPayload.push( { UrlSuccess: details.successURL }); } if (details.failURL ) { dataPayload.push( { UrlFail: details.failURL }); } if (details.transactionId) { dataPayload.push({ TxnId: details.transactionId }); } if (details.reference) { dataPayload.push({ MerchentReference: details.reference }); } if (details.email) { dataPayload.push({ EmailAddress: details.email }); } if (details.line1) { dataPayload.push({ TxnData1: details.line1 }); } if (details.line2) { dataPayload.push({ TxnData2: details.line2 }); } if (details.line3) { dataPayload.push({ TxnData3: details.line3 }); } if (details.billingId) { dataPayload.push({ BillingId: details.billingId }); } if (details.addCard) { dataPayload.push({ EnableAddBillCard: details.addCard }); } if (details.dpsBillingId) { dataPayload.push({ DpsBillingId: details.dpsBillingId }); } if (details.response) { dataPayload.push({Response: details.response}); } var dpsData = { GenerateRequest: dataPayload }; if (logOutput) { console.log(dpsData); } return xml(dpsData); }, generateResponse: function (details) { var dataPayload = [ { PxPayUserId: details.user }, { PxPayKey: details.password }, { Response: details.response} ]; var dpsData = { ProcessResponse: dataPayload }; if (logOutput) { console.log(dpsData); } return xml(dpsData); }, request: function (details, callback) { var dpsData = this.generateRequest(details); request({ uri: url, method: 'POST', body: dpsData }, function requestCallback (err, res, body) { process.nextTick(function requestHandler () { if(err) { process.nextTick(function(){ callback(err); }); } else { var parser = new require('xml2js').Parser({ explicitArray: false}); process.nextTick(function(){ parser.parseString(body, function parserHandler (error, result){ if (logOutput) { console.log(error); } if(result.Request.$.valid === '1'){ process.nextTick(function(){ callback(null, result.Request); }); } else if (error) { process.nextTick(function(){ callback(error); }); } else { process.nextTick(function(){ callback({message: "result did not return correct code", result: result });}); } }); }); } }); }); }, process: function () { }, parseResults: function(details, callback) { var dpsData = this.generateResponse(details); request({ uri: url, method: 'POST', body: dpsData }, function responseCallback (err, res, body) { process.nextTick(function responseHandler () { if(err) { process.nextTick(function(){ callback(err); }); } else { var parser = new require('xml2js').Parser({ explicitArray: false}); process.nextTick(function(){ parser.parseString(body, function parserHandler (error, result){ if (logOutput) { console.log(error); } if(result.Response.$.valid === '1'){ process.nextTick(function(){ callback(null, result.Response); }); } else if (error) { process.nextTick(function(){ callback(error); }); } else { process.nextTick(function(){ callback({message: "result did not return correct code", result: result });}); } }); }); } }); }); } };