ClubReady Api

<back to all web services

SaleEndpoint

The following routes are available for this service:
POST/sales/agreement/saleComplete the sale of a package set up by /sales/agreement/addSell a package to an existing user. The PaymentMethods property is an array of objects describing how you want ClubReady to take payment while selling the PackageId/InstallmentPlanId. If omitted (or null), the preferred on-file profile will be used. The header `X-Forwarded-For` is required and should be set to the IP address of the end user.

// @DataContract
export class PaymentMethodDto
{
    // @DataMember
    public AcctToken?: string;

    // @DataMember
    public ProfileToken?: string;

    // @DataMember
    public PaymentProfileId?: string;

    // @DataMember
    public PaymentAmount?: number;

    // @DataMember
    public UsePreferred?: boolean;

    // @DataMember
    public DoNotUpdatePaymentTypePreference?: boolean;

    public constructor(init?: Partial<PaymentMethodDto>) { (Object as any).assign(this, init); }
}

export enum RestrictedResourceType
{
    Store = 'Store',
    Chain = 'Chain',
    User = 'User',
    Undefined = 'Undefined',
}

// @ApiResponse(Description="", ResponseType="typeof(ClubReady.Web.Api.Sales.Agreement.SaleResponse)", StatusCode=200)
export class SaleEndpoint implements IAgreementSaleEndpoint, IRestrictedApiRequest
{
    /**
    * IP address of the end user
    */
    // @ApiMember(Description="IP address of the end user", IsRequired=true, Name="X-Forwarded-For", ParameterType="header")
    public XForwardedFor: string;

    /**
    * Api Authentication Key
    */
    // @ApiMember(Description="Api Authentication Key", IsRequired=true, ParameterType="query")
    public ApiKey: string;

    /**
    * Member Id of the user buying the Package
    */
    // @ApiMember(Description="Member Id of the user buying the Package", IsRequired=true, ParameterType="query")
    public MemberId: number;

    public ChainId?: number;
    /**
    * Id of the store for the user
    */
    // @ApiMember(Description="Id of the store for the user", IsRequired=true)
    public StoreId: number;

    /**
    * IncompleteAgreementToken from Agreement/ContractText endpoint.
    */
    // @ApiMember(Description="IncompleteAgreementToken from Agreement/ContractText endpoint.", IsRequired=true)
    public IncompleteAgreementToken: string;

    /**
    * Amount being paid down, including tax
    */
    // @ApiMember(Description="Amount being paid down, including tax", IsRequired=true)
    public PaymentAmount: number;

    /**
    * Promo code to apply a discount.
    */
    // @ApiMember(Description="Promo code to apply a discount.")
    public PromoCode?: string;

    /**
    * Staff Id of salesperson who sold the agreement.
    */
    // @ApiMember(Description="Staff Id of salesperson who sold the agreement.")
    public StaffId?: number;

    /**
    * An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use thePreferred method for the total amount.Each object of the array may contain properties:| Property | Description || --- | --- || PaymentAmount | The maximum amount to be attempted for this PaymentMethod. When null or omitted, the remaining PaymentAmount will be attempted. || **Use only one of the following three** | **UsePreferred** or **AcctToken** or **ProfileToken [DoNotUpdatePaymentTypePreference]** || UsePreferred | Set to `true` to use the Preferred method, otherwise omit the value or set to `null` or `false` || AcctToken | The AcctToken to attempt payment || ProfileToken | When provided, a PaymentMethod will be created (this will prevent the requirement to call `/sales/paymentprofile/import`) || DoNotUpdatePaymentTypePreference | [Optional] When creating a PaymentMethod (ProfileToken), it is set as the preferred method. To not create as preferred, set `DoNotUpdatePaymentTypePreference` to `true`. (for more information, see `/sales/paymentprofile/import`) || | |Only one of `UsePreferred`, `AcctToken`, `ProfileToken` or is needed. `DoNotUpdatePaymentTypePreference` is optionaland only valid with `ProfileToken`.* Scenario #1: Sell $3 contract using an existing PaymentMethod (i.e. AcctToken) for $1 and the Preferred method for $2.JSON:```json{    ...    "PaymentAmount": 3.00,    "PaymentMethods": [        {            "PaymentAmount": "1.00",            "AcctToken": "eyJ..."        },        {            "PaymentAmount": "2.00",            "UsePreferred": true        }    ]}```JSV:```...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,AcctToken:eyJ...NdQ},{PaymentAmount:2.00,UsePreferred:true}]```* Scenario #2: Sell $3 contract using a new PaymentMethod (i.e. ProfileToken) for $1 and the Preferred method for the remaining.Note, the sum of the PaymentMethod's PaymentAmount ($4) is greater than the agreement amount ($3). PaymentAmount is the maximum amount.This allows the first PaymentMethod to decline or partially approve (common with gift cards). Therefore, if the first PaymentMethod approvesfor $0.75, the second will be attempted for $2.25.JSON:```json{     ...    "PaymentAmount": 3.00,    "PaymentMethods": [        {            "PaymentAmount": "1.00",            "ProfileToken": "eyJ..."        },        {            "PaymentAmount": "3.00",            "UsePreferred": true        }    ]}```JSV:```jsv...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,ProfileToken:eyj...NdQ},{PaymentAmount:3.00,UsePreferred:true}]```Notes:  * AcctTokens should not be parsed or persisted in the client application. They are currently jsonbased, but can be updated without notice.* ProfileToken is used to create a PaymentMethod in the ClubReady system. For more information, see `/sales/paymentprofile/import`.* If `PaymentMethods` is missing or `null`, the Preferred method will be used.* If a `PaymentMethods` `PaymentAmount` is not specified, the remaining amount will be attempted.* If a PaymentMethod is partially approved (common for gift cards), the PaymentMethod with anunspecified PaymentAmount will be charged the remaining amount, including the unapproved amount not.* When testing with this website, the PaymentMethods textbox needs JSV and only the square brackets and contents(e.g. `[{PaymentAmount:1.00,UsePreferred:true}]`).
    */
    // @ApiMember(Description="An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use the\r\nPreferred method for the total amount.\r\n\r\nEach object of the array may contain properties:\r\n\r\n| Property | Description |\r\n| --- | --- |\r\n| PaymentAmount | The maximum amount to be attempted for this PaymentMethod. When null or omitted, the remaining PaymentAmount will be attempted. |\r\n| **Use only one of the following three** | **UsePreferred** or **AcctToken** or **ProfileToken [DoNotUpdatePaymentTypePreference]** |\r\n| UsePreferred | Set to `true` to use the Preferred method, otherwise omit the value or set to `null` or `false` |\r\n| AcctToken | The AcctToken to attempt payment |\r\n| ProfileToken | When provided, a PaymentMethod will be created (this will prevent the requirement to call `/sales/paymentprofile/import`) |\r\n| DoNotUpdatePaymentTypePreference | [Optional] When creating a PaymentMethod (ProfileToken), it is set as the preferred method. To not create as preferred, set `DoNotUpdatePaymentTypePreference` to `true`. (for more information, see `/sales/paymentprofile/import`) |\r\n| | |\r\n\r\nOnly one of `UsePreferred`, `AcctToken`, `ProfileToken` or is needed. `DoNotUpdatePaymentTypePreference` is optional\r\nand only valid with `ProfileToken`.\r\n\r\n* Scenario #1: Sell $3 contract using an existing PaymentMethod (i.e. AcctToken) for $1 and the Preferred method for $2.\r\n\r\nJSON:\r\n```json\r\n{\r\n    ...\r\n    \"PaymentAmount\": 3.00,\r\n    \"PaymentMethods\": [\r\n        {\r\n            \"PaymentAmount\": \"1.00\",\r\n            \"AcctToken\": \"eyJ...\"\r\n        },\r\n        {\r\n            \"PaymentAmount\": \"2.00\",\r\n            \"UsePreferred\": true\r\n        }\r\n    ]\r\n}\r\n```\r\nJSV:\r\n```\r\n...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,AcctToken:eyJ...NdQ},{PaymentAmount:2.00,UsePreferred:true}]\r\n```\r\n\r\n* Scenario #2: Sell $3 contract using a new PaymentMethod (i.e. ProfileToken) for $1 and the Preferred method for the remaining.\r\nNote, the sum of the PaymentMethod's PaymentAmount ($4) is greater than the agreement amount ($3). PaymentAmount is the maximum amount.\r\nThis allows the first PaymentMethod to decline or partially approve (common with gift cards). Therefore, if the first PaymentMethod approves\r\nfor $0.75, the second will be attempted for $2.25.\r\n\r\nJSON:\r\n```json\r\n{ \r\n    ...\r\n    \"PaymentAmount\": 3.00,\r\n    \"PaymentMethods\": [\r\n        {\r\n            \"PaymentAmount\": \"1.00\",\r\n            \"ProfileToken\": \"eyJ...\"\r\n        },\r\n        {\r\n            \"PaymentAmount\": \"3.00\",\r\n            \"UsePreferred\": true\r\n        }\r\n    ]\r\n}\r\n```\r\nJSV:\r\n```jsv\r\n...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,ProfileToken:eyj...NdQ},{PaymentAmount:3.00,UsePreferred:true}]\r\n```\r\n\r\nNotes:  \r\n\r\n* AcctTokens should not be parsed or persisted in the client application. They are currently json\r\nbased, but can be updated without notice.\r\n\r\n* ProfileToken is used to create a PaymentMethod in the ClubReady system. For more information, \r\nsee `/sales/paymentprofile/import`.\r\n\r\n* If `PaymentMethods` is missing or `null`, the Preferred method will be used.\r\n\r\n* If a `PaymentMethods` `PaymentAmount` is not specified, the remaining amount will be attempted.\r\n\r\n* If a PaymentMethod is partially approved (common for gift cards), the PaymentMethod with an\r\nunspecified PaymentAmount will be charged the remaining amount, including the unapproved amount not.\r\n\r\n* When testing with this website, the PaymentMethods textbox needs JSV and only the square brackets and contents\r\n(e.g. `[{PaymentAmount:1.00,UsePreferred:true}]`).")
    public PaymentMethods?: PaymentMethodDto[];

    public RestrictedId?: number;
    public RestrictedResourceType: RestrictedResourceType;

    public constructor(init?: Partial<SaleEndpoint>) { (Object as any).assign(this, init); }
}

export class ApiResponse2Base
{
    public success: boolean;
    public message?: string;

    public constructor(init?: Partial<ApiResponse2Base>) { (Object as any).assign(this, init); }
}

export class SaleResponse extends ApiResponse2Base
{

    public constructor(init?: Partial<SaleResponse>) { super(init); (Object as any).assign(this, init); }
}

TypeScript SaleEndpoint 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/agreement/sale HTTP/1.1 
Host: www.clubready.com 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	XForwardedFor: String,
	ApiKey: String,
	MemberId: 0,
	ChainId: 0,
	StoreId: 0,
	IncompleteAgreementToken: String,
	PaymentAmount: 0,
	PromoCode: String,
	StaffId: 0,
	PaymentMethods: 
	[
		{
			AcctToken: String,
			ProfileToken: String,
			PaymentProfileId: String,
			PaymentAmount: 0,
			UsePreferred: False,
			DoNotUpdatePaymentTypePreference: False
		}
	],
	RestrictedId: 0,
	RestrictedResourceType: Store
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	success: False,
	message: String
}