PaySecure Pinless Web Services 2023:07:03:07

<back to all web services

WICSubstitutionRequest

The following routes are available for this service:
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 .xml suffix or ?format=xml

HTTP + XML

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: application/xml
Content-Type: application/xml
Content-Length: length

<WICSubstitutionRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.servicestack.net/types">
  <Amount>0</Amount>
  <Credentials>
    <MerchantId>String</MerchantId>
    <Password>String</Password>
    <UserName>String</UserName>
    <Version>String</Version>
  </Credentials>
  <CurrencyCode>String</CurrencyCode>
  <Custom1>String</Custom1>
  <Custom2>String</Custom2>
  <Custom3>String</Custom3>
  <Custom4>String</Custom4>
  <Custom5>String</Custom5>
  <DeliveryAddress>
    <Address>String</Address>
    <City>String</City>
    <Country>String</Country>
    <DeliveryMethod>0</DeliveryMethod>
    <Email>String</Email>
    <FirstName>String</FirstName>
    <IPAddress>String</IPAddress>
    <LastName>String</LastName>
    <MiddleName>String</MiddleName>
    <State>String</State>
    <TelephoneNumber>String</TelephoneNumber>
    <TelephoneType>D</TelephoneType>
    <Zip>String</Zip>
  </DeliveryAddress>
  <DiscountAmount>0</DiscountAmount>
  <ExtendedData>
    <BillPayGroup>Default</BillPayGroup>
    <BillPayGroupIndicator>
      <MITAmount>String</MITAmount>
      <MITAmountType>String</MITAmountType>
      <MITFrequency>String</MITFrequency>
      <MITSequenceIndicator>String</MITSequenceIndicator>
      <MITTotalPaymentCount>String</MITTotalPaymentCount>
      <MITUniqueID>String</MITUniqueID>
      <MITValidationFlag>String</MITValidationFlag>
      <MITValidationReference>String</MITValidationReference>
    </BillPayGroupIndicator>
    <CardAccountUpdater>Default</CardAccountUpdater>
    <CardonFileIndicator>
      <CardonFile>Default</CardonFile>
      <NetworkTransactionId>String</NetworkTransactionId>
      <ScheduleIndicator>Default</ScheduleIndicator>
      <StoredCredentialIndicator>Default</StoredCredentialIndicator>
      <TransactionInitiate>Default</TransactionInitiate>
    </CardonFileIndicator>
    <CashbackAmount>0</CashbackAmount>
    <ChargeTypeDetail>Default</ChargeTypeDetail>
    <CurrentShipment>0</CurrentShipment>
    <IsTokenRequested>false</IsTokenRequested>
    <Level2Data>
      <DestinationPostalCode>String</DestinationPostalCode>
      <MerchantReferenceNumber>String</MerchantReferenceNumber>
      <MerchantTaxId>String</MerchantTaxId>
      <OrderNumber>String</OrderNumber>
      <ProductDescription>String</ProductDescription>
      <TaxAmount>0</TaxAmount>
      <TaxDetails>Default</TaxDetails>
    </Level2Data>
    <Network>Default</Network>
    <OTPTranId>String</OTPTranId>
    <OrderTypeDetail>Default</OrderTypeDetail>
    <PaymentFacilitatorData>
      <PFPhoneNumber>String</PFPhoneNumber>
      <PaymentFacilitatorIndicator>String</PaymentFacilitatorIndicator>
      <SellerID>String</SellerID>
      <SubMerchID>String</SubMerchID>
    </PaymentFacilitatorData>
    <ReceiverInfo>
      <AccountNumber>String</AccountNumber>
      <Address>String</Address>
      <City>String</City>
      <Country>String</Country>
      <Name>String</Name>
      <PhoneNumber>String</PhoneNumber>
      <ReferenceNumber>String</ReferenceNumber>
      <State>String</State>
      <Zip>String</Zip>
    </ReceiverInfo>
    <RetryAttemptCount>0</RetryAttemptCount>
    <SAFEligible>Default</SAFEligible>
    <SecureData>
      <CAVV>String</CAVV>
      <SecureTransactionId>String</SecureTransactionId>
    </SecureData>
    <SenderInfo>
      <AccountNumber>String</AccountNumber>
      <Address>String</Address>
      <City>String</City>
      <Country>String</Country>
      <DateOfBirth>String</DateOfBirth>
      <FundingSource>DepositAccount</FundingSource>
      <Name>String</Name>
      <PhoneNumber>String</PhoneNumber>
      <ReferenceNumber>String</ReferenceNumber>
      <State>String</State>
      <Zip>String</Zip>
    </SenderInfo>
    <SignatureHashVersion>String</SignatureHashVersion>
    <TokenData>
      <TokenCryptogramData1>String</TokenCryptogramData1>
      <TokenCryptogramData2>String</TokenCryptogramData2>
      <TokenType>Default</TokenType>
    </TokenData>
    <TotalAuthAmount>0</TotalAuthAmount>
    <TotalShipments>0</TotalShipments>
    <Track2DataForEMVTransaction>String</Track2DataForEMVTransaction>
    <WalletData>
      <ApplicationData>String</ApplicationData>
      <ApplicationDataHash>String</ApplicationDataHash>
      <DigitalWalletIndicator>Default</DigitalWalletIndicator>
      <EncryptedData>String</EncryptedData>
      <EphemeralPublicKey>String</EphemeralPublicKey>
      <MerchantIdentifier>String</MerchantIdentifier>
      <PublicKeyHash>String</PublicKeyHash>
      <Signature>String</Signature>
      <SpecialPayment>String</SpecialPayment>
      <TransactionId>String</TransactionId>
      <Type>String</Type>
      <Version>String</Version>
    </WalletData>
  </ExtendedData>
  <MerchantDetails>
    <DataElements>
      <RefundSettlementTypeDetails>0</RefundSettlementTypeDetails>
      <SendRecurringPOSEntryModeFeature>false</SendRecurringPOSEntryModeFeature>
      <UseOrgPOSCode>false</UseOrgPOSCode>
    </DataElements>
    <Address>String</Address>
    <City>String</City>
    <Country>String</Country>
    <CustomerServiceNumber>String</CustomerServiceNumber>
    <Email>String</Email>
    <FNSnum>String</FNSnum>
    <MCC>String</MCC>
    <Name>String</Name>
    <State>String</State>
    <Zip>String</Zip>
  </MerchantDetails>
  <ReferenceKey>String</ReferenceKey>
  <SignatureHash>String</SignatureHash>
  <TranId>String</TranId>
  <WICProducts>
    <WICProduct>
      <ActionCode>Approved</ActionCode>
      <ItemPrice>0</ItemPrice>
      <ItemQuantity>0</ItemQuantity>
      <OriginalItemPrice>0</OriginalItemPrice>
      <OriginalItemQuantity>0</OriginalItemQuantity>
      <ProductCode>String</ProductCode>
      <ProductCodeInd>PLU</ProductCodeInd>
    </WICProduct>
  </WICProducts>
</WICSubstitutionRequest>
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: length

<WICSubstitution xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.servicestack.net/types">
  <Timestamps>
    <AppLayer>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </AppLayer>
    <BackendProcess>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </BackendProcess>
    <CardEncrypt>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </CardEncrypt>
    <CardTokenize>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </CardTokenize>
    <DBInsert>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </DBInsert>
    <DBUpdate>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </DBUpdate>
    <GetCardData>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </GetCardData>
    <Network>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </Network>
    <ParentLookup>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </ParentLookup>
    <ParentUpdate>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </ParentUpdate>
    <RetryLookup>
      <InTime>0001-01-01T00:00:00</InTime>
      <OutTime>0001-01-01T00:00:00</OutTime>
    </RetryLookup>
  </Timestamps>
  <ExtendedData>
    <CHEmailAddrResult>String</CHEmailAddrResult>
    <CardAccountUpdater>
      <CardDataType>CardNumber</CardDataType>
      <CardNumberInfo>String</CardNumberInfo>
      <CardToken>String</CardToken>
      <ErrorCode>String</ErrorCode>
      <ExpiryDate>String</ExpiryDate>
      <Status>String</Status>
    </CardAccountUpdater>
    <NetworkResponseCode>String</NetworkResponseCode>
    <NetworkTransactionId>String</NetworkTransactionId>
    <ProductId>String</ProductId>
  </ExtendedData>
  <LocalDateTime>String</LocalDateTime>
  <Token>String</Token>
  <ApprovalCode>String</ApprovalCode>
  <ApprovedAmount>0</ApprovedAmount>
  <DiscountAmount>0</DiscountAmount>
  <EarliestBenefitExpirationDate>String</EarliestBenefitExpirationDate>
  <ErrorCode>String</ErrorCode>
  <ErrorMessage>String</ErrorMessage>
  <Network>String</Network>
  <ResponseCode>String</ResponseCode>
  <TranId>String</TranId>
  <WICBalances>
    <WICBalance>
      <WICCategory>String</WICCategory>
      <WICQuantity>0</WICQuantity>
      <WICSubcategory>String</WICSubcategory>
    </WICBalance>
  </WICBalances>
  <WICProducts>
    <WICProduct>
      <ActionCode>Approved</ActionCode>
      <ItemPrice>0</ItemPrice>
      <ItemQuantity>0</ItemQuantity>
      <OriginalItemPrice>0</OriginalItemPrice>
      <OriginalItemQuantity>0</OriginalItemQuantity>
      <ProductCode>String</ProductCode>
      <ProductCodeInd>PLU</ProductCodeInd>
    </WICProduct>
  </WICProducts>
</WICSubstitution>