553 lines
15 KiB
Text
553 lines
15 KiB
Text
/*
|
|
Copyright 2016 Mark Drew (http://markdrew.io)
|
|
|
|
This is an implementation of Cayan MerchantWare API.
|
|
See:
|
|
https://ps1.merchantware.net/Merchantware/ws/RetailTransaction/v4/Credit.asmx
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
may not use this file except in compliance with the License. You may
|
|
obtain a copy of the License at:
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
component
|
|
extends="cfpayment.api.gateway.base"
|
|
displayname="Merchantware API Interface"
|
|
|
|
{
|
|
|
|
variables.cfpayment.GATEWAY_LIVE_URL = "https://ps1.merchantware.net/Merchantware/ws/RetailTransaction/v4/Credit.asmx";
|
|
|
|
variables.MerchantWareService = ""; //Needs to be configured at startup
|
|
|
|
|
|
function init(){
|
|
super.init(argumentCollection=arguments);
|
|
|
|
//Create the webservice
|
|
|
|
//we require
|
|
if(!structKeyExists(config, "merchantName")){
|
|
throw("merchantName is required")
|
|
}
|
|
if(!structKeyExists(config, "merchantSiteId")){
|
|
throw("merchantSiteId is required")
|
|
}
|
|
if(!structKeyExists(config, "merchantKey")){
|
|
throw("merchantKey is required")
|
|
}
|
|
|
|
variables.cfpayment.merchantName = config.merchantName;
|
|
variables.cfpayment.merchantSiteId = config.merchantSiteId;
|
|
variables.cfpayment.merchantKey = config.merchantKey;
|
|
variables.MerchantWareService = createObject("webservice", "#variables.cfpayment.GATEWAY_LIVE_URL#?wsdl");
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
public boolean function hasValidCredentials(){
|
|
|
|
//Do the minimum that is required.
|
|
//Should do a purchase with a test card
|
|
var expDate = dateAdd("m", randRange(1, 20), Now());
|
|
var money = getService().createMoney(5000);
|
|
var account = getService().createCreditCard();
|
|
account.setAccount("4111111111111111");
|
|
account.setMonth(Month(expDate));
|
|
account.setYear(Year(expDate));
|
|
account.setVerificationValue(900);
|
|
|
|
var options = {
|
|
"refId": getTickCount() //Authorize.net requires a unique order id for each transaction.
|
|
};
|
|
|
|
|
|
var requestType = "SaleKeyed";
|
|
var creds = getMerchantAuthentication();
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
amount:money.getCents(),
|
|
cardNumber:account.getAccount(),
|
|
expirationDate:DateFormat(account.getExpirationDate(), "MMYY"),
|
|
cardholder:account.getName(),
|
|
avsStreetAddress:account.getAddress(),
|
|
avsStreetZipCode:account.getPostalCode(),
|
|
cardSecurityCode:account.getVerificationValue(),
|
|
forceDuplicate:false,
|
|
registerNumber:"",
|
|
merchantTransactionId="",
|
|
}
|
|
|
|
var resp = variables.MerchantWareService.SaleKeyed(argumentCollection=args );
|
|
|
|
if(resp.ErrorMessage EQ "Invalid Credentials."){
|
|
return false;
|
|
}
|
|
//There could be other errors but we are ignoring it
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
function purchase(required Any money, Any account, Struct options={}){
|
|
|
|
//Need to append /SaleKeyed to url
|
|
var requestType = "SaleKeyed";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
amount:money.getCents(),
|
|
cardNumber:account.getAccount(),
|
|
expirationDate=DateFormat(account.getExpirationDate(), "MMYY"),
|
|
cardholder=account.getName(),
|
|
avsStreetAddress=account.getAddress(),
|
|
avsStreetZipCode=account.getPostalCode(),
|
|
cardSecurityCode=account.getVerificationValue(),
|
|
forceDuplicate=getTestMode(),
|
|
registerNumber=options.registerNumber?:"",
|
|
merchantTransactionId=options.merchantTransactionId?:""
|
|
}
|
|
|
|
if(StructKeyExists(options,"invoiceNumber")){
|
|
args["invoiceNumber"]=options.invoiceNumber;
|
|
}
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
|
|
|
|
|
|
var resp = variables.MerchantWareService.SaleKeyed(argumentCollection=args );
|
|
|
|
//Raw result
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "SaleKeyed"
|
|
};
|
|
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
}
|
|
|
|
|
|
function canSwipe(){
|
|
return true;
|
|
}
|
|
function purchaseSwiped(required Any money, required String trackdata, Struct options={}){
|
|
|
|
//Need to append /SaleKeyed to url
|
|
var requestType = "Sale";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
amount:money.getCents(),
|
|
trackData:trackData,
|
|
forceDuplicate:getTestMode(),
|
|
registerNumber:"",
|
|
merchantTransactionId:"",
|
|
entryMode:"MAGNETICSTRIPE"
|
|
}
|
|
|
|
if(StructKeyExists(options,"invoiceNumber")){
|
|
args["invoiceNumber"]=options.invoiceNumber;
|
|
}
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
|
|
|
|
|
|
var resp = variables.MerchantWareService.Sale(argumentCollection=args );
|
|
|
|
//Raw result
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "SaleKeyed"
|
|
};
|
|
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
}
|
|
|
|
function purchaseVault(required money, Any vaultToken, Struct options={}){
|
|
|
|
var requestType = "SaleVault";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
amount:money.getCents(),
|
|
vaultToken: vaultToken,
|
|
forceDuplicate=getTestMode(),
|
|
registerNumber="",
|
|
merchantTransactionId="",
|
|
}
|
|
|
|
if(StructKeyExists(options,"invoiceNumber")){
|
|
args["invoiceNumber"]=options.invoiceNumber;
|
|
}
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
|
|
var resp = variables.MerchantWareService.SaleVault(argumentCollection=args );
|
|
|
|
|
|
//Raw result
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "SaleVault"
|
|
};
|
|
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
}
|
|
|
|
function authorize(Any required money, Any requred account, Struct options={}){
|
|
|
|
var requestType = "PreAuthorizationKeyed";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
amount:money.getCents(),
|
|
cardNumber:account.getAccount(),
|
|
expirationDate=DateFormat(account.getExpirationDate(), "MMYY"),
|
|
cardholder=account.getName(),
|
|
avsStreetAddress=account.getAddress(),
|
|
avsStreetZipCode=account.getPostalCode(),
|
|
cardSecurityCode=account.getVerificationValue(),
|
|
registerNumber="",
|
|
merchantTransactionId="",
|
|
}
|
|
|
|
if(StructKeyExists(options,"invoiceNumber")){
|
|
args["invoiceNumber"]=options.invoiceNumber;
|
|
}
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
var resp = variables.MerchantWareService.PreAuthorizationKeyed(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "PreAuthorizationKeyed"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
}
|
|
|
|
function capture(Any required money, String required authorization, Struct options={}){
|
|
|
|
var requestType = "PostAuthorization";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
amount:money.getCents(),
|
|
token:authorization,
|
|
registerNumber="",
|
|
merchantTransactionId="",
|
|
}
|
|
|
|
if(StructKeyExists(options,"invoiceNumber")){
|
|
args["invoiceNumber"]=options.invoiceNumber;
|
|
}
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
var resp = variables.MerchantWareService.PostAuthorization(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "PostAuthorization"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
}
|
|
|
|
public Any function refund(required Any transactionID, required Any money, Struct options={}){
|
|
|
|
var requestType = "Refund";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
invoiceNumber:"",
|
|
overrideAmount:money.getCents(),
|
|
token:transactionID,
|
|
registerNumber="",
|
|
merchantTransactionId="",
|
|
}
|
|
|
|
if(StructKeyExists(options,"invoiceNumber")){
|
|
args["invoiceNumber"]=options.invoiceNumber;
|
|
}
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
var resp = variables.MerchantWareService.Refund(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "Refund"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
}
|
|
|
|
|
|
function credit(Any required transactionID, Any required money, Struct options={}) {
|
|
|
|
throw("Method Not Implemented");
|
|
|
|
}
|
|
|
|
|
|
|
|
function void(required Any transactionID, Struct options={}) {
|
|
|
|
var requestType = "Void";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
|
|
token:transactionID,
|
|
registerNumber="",
|
|
merchantTransactionId="",
|
|
}
|
|
|
|
|
|
if(StructKeyExists(options,"registerNumber")){
|
|
args["registerNumber"]=options.registerNumber;
|
|
}
|
|
if(StructKeyExists(options,"merchantTransactionId")){
|
|
args["merchantTransactionId"]=options.merchantTransactionId;
|
|
}
|
|
|
|
var resp = variables.MerchantWareService.Void(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "Void"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
|
|
}
|
|
|
|
function store(String merchantDefinedToken="", required account) {
|
|
|
|
var requestType = "VaultBoardCreditKeyed";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
merchantDefinedToken=merchantDefinedToken,
|
|
cardNumber:account.getAccount(),
|
|
expirationDate=DateFormat(account.getExpirationDate(), "MMYY"),
|
|
cardholder=account.getName(),
|
|
avsStreetAddress=account.getAddress(),
|
|
avsStreetZipCode=account.getPostalCode(),
|
|
}
|
|
|
|
|
|
var resp = variables.MerchantWareService.VaultBoardCreditKeyed(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "Void"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
|
|
}
|
|
function storeByTransaction(String merchantDefinedToken="", required String referenceNumber) {
|
|
|
|
var requestType = "VaultBoardCreditByReference";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
merchantDefinedToken=merchantDefinedToken,
|
|
referenceNumber:referenceNumber
|
|
}
|
|
|
|
|
|
var resp = variables.MerchantWareService.VaultBoardCreditByReference(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "VaultBoardCreditByReference"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
|
|
}
|
|
|
|
function unstore(String vaultToken="") {
|
|
|
|
var requestType = "VaultDeleteToken";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
vaultToken=vaultToken,
|
|
}
|
|
|
|
|
|
var resp = variables.MerchantWareService.VaultDeleteToken(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType": "VaultDeleteToken"
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
|
|
}
|
|
|
|
|
|
function getCustomer(String merchantDefinedToken="") {
|
|
|
|
var requestType = "VaultFindPaymentInfo";
|
|
var creds = getMerchantAuthentication();
|
|
|
|
var args = {
|
|
merchantName:creds.merchantName,
|
|
merchantSiteId:creds.merchantSiteId,
|
|
merchantKey:creds.merchantKey,
|
|
vaultToken=merchantDefinedToken,
|
|
}
|
|
|
|
|
|
var resp = variables.MerchantWareService.VaultFindPaymentInfo(argumentCollection=args );
|
|
//Raw result
|
|
|
|
var result = {
|
|
"parsedResult": resp,
|
|
"service" : super.getService(),
|
|
"testmode" : super.getTestMode(),
|
|
"requestType":requestType
|
|
};
|
|
var formattedresponse = new MerchantWareResponse(argumentCollection=result);
|
|
|
|
return formattedresponse;
|
|
|
|
}
|
|
|
|
function getMerchantAuthentication(){
|
|
|
|
return {
|
|
"merchantName" : variables.cfpayment.merchantName,
|
|
"merchantSiteId" : variables.cfpayment.merchantSiteID,
|
|
"merchantKey" : variables.cfpayment.merchantKey
|
|
|
|
|
|
}
|
|
}
|
|
}
|