PaySecure Pinless Web Services 2023:07:03:07

<back to all web services

POSCardlessRefundRequest

The following routes are available for this service:
POST/POSCardlessRefund
import Foundation
import ServiceStack

// @DataContract
public class POSCardlessRefundRequest : Codable
{
    // @DataMember
    public var credentials:RequestorCredentials

    // @DataMember
    public var referenceKey:String

    // @DataMember
    public var originalReferenceKey:String

    // @DataMember
    public var amount:Int

    // @DataMember
    public var tid:String

    // @DataMember
    public var mid:String

    // @DataMember
    public var networkRequestData:NetworkRequestData

    /**
    * Local Date Format mmddyyyy. For Example:- 01202017
    */
    // @DataMember
    public var localDate:String

    /**
    * Local Time Format HHmmss. For Example :- 012322
    */
    // @DataMember
    public var localTime:String

    // @DataMember
    public var merchantDetails:MerchantDescriptor

    // @DataMember
    public var custom1:String

    // @DataMember
    public var custom2:String

    // @DataMember
    public var custom3:String

    // @DataMember
    public var custom4:String

    // @DataMember
    public var custom5:String

    // @DataMember
    public var signatureHash:String

    // @DataMember
    public var extendedData:ExtendedData

    required public init(){}
}

public class RequestorCredentials : Codable
{
    // @Required()
    public var merchantId:String?

    // @Required()
    public var userName:String?

    // @Required()
    public var password:String?

    // @Required()
    public var version:String?

    required public init(){}
}

public class NetworkRequestData : Codable
{
    public var aliPayPartnerId:String
    public var webHookURL:String
    public var orderTitle:String
    public var orderDetail:String
    public var terminalIP:String
    public var orderNumber:String

    required public init(){}
}

public class MerchantDescriptor : MerchantDescriptorBase
{
    public var name:String
    public var address:String
    public var city:String
    public var state:String
    public var zip:String
    public var country:String
    public var customerServiceNumber:String
    public var mcc:String
    public var fnSnum:String
    public var email:String

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case name
        case address
        case city
        case state
        case zip
        case country
        case customerServiceNumber
        case mcc
        case fnSnum
        case email
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decodeIfPresent(String.self, forKey: .name)
        address = try container.decodeIfPresent(String.self, forKey: .address)
        city = try container.decodeIfPresent(String.self, forKey: .city)
        state = try container.decodeIfPresent(String.self, forKey: .state)
        zip = try container.decodeIfPresent(String.self, forKey: .zip)
        country = try container.decodeIfPresent(String.self, forKey: .country)
        customerServiceNumber = try container.decodeIfPresent(String.self, forKey: .customerServiceNumber)
        mcc = try container.decodeIfPresent(String.self, forKey: .mcc)
        fnSnum = try container.decodeIfPresent(String.self, forKey: .fnSnum)
        email = try container.decodeIfPresent(String.self, forKey: .email)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if name != nil { try container.encode(name, forKey: .name) }
        if address != nil { try container.encode(address, forKey: .address) }
        if city != nil { try container.encode(city, forKey: .city) }
        if state != nil { try container.encode(state, forKey: .state) }
        if zip != nil { try container.encode(zip, forKey: .zip) }
        if country != nil { try container.encode(country, forKey: .country) }
        if customerServiceNumber != nil { try container.encode(customerServiceNumber, forKey: .customerServiceNumber) }
        if mcc != nil { try container.encode(mcc, forKey: .mcc) }
        if fnSnum != nil { try container.encode(fnSnum, forKey: .fnSnum) }
        if email != nil { try container.encode(email, forKey: .email) }
    }
}

public class MerchantDescriptorBase : Codable
{
    public var dataElements:MerchantDataElements

    required public init(){}
}

public class MerchantDataElements : Codable
{
    public var refundSettlementTypeDetails:Int
    public var sendRecurringPOSEntryModeFeature:Bool
    public var useOrgPOSCode:Bool

    required public init(){}
}

// @DataContract
public class ExtendedData : Codable
{
    // @DataMember
    public var track2DataForEMVTransaction:String

    // @DataMember
    public var senderInfo:SenderInfo

    // @DataMember
    public var cashbackAmount:Int

    // @DataMember
    public var network:NetworkName

    // @DataMember
    public var receiverInfo:ReceiverInfo

    // @DataMember
    public var billPayGroup:BillPayGroup

    // @DataMember
    public var walletData:WalletDescriptor

    // @DataMember
    public var secureData:SecureDescriptor

    // @DataMember
    public var level2Data:Level2Descriptor

    // @DataMember
    public var paymentFacilitatorData:PaymentFacilitatorDescriptor

    // @DataMember
    public var tokenData:TokenDescriptor

    // @DataMember
    public var otpTranId:String

    // @DataMember
    public var currentShipment:Int

    // @DataMember
    public var totalShipments:Int

    // @DataMember
    public var isTokenRequested:Bool

    // @DataMember
    public var cardonFileIndicator:CardonFileIndicatorDescriptor

    // @DataMember
    public var cardAccountUpdater:CardAccountUpdaterInfo

    // @DataMember
    public var retryAttemptCount:Int

    // @DataMember
    public var totalAuthAmount:Int

    // @DataMember
    public var signatureHashVersion:String

    // @DataMember
    public var orderTypeDetail:OrderTypeInfo

    // @DataMember
    public var billPayGroupIndicator:BillPayGroupIndicator

    // @DataMember
    public var chargeTypeDetail:ChargeTypeInfo

    // @DataMember
    public var safEligible:SAFEligibleFlag

    required public init(){}
}

public class SenderInfo : Codable
{
    public var referenceNumber:String
    public var accountNumber:String
    /**
    * Name Format FirstName{Space}LastName. For Example :- Alvaro Morata
    */
    public var name:String
    public var address:String
    public var city:String
    public var state:String
    public var country:String
    /**
    * DateOfBirth Format MMDDYYYY. For Example :- 05051960
    */
    public var dateOfBirth:String
    public var zip:String
    public var phoneNumber:String
    public var fundingSource:FundingSourceType

    required public init(){}
}

public enum FundingSourceType : String, Codable
{
    case DepositAccount
    case Credit
    case Debit
    case Prepaid
}

public enum NetworkName : String, Codable
{
    case Default
    case NYCE
    case CU24
    case XCEL
    case STAR
    case PULS
    case SHZM
    case VISA
    case MAST
    case DISC
    case AMEX
    case ALIP
    case UPIN
    case STAC
    case STNE
    case MAES
    case INTL
}

public class ReceiverInfo : Codable
{
    public var referenceNumber:String
    public var accountNumber:String
    /**
    * Name Format FirstName{Space}LastName. For Example :- Alvaro Morata
    */
    public var name:String
    public var address:String
    public var city:String
    public var state:String
    public var country:String
    public var zip:String
    public var phoneNumber:String

    required public init(){}
}

public enum BillPayGroup : String, Codable
{
    case Default
    case Single
    case Recurring
    case Installment
    case Deferred
}

public class WalletDescriptor : Codable
{
    public var type:String
    public var encryptedData:String
    public var applicationDataHash:String
    public var ephemeralPublicKey:String
    public var publicKeyHash:String
    public var transactionId:String
    public var signature:String
    public var version:String
    public var applicationData:String
    public var merchantIdentifier:String
    public var specialPayment:String
    public var digitalWalletIndicator:DigitalWalletInfo

    required public init(){}
}

public enum DigitalWalletInfo : String, Codable
{
    case Default
    case Staged
    case Passthrough
}

public class SecureDescriptor : Codable
{
    public var cavv:String
    public var secureTransactionId:String

    required public init(){}
}

public class Level2Descriptor : Codable
{
    public var taxDetails:TaxIndicator
    public var merchantReferenceNumber:String
    public var merchantTaxId:String
    public var orderNumber:String
    public var taxAmount:Int
    public var destinationPostalCode:String
    public var productDescription:String

    required public init(){}
}

public enum TaxIndicator : String, Codable
{
    case Default
    case NoTaxInfoProvided
    case TaxInfoProvided
    case TaxExemptItem
}

public class PaymentFacilitatorDescriptor : Codable
{
    public var paymentFacilitatorIndicator:String
    public var pfPhoneNumber:String
    public var subMerchID:String
    public var sellerID:String

    required public init(){}
}

public class TokenDescriptor : Codable
{
    public var tokenType:TokenTypes
    public var tokenCryptogramData1:String
    public var tokenCryptogramData2:String

    required public init(){}
}

public enum TokenTypes : String, Codable
{
    case Default
    case UCAF
    case DSRP
    case UCAFDSRP
    case VisaVerified
    case DigitalWallet
    case VisaVerifiedDigitalWallet
}

public class CardonFileIndicatorDescriptor : Codable
{
    public var cardonFile:CardonFileInfo
    public var storedCredentialIndicator:StoredCredentialIndicatorInfo
    public var transactionInitiate:TransactionInitiateInfo
    public var scheduleIndicator:ScheduleIndicatorInfo
    public var networkTransactionId:String

    required public init(){}
}

public enum CardonFileInfo : String, Codable
{
    case Default
    case Supported
    case NotSupported
}

public enum StoredCredentialIndicatorInfo : String, Codable
{
    case Default
    case Initial
    case Subsequent
}

public enum TransactionInitiateInfo : String, Codable
{
    case Default
    case Merchant
    case Terminal
    case Customer
}

public enum ScheduleIndicatorInfo : String, Codable
{
    case Default
    case Scheduled
    case Unscheduled
}

public enum CardAccountUpdaterInfo : String, Codable
{
    case Default
    case Supported
    case NotSupported
}

public enum OrderTypeInfo : String, Codable
{
    case Default
    case Standing
    case Subscription
}

public class BillPayGroupIndicator : Codable
{
    public var mitTotalPaymentCount:String
    public var mitAmountType:String
    public var mitAmount:String
    public var mitUniqueID:String
    public var mitFrequency:String
    public var mitValidationFlag:String
    public var mitValidationReference:String
    public var mitSequenceIndicator:String

    required public init(){}
}

public enum ChargeTypeInfo : String, Codable
{
    case Default
    case PartialShipment
    case Delayed
    case NoShow
    case Resubmission
}

public enum SAFEligibleFlag : String, Codable
{
    case Default
    case True
    case False
}

// @DataContract
public class POSCardlessRefund : PaysecureResponseInternal
{
    // @DataMember
    public var errorMessage:String

    // @DataMember
    public var errorCode:String

    // @DataMember
    public var tranId:String

    // @DataMember
    public var network:String

    // @DataMember
    public var responseCode:String

    // @DataMember
    public var networkResponseData:NetworkResponseData

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case errorMessage
        case errorCode
        case tranId
        case network
        case responseCode
        case networkResponseData
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        errorMessage = try container.decodeIfPresent(String.self, forKey: .errorMessage)
        errorCode = try container.decodeIfPresent(String.self, forKey: .errorCode)
        tranId = try container.decodeIfPresent(String.self, forKey: .tranId)
        network = try container.decodeIfPresent(String.self, forKey: .network)
        responseCode = try container.decodeIfPresent(String.self, forKey: .responseCode)
        networkResponseData = try container.decodeIfPresent(NetworkResponseData.self, forKey: .networkResponseData)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if errorMessage != nil { try container.encode(errorMessage, forKey: .errorMessage) }
        if errorCode != nil { try container.encode(errorCode, forKey: .errorCode) }
        if tranId != nil { try container.encode(tranId, forKey: .tranId) }
        if network != nil { try container.encode(network, forKey: .network) }
        if responseCode != nil { try container.encode(responseCode, forKey: .responseCode) }
        if networkResponseData != nil { try container.encode(networkResponseData, forKey: .networkResponseData) }
    }
}

// @DataContract
public class PaysecureResponseInternal : Codable
{
    // @DataMember(EmitDefaultValue=false)
    public var timestamps:RequestTimestamps

    required public init(){}
}

// @DataContract
public class RequestTimestamps : Codable
{
    // @DataMember(EmitDefaultValue=false)
    public var appLayer:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var parentLookup:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var retryLookup:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var getCardData:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var cardTokenize:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var cardEncrypt:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var dbInsert:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var backendProcess:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var dbUpdate:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var parentUpdate:InOutTimes

    // @DataMember(EmitDefaultValue=false)
    public var network:InOutTimes

    required public init(){}
}

// @DataContract
public class InOutTimes : Codable
{
    required public init(){}
}

public class NetworkResponseData : Codable
{
    public var aliPayTransId:String
    public var aliPayTransactionTime:String
    public var responseCode:String
    public var weChatPayTransId:String
    public var weChatPayTransactionTime:String
    public var weChatPayOpenId:String

    required public init(){}
}


Swift POSCardlessRefundRequest DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /POSCardlessRefund HTTP/1.1 
Host: api.paysecure.acculynk.net 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	Credentials: 
	{
		MerchantId: String,
		UserName: String,
		Password: String,
		Version: String
	},
	ReferenceKey: String,
	OriginalReferenceKey: String,
	Amount: 0,
	TID: String,
	MID: String,
	NetworkRequestData: 
	{
		AliPayPartnerId: String,
		WebHookURL: String,
		OrderTitle: String,
		OrderDetail: String,
		TerminalIP: String,
		OrderNumber: String
	},
	LocalDate: String,
	LocalTime: String,
	MerchantDetails: 
	{
		Name: String,
		Address: String,
		City: String,
		State: String,
		Zip: String,
		Country: String,
		CustomerServiceNumber: String,
		MCC: String,
		FNSnum: String,
		Email: String,
		DataElements: 
		{
			RefundSettlementTypeDetails: 0,
			SendRecurringPOSEntryModeFeature: False,
			UseOrgPOSCode: False
		}
	},
	Custom1: String,
	Custom2: String,
	Custom3: String,
	Custom4: String,
	Custom5: String,
	SignatureHash: String,
	ExtendedData: 
	{
		Track2DataForEMVTransaction: String,
		SenderInfo: 
		{
			ReferenceNumber: String,
			AccountNumber: String,
			Name: String,
			Address: String,
			City: String,
			State: String,
			Country: String,
			DateOfBirth: String,
			Zip: String,
			PhoneNumber: String,
			FundingSource: DepositAccount
		},
		CashbackAmount: 0,
		Network: Default,
		ReceiverInfo: 
		{
			ReferenceNumber: String,
			AccountNumber: String,
			Name: String,
			Address: String,
			City: String,
			State: String,
			Country: String,
			Zip: String,
			PhoneNumber: String
		},
		BillPayGroup: Default,
		WalletData: 
		{
			Type: String,
			EncryptedData: String,
			ApplicationDataHash: String,
			EphemeralPublicKey: String,
			PublicKeyHash: String,
			TransactionId: String,
			Signature: String,
			Version: String,
			ApplicationData: String,
			MerchantIdentifier: String,
			SpecialPayment: String,
			DigitalWalletIndicator: Default
		},
		SecureData: 
		{
			CAVV: String,
			SecureTransactionId: String
		},
		Level2Data: 
		{
			TaxDetails: Default,
			MerchantReferenceNumber: String,
			MerchantTaxId: String,
			OrderNumber: String,
			TaxAmount: 0,
			DestinationPostalCode: String,
			ProductDescription: String
		},
		PaymentFacilitatorData: 
		{
			PaymentFacilitatorIndicator: String,
			PFPhoneNumber: String,
			SubMerchID: String,
			SellerID: String
		},
		TokenData: 
		{
			TokenType: Default,
			TokenCryptogramData1: String,
			TokenCryptogramData2: String
		},
		OTPTranId: String,
		CurrentShipment: 0,
		TotalShipments: 0,
		IsTokenRequested: False,
		CardonFileIndicator: 
		{
			CardonFile: Default,
			StoredCredentialIndicator: Default,
			TransactionInitiate: Default,
			ScheduleIndicator: Default,
			NetworkTransactionId: String
		},
		CardAccountUpdater: Default,
		RetryAttemptCount: 0,
		TotalAuthAmount: 0,
		SignatureHashVersion: String,
		OrderTypeDetail: Default,
		BillPayGroupIndicator: 
		{
			MITTotalPaymentCount: String,
			MITAmountType: String,
			MITAmount: String,
			MITUniqueID: String,
			MITFrequency: String,
			MITValidationFlag: String,
			MITValidationReference: String,
			MITSequenceIndicator: String
		},
		ChargeTypeDetail: Default,
		SAFEligible: Default
	}
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	ErrorMessage: String,
	ErrorCode: String,
	TranId: String,
	Network: String,
	ResponseCode: String,
	NetworkResponseData: 
	{
		AliPayTransId: String,
		AliPayTransactionTime: String,
		ResponseCode: String,
		WeChatPayTransId: String,
		WeChatPayTransactionTime: String,
		WeChatPayOpenId: String
	},
	Timestamps: 
	{
		AppLayer: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		ParentLookup: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		RetryLookup: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		GetCardData: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		CardTokenize: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		CardEncrypt: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		DBInsert: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		BackendProcess: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		DBUpdate: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		ParentUpdate: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		Network: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		}
	}
}