POST | /sales/paymentprofile/import | Import a Payment Method (using ProfileToken) | After a Payment Method is created in the Vault API (www.clubreadygateway.com), the information has to be imported into the ClubReady system. The Vault API will return a ProfileToken and AcctToken. This endpoint will import a ProfileToken as a separate step. If the ProfileToken is sent to any other endpoints, those endpoints will import the ProfileToken and this endpoint is not needed. ### ProfileToken * JSON Web Token (JWT) * Length is variable, but generally around 1,000 to 4,000 characters * Contains non-PCI information about the Payment Method * Signed by the Vault API, preventing modification * Must be sent to ClubReady API within 5 minutes of creation * Can only be used once (though retrying is allowed) * You can parse and read the JWT, but the format is subject to change without notice * You cannot validate the signature in the JWT as the public key is not available ### AcctToken * A short string that is used to reference the Payment Method in the ClubReady system * Usually around 60 to 80 characters * Should not be stored for long-term use as it can change |
---|
import Foundation
import ServiceStack
// @ApiResponse(Description="", ResponseType=typeof(PaymentProfileImportResponse), StatusCode=200)
public class PaymentProfileImportEndpoint : PaymentProfileImportRequest, IApiKeyEndpoint
{
/**
* IP address of the end user
*/
// @ApiMember(Description="IP address of the end user", Name="X-Forwarded-For", ParameterType="header")
public var xForwardedFor:String
/**
* API Authentication Key
*/
// @ApiMember(Description="API Authentication Key", IsRequired=true, ParameterType="query")
public var apiKey:String
/**
* The ProfileToken JWT to import (see description above)
*/
// @ApiMember(Description="The ProfileToken JWT to import (see description above)", IsRequired=true)
public var profileToken:String
/**
* When adding a PaymentMethod that is 'on-file' (`IsTemp == true`), the default behavior is toset this PaymentMethod as the preferred method. If you do not wish this to be the preferredmethod, you can set `DoNotUpdatePaymentTypePreference` to `true`. Otherwise, this can beomitted or `false`.For non 'on-file' PaymentMethods, this setting is ignored.
*/
// @ApiMember(Description="When adding a PaymentMethod that is 'on-file' (`IsTemp == true`), the default behavior is to\r\nset this PaymentMethod as the preferred method. If you do not wish this to be the preferred\r\nmethod, you can set `DoNotUpdatePaymentTypePreference` to `true`. Otherwise, this can be\r\nomitted or `false`.\r\n\r\nFor non 'on-file' PaymentMethods, this setting is ignored.")
public var doNotUpdatePaymentTypePreference:Bool
/**
* **Conditionally Required** When importing a ProfileToken with an OwnerType of `TempStUser`, the ownership will be changed toOwnerType of `User` with the userId of the supplied `NewOwnerId`.This is needed when a PaymentMethod is created for a User that has not been selected or created, yet.
*/
// @ApiMember(Description="**Conditionally Required** \r\n\r\nWhen importing a ProfileToken with an OwnerType of `TempStUser`, the ownership will be changed to\r\nOwnerType of `User` with the userId of the supplied `NewOwnerId`.\r\n\r\nThis is needed when a PaymentMethod is created for a User that has not been selected or created, yet.")
public var newOwnerId:Int?
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case xForwardedFor
case apiKey
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)
xForwardedFor = try container.decodeIfPresent(String.self, forKey: .xForwardedFor)
apiKey = try container.decodeIfPresent(String.self, forKey: .apiKey)
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 xForwardedFor != nil { try container.encode(xForwardedFor, forKey: .xForwardedFor) }
if apiKey != nil { try container.encode(apiKey, forKey: .apiKey) }
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 profileToken:String
public var doNotUpdatePaymentTypePreference:Bool
public var newOwnerId:Int?
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 : IFullNameContainer, 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 .csv suffix or ?format=csv
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: www.clubready.com
Accept: text/csv
Content-Type: text/csv
Content-Length: length
{"XForwardedFor":"String","ApiKey":"String","ProfileToken":"String","DoNotUpdatePaymentTypePreference":false,"NewOwnerId":0}
HTTP/1.1 200 OK Content-Type: text/csv 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-01T00:00:00.0000000","OnHoldReasonCode":0,"OnHoldReasonDetail":"String","AcctUpdaterFlagUtc":"0001-01-01T00:00:00.0000000","CreatedBy":0,"CreatedUtc":"0001-01-01T00:00:00.0000000","ModifiedBy":0,"ModifiedUtc":"0001-01-01T00:00:00.0000000","AcctUpdaterFlag":false,"EntryModeId":0,"ExcludeFromAcctUpdater":false}}