ClubReady Api

<back to all web services

ContractSoldEndpoint

The following routes are available for this service:
POST/sales/contract/soldSell a package to an existing userSell 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.* When using Query String values (or this web site), this value must be encoded with JSV [(JSON-like Separated Values)](https://docs.servicestack.net/jsv-format). * Basic steps to convert JSON to JSV: 1) Remove properties that are null 2) Remove white space including line feeds 3) Remove quotes.
System.IO.InvalidDataException: MetaData is potentially malicious. Expected scalar value, Received: An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use the
Preferred 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 optional
and 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 approves
for $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 json
based, 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 an
unspecified 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}]`).
   at ServiceStack.NativeTypes.VbNet.VbNetGeneratorExtensions.SafeValue(String value) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 791
   at ServiceStack.NativeTypes.VbNet.VbNetGeneratorExtensions.QuotedSafeValue(String value) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 796
   at ServiceStack.NativeTypes.VbNet.VbNetGenerator.TypeValue(String type, String value) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 589
   at ServiceStack.NativeTypes.VbNet.VbNetGenerator.AppendAttributes(StringBuilderWrapper sb, List`1 attributes) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 560
   at ServiceStack.NativeTypes.VbNet.VbNetGenerator.AddProperties(StringBuilderWrapper sb, MetadataType type, Boolean includeResponseStatus) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 483
   at ServiceStack.NativeTypes.VbNet.VbNetGenerator.AppendType(StringBuilderWrapper& sb, MetadataType type, String lastNS, List`1 allTypes, CreateTypeOptions options) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 402
   at ServiceStack.NativeTypes.VbNet.VbNetGenerator.GetCode(MetadataTypes metadata, IRequest request, INativeTypesMetadata nativeTypes) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/VbNet/VbNetGenerator.cs:line 269
   at ServiceStack.NativeTypes.LangGeneratorExtensions.g__Generate|1_0(ILangGenerator gen, <>c__DisplayClass1_0& ) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/ILangGenerator.cs:line 40
   at ServiceStack.NativeTypes.LangGeneratorExtensions.GenerateSourceCode(MetadataTypes metadataTypes, MetadataTypesConfig typesConfig, String lang, IRequest req, Action`1 configure) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/ILangGenerator.cs:line 51
   at ServiceStack.NativeTypes.LangGeneratorExtensions.GenerateSourceCode(List`1 metadataTypes, String lang, IRequest req, Action`1 configure) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/NativeTypes/ILangGenerator.cs:line 26
   at ServiceStack.Metadata.BaseMetadataHandler.d__12.MoveNext() in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/Metadata/BaseMetadataHandler.cs:line 203

To override the Content-type in your clients, use the HTTP Accept Header, append the .csv suffix or ?format=csv

HTTP + CSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /sales/contract/sold HTTP/1.1 
Host: www.clubready.com 
Accept: text/csv
Content-Type: text/csv
Content-Length: length

{"XForwardedFor":"String","ApiKey":"String","MemberId":0,"ChainId":0,"StoreId":0,"PackageId":0,"InstallmentId":0,"StartDate":"0001-01-01T00:00:00.0000000","PaymentAmount":0,"PromoCode":"String","StaffId":0,"PaymentMethods":[{"AcctToken":"String","ProfileToken":"String","PaymentProfileId":"String","PaymentAmount":0,"UsePreferred":false,"DoNotUpdatePaymentTypePreference":false}],"RestrictedId":0,"RestrictedResourceType":"Chain"}
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Length: length

{"ContractSaleID":"String","description":"String","Success":false}