ClubReady Api

<back to all web services

PaymentProfileImportEndpoint

The following routes are available for this service:
POST/sales/paymentprofile/importImport a Payment Profile (using ProfileToken) After a Payment Profile is created in the ClubReadyGateway API (aka Vault API), the information has to be imported into the ClubReady system. The AcctToken and ProfileToken are created by the ClubReadyGateway API.
import Foundation
import ServiceStack

// @ApiResponse(Description="", ResponseType=typeof(PaymentProfileImportResponse), StatusCode=200)
public class PaymentProfileImportEndpoint : PaymentProfileImportRequest, IApiKeyEndpoint
{
    /**
    * Api Authentication Key
    */
    // @ApiMember(Description="Api Authentication Key", IsRequired=true, ParameterType="query")
    public var apiKey:String

    /**
    * Encoded data uniquely identifying the payment profile.  Long term storage of AcctToken is not recommended, as the token may change over time (for example, by processes like Account Updater).  The length is usually 80 characters.
    */
    // @ApiMember(Description="\r\nEncoded data uniquely identifying the payment profile.  \r\nLong term storage of AcctToken is not recommended, as the token may change over time (for example, by processes like Account Updater).  \r\nThe length is usually 80 characters.", IsRequired=true)
    public var acctToken:String

    /**
    * Encoded data containing non-PCI information about the Payment Profile.  ProfileTokens contain a timestamp. If the ClubReady API does not process the token within 5 minutes,it cannot be accepted and a new profile will have to be created with a new AcctToken. The timevalidation is to prevent old tokens from be re-played at a later time.  The length is variable, but generally around 1,000 characters.
    */
    // @ApiMember(Description="\r\nEncoded data containing non-PCI information about the Payment Profile.  \r\n\r\nProfileTokens contain a timestamp. If the ClubReady API does not process the token within 5 minutes,\r\nit cannot be accepted and a new profile will have to be created with a new AcctToken. The time\r\nvalidation is to prevent old tokens from be re-played at a later time.  \r\n\r\nThe length is variable, but generally around 1,000 characters.", IsRequired=true)
    public var profileToken:String

    /**
    * When adding a Payment Profile that is 'on-file', the default behavior is to update the user's Payment TypePreference to the AcctClass of the new profile. If you wish to not update the preference, you can set`DoNotUpdatePaymentTypePreference` to `true`. Otherwise, this can be omitted or `false`.  For `IsTemp == true` profiles, `DoNotUpdatePaymentTypePreference` is ignored.
    */
    // @ApiMember(Description="\r\nWhen adding a Payment Profile that is 'on-file', the default behavior is to update the user's Payment Type\r\nPreference to the AcctClass of the new profile. If you wish to not update the preference, you can set\r\n`DoNotUpdatePaymentTypePreference` to `true`. Otherwise, this can be omitted or `false`.  \r\n\r\nFor `IsTemp == true` profiles, `DoNotUpdatePaymentTypePreference` is ignored.")
    public var doNotUpdatePaymentTypePreference:Bool

    /**
    * **Conditionally Required**  When adding a Payment Profile that has an OwnerType of `TempStUser`, the ownership will be changed to OwnerType of `User`with the `UserId` of the supplied `NewOwnerId`.
    */
    // @ApiMember(Description="\r\n**Conditionally Required**  \r\n\r\nWhen adding a Payment Profile that has an OwnerType of `TempStUser`, the ownership will be changed to OwnerType of `User`\r\nwith the `UserId` of the supplied `NewOwnerId`.")
    public var newOwnerId:Int?

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

    private enum CodingKeys : String, CodingKey {
        case apiKey
        case acctToken
        case profileToken
        case doNotUpdatePaymentTypePreference
        case newOwnerId
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        apiKey = try container.decodeIfPresent(String.self, forKey: .apiKey)
        acctToken = try container.decodeIfPresent(String.self, forKey: .acctToken)
        profileToken = try container.decodeIfPresent(String.self, forKey: .profileToken)
        doNotUpdatePaymentTypePreference = try container.decodeIfPresent(Bool.self, forKey: .doNotUpdatePaymentTypePreference)
        newOwnerId = try container.decodeIfPresent(Int.self, forKey: .newOwnerId)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if apiKey != nil { try container.encode(apiKey, forKey: .apiKey) }
        if acctToken != nil { try container.encode(acctToken, forKey: .acctToken) }
        if profileToken != nil { try container.encode(profileToken, forKey: .profileToken) }
        if doNotUpdatePaymentTypePreference != nil { try container.encode(doNotUpdatePaymentTypePreference, forKey: .doNotUpdatePaymentTypePreference) }
        if newOwnerId != nil { try container.encode(newOwnerId, forKey: .newOwnerId) }
    }
}

public class PaymentProfileImportRequest : Codable
{
    public var acctToken:String
    public var profileToken:String
    public var doNotUpdatePaymentTypePreference:Bool
    public var newOwner:ValueTuple<Int,OwnerType>?

    required public init(){}
}

public class PaymentProfileImportResponse : Codable
{
    public var success:Bool
    public var message:String
    public var paymentProfile:PaymentProfile

    required public init(){}
}

public class PaymentProfile : Codable
{
    public var paymentProfileId:Int
    public var acctToken:String
    public var ownerId:Int
    public var ownerTypeId:Int16
    public var acctTypeId:Int16
    public var acctClassId:Int16
    public var prefixName:String
    public var firstName:String
    public var middleName:String
    public var lastName:String
    public var suffixName:String
    public var address1:String
    public var address2:String
    public var urbanization:String
    public var city:String
    public var state:String
    public var postalCode:String
    public var countryCode:String
    public var last4:String
    public var ccExpMonth:UInt8?
    public var ccExpYear:UInt8?
    public var isTemp:Bool
    public var isDisabled:Bool
    public var onHoldUtc:Date?
    public var onHoldReasonCode:UInt8?
    public var onHoldReasonDetail:String
    public var acctUpdaterFlagUtc:Date?
    public var createdBy:Int
    public var createdUtc:Date
    public var modifiedBy:Int
    public var modifiedUtc:Date
    public var acctUpdaterFlag:Bool
    public var entryModeId:Int16
    public var excludeFromAcctUpdater:Bool

    required public init(){}
}


Swift PaymentProfileImportEndpoint 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 /sales/paymentprofile/import HTTP/1.1 
Host: clubready.com 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	ApiKey: String,
	AcctToken: String,
	ProfileToken: String,
	DoNotUpdatePaymentTypePreference: False,
	NewOwnerId: 0,
	NewOwner: "(0, Unknown)"
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	Success: False,
	Message: String,
	PaymentProfile: 
	{
		PaymentProfileId: 0,
		AcctToken: String,
		OwnerId: 0,
		OwnerTypeId: 0,
		AcctTypeId: 0,
		AcctClassId: 0,
		PrefixName: String,
		FirstName: String,
		MiddleName: String,
		LastName: String,
		SuffixName: String,
		Address1: String,
		Address2: String,
		Urbanization: String,
		City: String,
		State: String,
		PostalCode: String,
		CountryCode: String,
		Last4: String,
		CcExpMonth: 0,
		CcExpYear: 0,
		IsTemp: False,
		IsDisabled: False,
		OnHoldUtc: 0001-01-01,
		OnHoldReasonCode: 0,
		OnHoldReasonDetail: String,
		AcctUpdaterFlagUtc: 0001-01-01,
		CreatedBy: 0,
		CreatedUtc: 0001-01-01,
		ModifiedBy: 0,
		ModifiedUtc: 0001-01-01,
		AcctUpdaterFlag: False,
		EntryModeId: 0,
		ExcludeFromAcctUpdater: False
	}
}