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 |
---|
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
using ServiceStack;
using ServiceStack.DataAnnotations;
using ClubReady.Web.Api.Sales;
using ClubReady.Payments;
using ClubReady.Payments.PaymentsDb;
namespace ClubReady.Payments
{
public partial class PaymentProfileImportRequest
{
public virtual string ProfileToken { get; set; }
public virtual bool DoNotUpdatePaymentTypePreference { get; set; }
public virtual int? NewOwnerId { get; set; }
}
public partial class PaymentProfileImportResponse
{
public virtual bool Success { get; set; }
public virtual string Message { get; set; }
public virtual PaymentProfile PaymentProfile { get; set; }
}
}
namespace ClubReady.Payments.PaymentsDb
{
public partial class PaymentProfile
: IFullNameContainer
{
public virtual int PaymentProfileId { get; set; }
public virtual string AcctToken { get; set; }
public virtual int OwnerId { get; set; }
public virtual short OwnerTypeId { get; set; }
public virtual short AcctTypeId { get; set; }
public virtual short AcctClassId { get; set; }
public virtual string PrefixName { get; set; }
public virtual string FirstName { get; set; }
public virtual string MiddleName { get; set; }
public virtual string LastName { get; set; }
public virtual string SuffixName { get; set; }
public virtual string Address1 { get; set; }
public virtual string Address2 { get; set; }
public virtual string Urbanization { get; set; }
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string PostalCode { get; set; }
public virtual string CountryCode { get; set; }
public virtual string Last4 { get; set; }
public virtual byte? CcExpMonth { get; set; }
public virtual byte? CcExpYear { get; set; }
public virtual bool IsTemp { get; set; }
public virtual bool IsDisabled { get; set; }
public virtual DateTime? OnHoldUtc { get; set; }
public virtual byte? OnHoldReasonCode { get; set; }
public virtual string OnHoldReasonDetail { get; set; }
public virtual DateTime? AcctUpdaterFlagUtc { get; set; }
public virtual int CreatedBy { get; set; }
public virtual DateTime CreatedUtc { get; set; }
public virtual int ModifiedBy { get; set; }
public virtual DateTime ModifiedUtc { get; set; }
public virtual bool AcctUpdaterFlag { get; set; }
public virtual short EntryModeId { get; set; }
public virtual bool ExcludeFromAcctUpdater { get; set; }
}
}
namespace ClubReady.Web.Api.Sales
{
[ApiResponse(Description="", ResponseType=typeof(ClubReady.Payments.PaymentProfileImportResponse), StatusCode=200)]
public partial class PaymentProfileImportEndpoint
: PaymentProfileImportRequest, IApiKeyEndpoint
{
///<summary>
///IP address of the end user
///</summary>
[ApiMember(Description="IP address of the end user", Name="X-Forwarded-For", ParameterType="header")]
public virtual string XForwardedFor { get; set; }
///<summary>
///API Authentication Key
///</summary>
[ApiMember(Description="API Authentication Key", IsRequired=true, ParameterType="query")]
public virtual string ApiKey { get; set; }
///<summary>
///The ProfileToken JWT to import (see description above)
///</summary>
[ApiMember(Description="The ProfileToken JWT to import (see description above)", IsRequired=true)]
public virtual string ProfileToken { get; set; }
///<summary>
///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.
///</summary>
[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 virtual bool DoNotUpdatePaymentTypePreference { get; set; }
///<summary>
///**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.
///</summary>
[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 virtual int? NewOwnerId { get; set; }
}
}
C# PaymentProfileImportEndpoint DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .xml suffix or ?format=xml
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: application/xml
Content-Type: application/xml
Content-Length: length
<PaymentProfileImportEndpoint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Web.Api.Sales">
<DoNotUpdatePaymentTypePreference xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments">false</DoNotUpdatePaymentTypePreference>
<NewOwnerId xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments">0</NewOwnerId>
<ProfileToken xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments">String</ProfileToken>
<ApiKey>String</ApiKey>
<XForwardedFor>String</XForwardedFor>
</PaymentProfileImportEndpoint>
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: length <PaymentProfileImportResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments"> <Message>String</Message> <PaymentProfile xmlns:d2p1="http://schemas.datacontract.org/2004/07/ClubReady.Payments.PaymentsDb"> <d2p1:AcctClassId>0</d2p1:AcctClassId> <d2p1:AcctToken>String</d2p1:AcctToken> <d2p1:AcctTypeId>0</d2p1:AcctTypeId> <d2p1:AcctUpdaterFlag>false</d2p1:AcctUpdaterFlag> <d2p1:AcctUpdaterFlagUtc>0001-01-01T00:00:00</d2p1:AcctUpdaterFlagUtc> <d2p1:Address1>String</d2p1:Address1> <d2p1:Address2>String</d2p1:Address2> <d2p1:CcExpMonth>0</d2p1:CcExpMonth> <d2p1:CcExpYear>0</d2p1:CcExpYear> <d2p1:City>String</d2p1:City> <d2p1:CountryCode>String</d2p1:CountryCode> <d2p1:CreatedBy>0</d2p1:CreatedBy> <d2p1:CreatedUtc>0001-01-01T00:00:00</d2p1:CreatedUtc> <d2p1:EntryModeId>0</d2p1:EntryModeId> <d2p1:ExcludeFromAcctUpdater>false</d2p1:ExcludeFromAcctUpdater> <d2p1:FirstName>String</d2p1:FirstName> <d2p1:IsDisabled>false</d2p1:IsDisabled> <d2p1:IsTemp>false</d2p1:IsTemp> <d2p1:Last4>String</d2p1:Last4> <d2p1:LastName>String</d2p1:LastName> <d2p1:MiddleName>String</d2p1:MiddleName> <d2p1:ModifiedBy>0</d2p1:ModifiedBy> <d2p1:ModifiedUtc>0001-01-01T00:00:00</d2p1:ModifiedUtc> <d2p1:OnHoldReasonCode>0</d2p1:OnHoldReasonCode> <d2p1:OnHoldReasonDetail>String</d2p1:OnHoldReasonDetail> <d2p1:OnHoldUtc>0001-01-01T00:00:00</d2p1:OnHoldUtc> <d2p1:OwnerId>0</d2p1:OwnerId> <d2p1:OwnerTypeId>0</d2p1:OwnerTypeId> <d2p1:PaymentProfileId>0</d2p1:PaymentProfileId> <d2p1:PostalCode>String</d2p1:PostalCode> <d2p1:PrefixName>String</d2p1:PrefixName> <d2p1:State>String</d2p1:State> <d2p1:SuffixName>String</d2p1:SuffixName> <d2p1:Urbanization>String</d2p1:Urbanization> </PaymentProfile> <Success>false</Success> </PaymentProfileImportResponse>