POST | /WICSubstitution |
---|
import Foundation
import ServiceStack
// @DataContract
public class WICSubstitutionRequest : Codable
{
// @DataMember
public var credentials:RequestorCredentials
// @DataMember
public var amount:Int
// @DataMember
public var discountAmount:Int
// @DataMember
public var tranId:String
// @DataMember
public var referenceKey:String
// @DataMember
public var currencyCode:String
// @DataMember
public var deliveryAddress:Avs
// @DataMember
public var merchantDetails:MerchantDescriptor
// @DataMember
public var wicProducts:[WICProduct] = []
// @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 Avs : Codable
{
public var address:String
public var city:String
public var state:String
public var zip:String
public var country:String
public var email:String
public var ipAddress:String
public var telephoneNumber:String
public var telephoneType:TelephoneType
public var deliveryMethod:Int
public var firstName:String
public var middleName:String
public var lastName:String
required public init(){}
}
public enum TelephoneType : String, Codable
{
case D
case H
case N
case W
}
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(){}
}
public class WICProduct : Codable
{
public var productCodeInd:WICProductCodeInd
public var productCode:String
public var itemPrice:Int
public var itemQuantity:Int
public var actionCode:WICActionCode
public var originalItemPrice:Int
public var originalItemQuantity:Int
required public init(){}
}
public enum WICProductCodeInd : Int, Codable
{
case PLU = 1
case UPC = 2
}
public enum WICActionCode : String, Codable
{
case Approved
case CategoryNotPrescribed
case SubcategoryNotPrescribed
case InsufficientUnits
case ProduceCodeNotSubscribed
case ApprovedLowerPrice
}
// @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 WICSubstitution : PaysecureVersion
{
// @DataMember
public var approvalCode:String
// @DataMember
public var tranId:String
// @DataMember
public var errorMessage:String
// @DataMember
public var errorCode:String
// @DataMember
public var approvedAmount:Int
// @DataMember
public var discountAmount:Int
// @DataMember
public var network:String
// @DataMember
public var earliestBenefitExpirationDate:String
// @DataMember
public var wicBalances:[WICBalance] = []
// @DataMember
public var wicProducts:[WICProduct] = []
// @DataMember
public var responseCode:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case approvalCode
case tranId
case errorMessage
case errorCode
case approvedAmount
case discountAmount
case network
case earliestBenefitExpirationDate
case wicBalances
case wicProducts
case responseCode
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
approvalCode = try container.decodeIfPresent(String.self, forKey: .approvalCode)
tranId = try container.decodeIfPresent(String.self, forKey: .tranId)
errorMessage = try container.decodeIfPresent(String.self, forKey: .errorMessage)
errorCode = try container.decodeIfPresent(String.self, forKey: .errorCode)
approvedAmount = try container.decodeIfPresent(Int.self, forKey: .approvedAmount)
discountAmount = try container.decodeIfPresent(Int.self, forKey: .discountAmount)
network = try container.decodeIfPresent(String.self, forKey: .network)
earliestBenefitExpirationDate = try container.decodeIfPresent(String.self, forKey: .earliestBenefitExpirationDate)
wicBalances = try container.decodeIfPresent([WICBalance].self, forKey: .wicBalances) ?? []
wicProducts = try container.decodeIfPresent([WICProduct].self, forKey: .wicProducts) ?? []
responseCode = try container.decodeIfPresent(String.self, forKey: .responseCode)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if approvalCode != nil { try container.encode(approvalCode, forKey: .approvalCode) }
if tranId != nil { try container.encode(tranId, forKey: .tranId) }
if errorMessage != nil { try container.encode(errorMessage, forKey: .errorMessage) }
if errorCode != nil { try container.encode(errorCode, forKey: .errorCode) }
if approvedAmount != nil { try container.encode(approvedAmount, forKey: .approvedAmount) }
if discountAmount != nil { try container.encode(discountAmount, forKey: .discountAmount) }
if network != nil { try container.encode(network, forKey: .network) }
if earliestBenefitExpirationDate != nil { try container.encode(earliestBenefitExpirationDate, forKey: .earliestBenefitExpirationDate) }
if wicBalances.count > 0 { try container.encode(wicBalances, forKey: .wicBalances) }
if wicProducts.count > 0 { try container.encode(wicProducts, forKey: .wicProducts) }
if responseCode != nil { try container.encode(responseCode, forKey: .responseCode) }
}
}
// @DataContract
public class PaysecureVersion : PaysecureResponseInternal
{
// @DataMember(EmitDefaultValue=false)
public var localDateTime:String
// @DataMember(EmitDefaultValue=false)
public var token:String
// @DataMember(EmitDefaultValue=false)
public var extendedData:ExtendedResponse
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case localDateTime
case token
case extendedData
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
localDateTime = try container.decodeIfPresent(String.self, forKey: .localDateTime)
token = try container.decodeIfPresent(String.self, forKey: .token)
extendedData = try container.decodeIfPresent(ExtendedResponse.self, forKey: .extendedData)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if localDateTime != nil { try container.encode(localDateTime, forKey: .localDateTime) }
if token != nil { try container.encode(token, forKey: .token) }
if extendedData != nil { try container.encode(extendedData, forKey: .extendedData) }
}
}
// @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(){}
}
// @DataContract
public class ExtendedResponse : Codable
{
// @DataMember(EmitDefaultValue=false)
public var cardAccountUpdater:CardAccountUpdaterDescriptor
// @DataMember(EmitDefaultValue=false)
public var productId:String
// @DataMember(EmitDefaultValue=false)
public var networkResponseCode:String
// @DataMember(EmitDefaultValue=false)
public var networkTransactionId:String
// @DataMember(EmitDefaultValue=false)
public var chEmailAddrResult:String
required public init(){}
}
public class CardAccountUpdaterDescriptor : Codable
{
public var cardDataType:CardInfoType
public var cardNumberInfo:String
public var expiryDate:String
public var status:String
public var errorCode:String
public var cardToken:String
required public init(){}
}
public enum CardInfoType : String, Codable
{
case CardNumber
case Token
case Track
case EMV
case Encrypted
case DPAN
case ApplePay
case GooglePay
case SamsungPay
case CPToken
case EncryptedEnhanced
case EncryptedJWE
}
public class WICBalance : Codable
{
public var wicCategory:String
public var wicSubcategory:String
public var wicQuantity:Int
required public init(){}
}
Swift WICSubstitutionRequest DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .other suffix or ?format=other
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /WICSubstitution HTTP/1.1
Host: api.paysecure.acculynk.net
Accept: text/jsonl
Content-Type: text/jsonl
Content-Length: length
{"Credentials":{"MerchantId":"String","UserName":"String","Password":"String","Version":"String"},"Amount":0,"DiscountAmount":0,"TranId":"String","ReferenceKey":"String","CurrencyCode":"String","DeliveryAddress":{"Address":"String","City":"String","State":"String","Zip":"String","Country":"String","Email":"String","IPAddress":"String","TelephoneNumber":"String","TelephoneType":"D","DeliveryMethod":0,"FirstName":"String","MiddleName":"String","LastName":"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}},"WICProducts":[{"ProductCodeInd":"PLU","ProductCode":"String","ItemPrice":0,"ItemQuantity":0,"ActionCode":"Approved","OriginalItemPrice":0,"OriginalItemQuantity":0}],"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/jsonl Content-Length: length {"ApprovalCode":"String","TranId":"String","ErrorMessage":"String","ErrorCode":"String","ApprovedAmount":0,"DiscountAmount":0,"Network":"String","EarliestBenefitExpirationDate":"String","WICBalances":[{"WICCategory":"String","WICSubcategory":"String","WICQuantity":0}],"WICProducts":[{"ProductCodeInd":"PLU","ProductCode":"String","ItemPrice":0,"ItemQuantity":0,"ActionCode":"Approved","OriginalItemPrice":0,"OriginalItemQuantity":0}],"ResponseCode":"String","LocalDateTime":"String","Token":"String","ExtendedData":{"CardAccountUpdater":{"CardDataType":"CardNumber","CardNumberInfo":"String","ExpiryDate":"String","Status":"String","ErrorCode":"String","CardToken":"String"},"ProductId":"String","NetworkResponseCode":"String","NetworkTransactionId":"String","CHEmailAddrResult":"String"},"Timestamps":{"AppLayer":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"ParentLookup":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"RetryLookup":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"GetCardData":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"CardTokenize":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"CardEncrypt":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"DBInsert":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"BackendProcess":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"DBUpdate":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"ParentUpdate":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"},"Network":{"InTime":"\/Date(-62135596800000-0000)\/","OutTime":"\/Date(-62135596800000-0000)\/"}}}