| 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 |
|---|
export class PaymentProfileImportRequest
{
public ProfileToken?: string;
public DoNotUpdatePaymentTypePreference: boolean;
public NewOwnerId?: number;
public constructor(init?: Partial<PaymentProfileImportRequest>) { (Object as any).assign(this, init); }
}
// @ApiResponse(Description="", ResponseType="typeof(ClubReady.Payments.PaymentProfileImportResponse)", StatusCode=200)
export class PaymentProfileImportEndpoint extends PaymentProfileImportRequest implements IApiKeyEndpoint
{
/**
* IP address of the end user
*/
// @ApiMember(Description="IP address of the end user", Name="X-Forwarded-For", ParameterType="header")
public XForwardedFor?: string;
/**
* API Authentication Key
*/
// @ApiMember(Description="API Authentication Key", IsRequired=true, ParameterType="query")
public ApiKey: string;
/**
* The ProfileToken JWT to import (see description above)
*/
// @ApiMember(Description="The ProfileToken JWT to import (see description above)", IsRequired=true)
public 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 DoNotUpdatePaymentTypePreference: boolean;
/**
* **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 NewOwnerId?: number;
public constructor(init?: Partial<PaymentProfileImportEndpoint>) { super(init); (Object as any).assign(this, init); }
}
export class PaymentProfile implements IFullNameContainer
{
public PaymentProfileId: number;
public AcctToken: string;
public OwnerId: number;
public OwnerTypeId: number;
public AcctTypeId: number;
public AcctClassId: number;
public PrefixName: string;
public FirstName: string;
public MiddleName: string;
public LastName: string;
public SuffixName: string;
public Address1: string;
public Address2: string;
public Urbanization: string;
public City: string;
public State: string;
public PostalCode: string;
public CountryCode: string;
public Last4: string;
public CcExpMonth?: number;
public CcExpYear?: number;
public IsTemp: boolean;
public IsDisabled: boolean;
public OnHoldUtc?: string;
public OnHoldReasonCode?: number;
public OnHoldReasonDetail: string;
public AcctUpdaterFlagUtc?: string;
public CreatedBy: number;
public CreatedUtc: string;
public ModifiedBy: number;
public ModifiedUtc: string;
public AcctUpdaterFlag: boolean;
public EntryModeId: number;
public ExcludeFromAcctUpdater: boolean;
public Preference: number;
public Nickname: string;
public constructor(init?: Partial<PaymentProfile>) { (Object as any).assign(this, init); }
}
export class PaymentProfileImportResponse
{
public Success: boolean;
public Message?: string;
public PaymentProfile?: PaymentProfile;
public constructor(init?: Partial<PaymentProfileImportResponse>) { (Object as any).assign(this, init); }
}
TypeScript PaymentProfileImportEndpoint DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=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
{
XForwardedFor: String,
ApiKey: String,
ProfileToken: String,
DoNotUpdatePaymentTypePreference: False,
NewOwnerId: 0
}
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,
Preference: 0,
Nickname: String
}
}