Search historical payouts
Overview
Use the searchPayouts method to extract information on the historical payouts issued by 2Checkout for your account.
You can retrieve information on the payment for a specific invoice, or search based on numerous filters such as payment status, transfer date, or payout method.
Search filters
| Parameters | Type/Description |
|---|---|
| Reference |
Optional/String InvoicePrefix (PREFIX) + InvoiceNo (00000) will search for transfers containing an invoice with prefix + number. The invoice reference is generated by 2Checkout and can be found in the Accounting area from your Control Panel. |
| Status |
Optional/Array of strings Possible payout statuses:
|
| Currency |
Optional/String 3 letter ISO currency code. |
| StartDate |
Optional/String Start payment date. Format: Yyyy-mm-dd. |
| EndDate |
Optional/String End payment date. Format: Yyyy-mm-dd. |
| PaymentType |
Optional/String Possible payout methods:
|
| OrderBy |
Optional/Array of objects Details below |
| Field |
String Variable used for ordering the returned data. Possible values:
|
| Direction |
String Order direction. Possible values:
|
| Pagination |
Optional/Object Use this object for paginating the results. Default behavior is to display 10 results per page. |
| Page |
Integer Number of pages used for displaying results. |
| Limit |
Integer Limit the number of results. |
Request
<?php
require('PATH_TO_AUTH');
$SearchOptions = new stdClass();
//$SearchOptions->Reference = 'FBV8572'; // search for a specific invoice
$SearchOptions->Status = ['PAID', 'CANCELED'];
$SearchOptions->Currency = 'USD';
$SearchOptions->StartDate = '2018-05-01';
$SearchOptions->EndDate = '2018-06-01';
$SearchOptions->PaymentType = 'WIRE';
$SearchOptions->OrderBy = [];
$orderBy = new stdClass();
$orderBy->Field = 'TransferCompletionDate';
$orderBy->Direction = 'DESC';
$SearchOptions->OrderBy[] = $orderBy;
$SearchOptions->Pagination = new stdClass();
//$SearchOptions->Pagination->Page = 1;
//$SearchOptions->Pagination->Limit = 200;
$jsonRpcRequest = array(
'jsonrpc' => '2.0',
'method' => 'searchPayouts',
'params' => array($sessionID, $SearchOptions),
'id' => $i++
);
var_dump("AccountPayouts", callRPC((Object)$jsonRpcRequest, $host));
Response
Historical payout object
| Parameters | Type/Description | |
|---|---|---|
| Items |
Array of objects Details below |
|
| PaymentInstance |
Object Details below |
|
| TransferCompletionDate | String | |
| Payment date. Format: Yyyy-mm-dd. | ||
| PaymentType | String | |
|
Payout method used for the transfer. Possible values:
|
||
| Amount | Float | |
| Amount transferred. Can be negative, for invoices deducted from your payment. | ||
| Currency | String | |
| Currency in which the amount was transferred. Three letters ISO currency code. | ||
| Status | String | |
|
Payment status. Possible values:
|
||
| Invoices |
Array of objects An object is created for each invoice part of the payment. |
|
| Reference | String | |
| System generated invoice reference. Formed by InvoicePrefix (PREFIX) + InvoiceNo (00000). | ||
| Amount | Float | |
| Invoice amount. | ||
| Description | String | |
| Comments submitted on the invoice. | ||
| Type | String | |
|
Invoice type. Possible values:
|
||
| Code | String | |
|
Code used for identifying the invoice type. Possible values:
|
||
| Date | String | |
| Date the invoice was generated. | ||
| PaidAmount | Float | |
| Invoice amount paid on this transfer. | ||
| PaidDate | String | |
| Transfer date. | ||
| PaidCurrency | String | |
| Currency of the transfer. | ||
| Summary |
Object A summary of all the invoices included in this transfer. |
|
| ServicesAmount | Float | |
| Amount paid or retained for 2Checkout service invoices. | ||
| PurchaseOrdersAmount | Float | |
| Amount paid for purchase orders. | ||
| ChargeBacksAmount | Float | |
| Amount paid for chargebacks retained and released. | ||
| RollingReserveAmount | Float | |
| Amount paid for rolling reserves. | ||
| PeriodNetSales | Float | |
| Amount paid for period net sales. | ||
| VendorToVendor | Float | |
| Amount paid for vendor 2 vendor invoices. | ||
| ChargeBackFund | Float | |
| Amount paid for the chargeback fund. | ||
| Pagination |
Object Details below |
|
| Page | Integer | |
| Number of pages used for displaying the results. | ||
| Limit | Integer | |
| Limitation of the result numbers. | ||
| Count | Integer | |
| Total number of results. | ||
Retrieve session content
Overview
Use the getContents method to get info on all the products added to cart by the shopper in the current session.
Products added in cart can be either defined in your catalog, or created with dynamic information.
Parameters
| Parameters | Type/Description |
|---|---|
|
sessionID |
Required (string) |
|
|
Session identifier, the output of the Login method. Include sessionID into all your requests. 2Checkout throws an exception if the values are incorrect. The sessionID expires in 10 minutes. |
|
Required (Object) |
|
|
|
Object designed to collect all data necessary for an order, including billing, product/subscription plan and payment details. |
Response
| Parameters | Type/Description |
|---|---|
| SessionContents | Object |
Request
<?php
require('PATH_TO_AUTH');
$Order = new stdClass();
$Order->RefNo = NULL;
$Order->Currency = 'usd';
$Order->Country = 'US';
$Order->Language = 'en';
$Order->CustomerIP = '91.220.121.21';
$Order->ExternalReference = NULL;
$Order->Source = NULL;
$Order->AffiliateId = NULL;
$Order->CustomerReference = NULL;
$Order->Items = array();
$Order->Items[0] = new stdClass();
$Order->Items[0]->Code = 'my_subscription_1'; // you can also send products with dynamic information
$Order->Items[0]->Quantity = 1;
$Order->Items[0]->PriceOptions = NULL;
$Order->Items[0]->SKU = NULL;
$Order->Items[0]->Price = NULL;
$Order->Items[0]->CrossSell = NULL;
$Order->Items[0]->Trial = false;
$Order->Items[0]->AdditionalFields = NULL;
$Order->Items[0]->Promotion = NULL;
$Order->BillingDetails = new stdClass();
$Order->BillingDetails->FirstName = 'FirstName';
$Order->BillingDetails->LastName = 'LastName';
$Order->BillingDetails->CountryCode = 'us';
$Order->BillingDetails->State = 'California';
$Order->BillingDetails->City = 'LA';
$Order->BillingDetails->Address1 = 'Address example';
$Order->BillingDetails->Address2 = NULL;
$Order->BillingDetails->Zip = '90210';
$Order->BillingDetails->Email = 'customer@email.com';
$Order->BillingDetails->Phone = NULL;
$Order->BillingDetails->Company = NULL;
$Order->DeliveryDetails = NULL;
$Order->PaymentDetails = new stdClass ();
$Order->PaymentDetails->Type = 'CC';
$Order->PaymentDetails->Currency = 'usd';
$Order->PaymentDetails->PaymentMethod = new stdClass ();
$Order->PaymentDetails->CustomerIP = '10.10.10.10';
$Order->PaymentDetails->PaymentMethod->RecurringEnabled = true;
$Order->PaymentDetails->PaymentMethod->CardNumber = "4111111111111111";
$Order->PaymentDetails->PaymentMethod->CardType = 'visa';
$Order->PaymentDetails->PaymentMethod->ExpirationYear = '2019';
$Order->PaymentDetails->PaymentMethod->ExpirationMonth = '12';
$Order->PaymentDetails->PaymentMethod->HolderName = 'John';
$Order->PaymentDetails->PaymentMethod->CCID = '123';
$Order->AdditionalFields = NULL;
$Order->LocalTime = NULL;
$Order->GiftDetails = NULL;
try {
$CartContents = $client->getContents ($sessionID, $Order);
}
catch (SoapFault $e) {
echo "CartContents: " . $e->getMessage();
exit;
}
var_dump("CartContents", $CartContents);
?>
Single Sign On in cart
Overview
Use the getSingleSignOnInCart method. Avangate attaches a unique token to links, designed to identify the returning shoppers and support the automatic extraction of payment data and billing information from the Avangate system. For example, you can generate single sign on in cart links for existing customers logged into your website based on their external or Avangate customer IDs.
How does this work?
When accessing the shopping cart using tokenized payment links:
- Avangate prefills automatically customer billing and delivery details associated with their Avangate customer accounts (linked based on their unique customer IDs).
- Avangate presents shoppers with an optimized payment area featuring the credit / debit cards used to make previous purchases / transactions in the Avangate system. Customers have the option of selecting one of the payment methods depending on available card-on-file data.
Parameters
| Parameters | Type/Description |
|---|---|
|
sessionID |
Required (string) |
|
|
Session identifier, the output of the Login method. Include sessionID into all your requests. Avangate throws an exception if the values are incorrect. The sessionID expires in 10 minutes. |
|
Customer |
Required (string) |
|
Unique customer identifiers. Can be either the ExternalCustomerReference you control or the system-generated AvangateCustomerReference. |
|
|
customerType |
Required (string) |
|
|
Possible values:
|
|
url |
Required (string) |
|
|
The shopping cart URL. Avangate redirects shoppers to this URL.
Possible values:
Any buy link you generate from the cPanel or using the API. Note: For the time being, payment tokenization does not support Express Payments Checkout or the Avangate mobile shopping cart. |
|
validityTime |
Optional (int) |
|
|
The time, in seconds, before the single sign-on URL expires. By default, the URL expires after 10 seconds. (optional) |
|
validationIp |
Optional (string) |
|
|
The IP address of the shopper, necessary for security purposes. Can be an empty string or a valid IP, or null. |
Response
| Parameters | Type/Description |
|---|---|
|
Single sign-on URL |
String |
|
The generated string is the tokenized time-limited single sign-on URL pointing to Avangate shopping cart.
Note: Each SSO link cleans any previous cart sessions. Shoppers using multiple SSO links would purchase only a single product at a time.
If shoppers add multiple products to cart via SSO buy links and then use a non-SSO link, they’ll purchase all items using the same order. When you use single sign on in cart for customers without card on files in the Avangate system, the generated tokenized link prefills the billing information but the purchase process requires that shoppers provide payment information, such as a credit or debit card.
Important! You can use the value of the logintoken to retrieve customer information by SSO token.
|
Request
<?php
require ('PATH_TO_AUTH');
$idCustomer = '352365983';
$customerType = 'AvangateCustomerReference';
$url = 'https://store.avancart.com/order/checkout.php?PRODS=4639321&QTY=1&CART=1&CARD=2';
$validityTime = 50;
$validationIp = null;
$jsonRpcRequest = array (
'method' => 'getSingleSignOnInCart',
'params' => array($sessionID, $idCustomer, $customerType, $url, $validityTime, $validationIp),
'id' => $i++,
'jsonrpc' => '2.0');
var_dump (callRPC((Object)$jsonRpcRequest, $host, true));
Next renewal price
Overview
Retrieve the costs of the next subscription renewal.
Attributes
| Parameters | Type/Description |
|---|---|
|
NetPrice |
Double |
|
|
Price without taxes |
|
NetCurrency |
String |
|
|
Currency for the price without taxes. The currency ISO code used for the payment - ISO 4217. |
|
FinalPrice |
Double |
|
|
Price with taxes |
|
FinalCurrency |
String |
|
|
Currency used for prices with taxes. The currency ISO code used for the payment - ISO 4217. |
Create price option groups
Overview
Use the addPriceOptionGroup method to create price options for your subscription plans/products.
- Send options for each pricing grouo or 2Checkout throws an exception.
- When adding an interval with no min / max values or overlapping values, 2Checkout throws an exception.
Parameters
| Parameters | Type/Description |
|---|---|
|
sessionID |
Required (string) |
|
|
Session identifier, the output of the Login method. Include sessionID into all your requests. 2Checkout throws an exception if the values are incorrect. The sessionID expires in 10 minutes. |
|
Required (object) |
|
|
|
Use this object to create a new price option group for your account. |
Response
bool(true)
Request
<?php
require ('PATH_TO_AUTH');
$PriceOptionGroup = new stdClass();
$PriceOptionGroup->Name = 'New Multi Users';
$PriceOptionGroup->Description = 'Quos aut ipsam ipsum omnis aut molestiae. Et quod molestias distinctio. Fugiat sit asperiores reprehenderit officia eaque quae quia. Aperiam quia quia illo eos nesciunt accusamus.';
$PriceOptionGroup->Translations = array();
$PriceOptionGroup->Translations[0] = new stdClass();
$PriceOptionGroup->Translations[0]->Name = 'xdrki7ljix';
$PriceOptionGroup->Translations[0]->Description = 'Beatae doloribus ipsam voluptatem et. Iure dignissimos non amet. Quibusdam fugiat dolor repudiandae temporibus harum.';
$PriceOptionGroup->Translations[0]->Language = 'en';
$PriceOptionGroup->Translations[1] = new stdClass();
$PriceOptionGroup->Translations[1]->Name = '37wr8ie2dj';
$PriceOptionGroup->Translations[1]->Description = 'Esse distinctio voluptatibus omnis et et quia dolor. Quibusdam dicta dolores odio consequatur velit voluptate. Laboriosam reiciendis libero vel quae molestiae ad.';
$PriceOptionGroup->Translations[1]->Language = 'ru';
$PriceOptionGroup->Type = 'RADIO';
$PriceOptionGroup->Options = array();
$PriceOptionGroup->Options[0] = new stdClass();
$PriceOptionGroup->Options[0]->Name = 'SingleUser';
$PriceOptionGroup->Options[0]->Description = 'Nisi ea autem a labore similique. Minus natus cumque nemo. Aut aliquam laboriosam dolorem ad.';
$PriceOptionGroup->Options[0]->Translations = array();
$PriceOptionGroup->Options[0]->Translations[0] = new stdClass();
$PriceOptionGroup->Options[0]->Translations[0]->Name = '0q2r3kcj0q';
$PriceOptionGroup->Options[0]->Translations[0]->Description = 'Voluptatem in vitae rerum ea tempore. Non cumque ullam optio quis. Laborum maxime sunt facere. Dolor fugit a fugiat quasi facere totam.';
$PriceOptionGroup->Options[0]->Translations[0]->Language = 'en';
$PriceOptionGroup->Options[0]->Translations[1] = new stdClass();
$PriceOptionGroup->Options[0]->Translations[1]->Name = 'dwfxuw4lrn';
$PriceOptionGroup->Options[0]->Translations[1]->Description = 'Debitis omnis maiores quia praesentium totam error corrupti. Consectetur eum magnam quam vero. Sit aperiam natus perspiciatis iusto sint ut fugit. Adipisci illum non voluptatem voluptas.';
$PriceOptionGroup->Options[0]->Translations[1]->Language = 'it';
$PriceOptionGroup->Options[0]->Code = 'singleuser1';
$PriceOptionGroup->Options[0]->SubscriptionImpact = new stdClass();
$PriceOptionGroup->Options[0]->SubscriptionImpact->Impact = 'Add';
$PriceOptionGroup->Options[0]->SubscriptionImpact->Months = 1;
$PriceOptionGroup->Options[0]->PriceImpact = new stdClass();
$PriceOptionGroup->Options[0]->PriceImpact->Method = 'FIXED';
$PriceOptionGroup->Options[0]->PriceImpact->Amounts = array();
$PriceOptionGroup->Options[0]->PriceImpact->Amounts[0] = new stdClass();
$PriceOptionGroup->Options[0]->PriceImpact->Amounts[0]->Currency = 'USD';
$PriceOptionGroup->Options[0]->PriceImpact->Amounts[0]->Amount = 90.61;
$PriceOptionGroup->Options[0]->PriceImpact->Amounts[1] = new stdClass();
$PriceOptionGroup->Options[0]->PriceImpact->Amounts[1]->Currency = 'EUR';
$PriceOptionGroup->Options[0]->PriceImpact->Amounts[1]->Amount = 6.70;
$PriceOptionGroup->Options[0]->PriceImpact->ImpactOn = 'BASE';
$PriceOptionGroup->Options[0]->PriceImpact->Impact = 'ADD';
$PriceOptionGroup->Options[0]->PriceImpact->Percent = 39;
$PriceOptionGroup->Options[0]->Default = false;
$PriceOptionGroup->Options[1] = new stdClass();
$PriceOptionGroup->Options[1]->Name = 'MultiUser';
$PriceOptionGroup->Options[1]->Description = 'Vero voluptatum fuga et repellendus sed qui. Dolores molestiae error non ad aperiam. In error quos eum quas repudiandae pariatur et suscipit.';
$PriceOptionGroup->Options[1]->Translations = array();
$PriceOptionGroup->Options[1]->Translations[0] = new stdClass();
$PriceOptionGroup->Options[1]->Translations[0]->Name = 'MultiUser';
$PriceOptionGroup->Options[1]->Translations[0]->Description = 'Debitis et saepe facere blanditiis. Tempore et nemo aut ullam possimus ipsum nisi. Ad libero et consequuntur aliquam libero. Rerum aut illum eveniet earum.';
$PriceOptionGroup->Options[1]->Translations[0]->Language = 'en';
$PriceOptionGroup->Options[1]->Translations[1] = new stdClass();
$PriceOptionGroup->Options[1]->Translations[1]->Name = 'dw5zgkcki9';
$PriceOptionGroup->Options[1]->Translations[1]->Description = 'Vel et excepturi veniam. In iusto eveniet pariatur hic labore. Et qui dolorem accusantium molestias iusto.';
$PriceOptionGroup->Options[1]->Translations[1]->Language = 'pt';
$PriceOptionGroup->Options[1]->Code = 'multiuser999';
$PriceOptionGroup->Options[1]->SubscriptionImpact = new stdClass();
$PriceOptionGroup->Options[1]->SubscriptionImpact->Impact = 'ADD';
$PriceOptionGroup->Options[1]->SubscriptionImpact->Months = 2;
$PriceOptionGroup->Options[1]->PriceImpact = new stdClass();
$PriceOptionGroup->Options[1]->PriceImpact->Method = 'FIXED';
$PriceOptionGroup->Options[1]->PriceImpact->Amounts = array();
$PriceOptionGroup->Options[1]->PriceImpact->Amounts[0] = new stdClass();
$PriceOptionGroup->Options[1]->PriceImpact->Amounts[0]->Currency = 'USD';
$PriceOptionGroup->Options[1]->PriceImpact->Amounts[0]->Amount = 65.03;
$PriceOptionGroup->Options[1]->PriceImpact->Amounts[1] = new stdClass();
$PriceOptionGroup->Options[1]->PriceImpact->Amounts[1]->Currency = 'EUR';
$PriceOptionGroup->Options[1]->PriceImpact->Amounts[1]->Amount = 64.58;
$PriceOptionGroup->Options[1]->PriceImpact->ImpactOn = 'BASE';
$PriceOptionGroup->Options[1]->PriceImpact->Impact = 'ADD';
$PriceOptionGroup->Options[1]->PriceImpact->Percent = 51;
$PriceOptionGroup->Options[1]->Default = true;
$PriceOptionGroup->Code = null;
$PriceOptionGroup->Required = false;
$jsonRpcRequest = array (
'jsonrpc' => '2.0',
'id' => $i++,
'method' => 'addPriceOptionGroup',
'params' => array($sessionID, $PriceOptionGroup)
);
var_dump (callRPC((Object)$jsonRpcRequest, $host, true));
?>
Pay-per-Usage
Use this option to create and assign PAYPERUSE price options to your portfolio.
For non PAYPERUSAGE cases, the Usage and UsagePricingModel fields are not required.
Request sample with PAYPERUSE
<?php
declare(strict_types=1);
class Configuration
{
public const MERCHANT_CODE = '';
public const MERCHANT_KEY = '';
public const URL = 'http://api.2checkout.com/rpc/6.0';
public const ACTION = 'addPriceOptionGroup';
public const ADDITIONAL_OPTIONS = null;
//array or JSON
public const PAYLOAD = <<<JSON
{
"Type": "INTERVAL",
"Code": "PayPerUsage-CODE",
"Required": false,
"Name": "Pay per usage pricing option group",
"Description": "Test option description",
"Usage": "PAYPERUSAGE",
"UsagePricingModel": "STEPPED",
"Options": [
{
"Code": "9876545678",
"ScaleMin": "1",
"ScaleMax": "9",
"SubscriptionImpact": {
"Months": "0.00",
"Impact": null
},
"PriceImpact": {
"Amounts": {
"USD": {
"Currency": "USD",
"Amount": "1.00"
},
"EUR": {
"Currency": "EUR",
"Amount": "6.00"
}
},
"ImpactOn": null,
"Method": "FIXED",
"Percent": null,
"Impact": null
},
"Default": false,
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Translations": [
{
"Name": "translation_5f90150268bf7",
"Description": "Translation value",
"Language": "RO"
},
{
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Language": "EN"
},
{
"Name": "translation_5f90150268bf9",
"Description": "Translation value",
"Language": "FR"
},
{
"Name": "translation_5f90150268bf5",
"Description": "Translation value",
"Language": "RU"
}
]
},
{
"Code": "98765456789",
"ScaleMin": "10",
"ScaleMax": "19",
"SubscriptionImpact": {
"Months": "0.00",
"Impact": null
},
"PriceImpact": {
"Amounts": {
"USD": {
"Currency": "USD",
"Amount": "1.00"
},
"EUR": {
"Currency": "EUR",
"Amount": "6.00"
}
},
"ImpactOn": null,
"Method": "FIXED",
"Percent": null,
"Impact": null
},
"Default": false,
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Translations": [
{
"Name": "translation_5f90150268bf7",
"Description": "Translation value",
"Language": "RO"
},
{
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Language": "EN"
},
{
"Name": "translation_5f90150268bf9",
"Description": "Translation value",
"Language": "FR"
},
{
"Name": "translation_5f90150268bf5",
"Description": "Translation value",
"Language": "RU"
}
]
}
],
"Translations": [
{
"Name": "Pay per usage pricing option group",
"Description": "Test option description",
"Language": "EN"
}
]
}
JSON;
}
class Client
{
private const LOGIN_METHOD = 'login';
private $calls = 1;
private $sessionId;
private function generateAuth(): array
{
$merchantCode = Configuration::MERCHANT_CODE;
$key = Configuration::MERCHANT_KEY;
$date = gmdate('Y-m-d H:i:s');
$string = strlen($merchantCode) . $merchantCode . strlen($date) . $date;
$hash = hash_hmac('md5', $string, $key);
return compact('merchantCode', 'date', 'hash');
}
public function login(string $url)
{
$payload = $this->generateAuth();
$response = $this->call($url, array_values($payload), self::LOGIN_METHOD);
$this->sessionId = $response['result'];
}
public function call(
string $url = Configuration::URL,
$payload = Configuration::PAYLOAD,
string $action = Configuration::ACTION
): ?array {
if (empty($this->sessionId) && $action !== self::LOGIN_METHOD) {
$this->login($url);
}
if(is_string($payload)) {
$payload = json_decode($payload, true);
}
if (!empty($this->sessionId)) {
$payload = [$this->sessionId, $payload, Configuration::ADDITIONAL_OPTIONS];
}
$payload = array_filter($payload);
$request = json_encode([
'jsonrpc' => '2.0',
'method' => $action,
'params' => $payload,
'id' => $this->calls++,
]);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSLVERSION, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json', 'Cookie: XDEBUG_SESSION=PHPSTORM'));
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
$response = curl_exec($curl);
if(empty($response)) {
die('Server unavailable');
}
echo $response . '</br>';
return json_decode($response, true);;
}
}
$client = new Client();
$result = $client->call();
var_dump($result);
Request sample without PAYPERUSE
<?php
declare(strict_types=1);
class Configuration
{
public const MERCHANT_CODE = '';
public const MERCHANT_KEY = '';
public const URL = 'http://api.2checkout.com/rpc/6.0';
public const ACTION = 'addPriceOptionGroup';
public const ADDITIONAL_OPTIONS = null;
//array or JSON
public const PAYLOAD = <<<JSON
{
"Type": "RADIO",
"Code": "RADIO-CODE",
"Required": false,
"Name": "Radio pricing option group",
"Description": "Test option description",
"Options": [
{
"Code": "9876545678",
"ScaleMin": "1",
"ScaleMax": "9",
"SubscriptionImpact": {
"Months": "0.00",
"Impact": null
},
"PriceImpact": {
"Amounts": {
"USD": {
"Currency": "USD",
"Amount": "1.00"
},
"EUR": {
"Currency": "EUR",
"Amount": "6.00"
}
},
"ImpactOn": null,
"Method": "FIXED",
"Percent": null,
"Impact": null
},
"Default": false,
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Translations": [
{
"Name": "translation_5f90150268bf7",
"Description": "Translation value",
"Language": "RO"
},
{
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Language": "EN"
},
{
"Name": "translation_5f90150268bf9",
"Description": "Translation value",
"Language": "FR"
},
{
"Name": "translation_5f90150268bf5",
"Description": "Translation value",
"Language": "RU"
}
]
},
{
"Code": "98765456789",
"ScaleMin": "10",
"ScaleMax": "19",
"SubscriptionImpact": {
"Months": "0.00",
"Impact": null
},
"PriceImpact": {
"Amounts": {
"USD": {
"Currency": "USD",
"Amount": "1.00"
},
"EUR": {
"Currency": "EUR",
"Amount": "6.00"
}
},
"ImpactOn": null,
"Method": "FIXED",
"Percent": null,
"Impact": null
},
"Default": false,
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Translations": [
{
"Name": "translation_5f90150268bf7",
"Description": "Translation value",
"Language": "RO"
},
{
"Name": "translation_5f90150268bef",
"Description": "Translation value",
"Language": "EN"
},
{
"Name": "translation_5f90150268bf9",
"Description": "Translation value",
"Language": "FR"
},
{
"Name": "translation_5f90150268bf5",
"Description": "Translation value",
"Language": "RU"
}
]
}
],
"Translations": [
{
"Name": "Radio pricing option group",
"Description": "Test option description",
"Language": "EN"
}
]
}
JSON;
}
class Client
{
private const LOGIN_METHOD = 'login';
private $calls = 1;
private $sessionId;
private function generateAuth(): array
{
$merchantCode = Configuration::MERCHANT_CODE;
$key = Configuration::MERCHANT_KEY;
$date = gmdate('Y-m-d H:i:s');
$string = strlen($merchantCode) . $merchantCode . strlen($date) . $date;
$hash = hash_hmac('md5', $string, $key);
return compact('merchantCode', 'date', 'hash');
}
public function login(string $url)
{
$payload = $this->generateAuth();
$response = $this->call($url, array_values($payload), self::LOGIN_METHOD);
$this->sessionId = $response['result'];
}
public function call(
string $url = Configuration::URL,
$payload = Configuration::PAYLOAD,
string $action = Configuration::ACTION
): ?array {
if (empty($this->sessionId) && $action !== self::LOGIN_METHOD) {
$this->login($url);
}
if(is_string($payload)) {
$payload = json_decode($payload, true);
}
if (!empty($this->sessionId)) {
$payload = [$this->sessionId, $payload, Configuration::ADDITIONAL_OPTIONS];
}
$payload = array_filter($payload);
$request = json_encode([
'jsonrpc' => '2.0',
'method' => $action,
'params' => $payload,
'id' => $this->calls++,
]);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSLVERSION, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json', 'Cookie: XDEBUG_SESSION=PHPSTORM'));
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
$response = curl_exec($curl);
if(empty($response)) {
die('Server unavailable');
}
echo $response . '</br>';
return json_decode($response, true);;
}
}
$client = new Client();
$result = $client->call();
var_dump($result);
Cross-sell
Overview
The object below is returned directly or within a successful response from the following API requests:
Retrieve a product’s cross-sell campaigns Retrieve cross-sell campaigns
Cross-sell object
| Parameter | Type/Description | |
|---|---|---|
|
MasterProducts |
Array |
|
|
|
Array of product codes for the items you set to trigger the cross-sell campaign. |
|
|
DisplayType |
String |
|
|
|
|
|
|
DisplayInEmail |
Boolean |
|
|
|
True or false depending on whether you set the cross-sell campaign to display in payment receipt emails or not. |
|
|
Products |
Array of objects |
|
|
|
Details below |
|
|
|
ProductCode |
String |
|
|
|
Product code for the item you set as recommended for the cross-sell campaign. |
|
|
Discount |
String |
|
|
|
Value of the discount. This is a percentage. |
|
|
DiscountType |
String |
|
|
|
PERCENT – you can only set discounts as a percentage from the product price. |
|
CampaignCode |
String |
|
|
|
Unique, system-generated cross-sell campaign code. |
|
|
Name |
String |
|
|
|
Campaign name. |
|
|
StartDate |
String |
|
|
|
YYYY-MM-DD. The start date you set for the cross-sell campaign. |
|
|
EndDate |
String |
|
|
|
YYYY-MM-DD. The end date you set for the cross-sell campaign. |
|
Restrict API calls based on request IP
Overview
Restrict API calls based on request IP address and increase the security of your account by preventing unauthorized API usage. By default, you can call the 2Checkout API from any IP.
Currently, the 2Checkout systems do not support IPv6 for customer IP.
Availability
All 2Checkout accounts.
Set up
- Navigate to Settings » Users » Firewall.
- Specify a static IP address or a range of IP addresses.
- In the Selected Users area, apply the restriction to API (Special).
- Add the IP filter.
- Activate the IP filtering system.
Subscription grace period
Overview
Set a grace period for your products and enable customers to renew expired subscriptions for a specific number of days after the expiration deadline. For example, for a 7 day grace period, 2Checkout will still accept payments and customers can still renew their subscriptions for up to a week after their subscriptions have expired. The expiration date of a recurring subscription is calculated based on a 'last day of the month' principle. For a subscription that is recurring on a monthly basis, and starts on January 31st, the subscription will expire as follows: in February, this subscription will expire on February 28th (or 29th for leap years). In March, the subscription will expire on the 31st.
Impact
Grace period settings impact subscriptions generated with every sale and are used as attributes of these subscriptions throughout their lifecycle.
Grace period configuration
2Checkout allows you to configure subscription grace period for multiple scenarios.
Account-level grace period
- Go to Setup -> Renewal -> Global Renewal Settings.
- Define the grace period length.
- Click Save.
Apply the global grace period settings to existing subscriptions
- Go to Setup -> Renewal -> Global Renewal Settings.
- Define the grace period length.
- Apply the settings to different types of existing subscriptions:
- Expired (will apply the new settings to subscriptions for the product you're editing sold to your customers that expired - the number of expired subscriptions impacted is enclosed in parenthesis).
- Past due (will apply the new settings to subscriptions for the product you're editing sold to your customers that are currently in the grace period - the number of subscriptions in their grace period impacted is enclosed in parenthesis).
- Active (will apply the new settings to subscriptions for the product you're editing sold to your customers that are still active - the number of active subscriptions impacted is enclosed in parenthesis).
- Click Save.
Product-level grace period
- Go to Setup -> Products.
- Click Edit on the product that you want to configure the grace period for.
- Go to the Renewal tab and select the Set custom grace period for this product option.
- Define the grace period length.
- Click Save.
Overwrite product-level grace period for existing subscriptions
Subscription sold for products with product-level grace period settings inherit the custom renewal configurations and not the global renewal setup.
- Go to Setup -> Renewal -> Global Renewal Settings.
- Define the grace period length.
- Apply the settings to different types of existing subscriptions:
- Expired (will apply the new settings to subscriptions for the product you're editing sold to your customers that expired - the number of expired subscriptions impacted is enclosed in parenthesis).
- Past due (will apply the new settings to subscriptions for the product you're editing sold to your customers that are currently in the grace period - the number of subscriptions in their grace period impacted is enclosed in parenthesis).
- Active (will apply the new settings to subscriptions for the product you're editing sold to your customers that are still active - the number of active subscriptions impacted is enclosed in parenthesis).
- Check the Apply to subscriptions with grace periods set at product-level option. This overwrites only the inherited grace period for existing subscriptions and not the custom grace period settings set at product-level.
- Click Save.
Usage scenarios
Prolonging the grace period for expired subscriptions
- The interval increase doesn't push the grace period beyond the current date when the change is operated. As a result, expired subscriptions will maintain their Expired status.
Subscription 1
Recurring billing
1 month
Lifecycle
May 1 - May31
Grace period
5 days
Current date
June 12
Current status
Expired
Update grace period to
7 days
Impact on subscription
New 7 day long grace period
Impact on status
None
Comment
Because the prolonged grace period doesn't include the current date when the change is operated, the status of the subscription remains unchanged, in this case, Expired.
- The interval increase pushes the grace period beyond the current date when the change is operated. As a result, expired subscriptions will re-enter their grace period (Past Due status) allowing customers to renew them through manual payments.
Subscription 1
Recurring billing
1 month
Lifecycle
May 1 - May31
Grace period
5 days
Current date
June 12
Current status
Expired
Update grace period to
14 days
Impact on subscription
New 14 day long grace period and subscription is returned to its grace period
Impact on status
Switched from Expired to Past Due
Comment
Because the prolonged grace period includes the current date when the change is operated, the status of the subscription is changed from Expired to Past Due. Customers will now be able to once again renew their subscriptions through manual payments (buy links previously sent in manual renewal email notification will work as the status is changed).
Prolonging the grace period for Past Due subscriptions
- The interval change doesn't reduce the grace period to a previous date compared to the current date when the change is operated. As a result, subscriptions in their grace period will maintain their Past Due status.
Subscription 2
Recurring billing
1 month
Lifecycle
May 1 - May31
Grace period
14 days
Current date
June 12
Current status
Past Due
Update grace period to
13 days
Impact on subscription
New 13 day long grace period
Impact on status
None
Comment
Because the update doesn't shorten the grace period to an interval preceding the current date when the change is operated, the status of the subscription remains unchanged, in this case, Past Due.
- The interval change reduces the grace period to a previous date compared to the current date when the change is operated. As a result, subscriptions in their grace period will expire.
Subscription 1
Recurring billing
1 month
Lifecycle
May 1 - May31
Grace period
14 days
Current date
June 12
Current status
Past Due
Update grace period to
7 days
Impact on subscription
New 7 day long grace period and subscription expires
Impact on status
Switched from Past Due to Expired
Comment
Because the update shortens the grace period to an interval preceding the current date when the change is operated, the subscription expires, and its status switches from Past Due to Expired.
License Change Notifications (LCN)
When you modify the grace period of subscriptions, the 2Checkout system will automatically send out License Change Notifications (LCNs) reflecting the update you made.
|
LICENSE_GRACE_PERIOD |
The grace period impacting a subscription. Possible values:
|
LCN corner cases
- You set a 1 day grace period for a subscription that's no more than 24 hours after its' expiration deadline and that did not feature a grace period previously. In this case, the 2Checkout system will send out 2 notifications:
- 1 LCN reflecting the grace period change.
- 1 LCN reflecting the Past Due status of the subscription.
- You decrease the grace period of a subscription that's less than 24 hours from the grace period deadline by 1 day. In this case, the 2Checkout system will send out 2 notifications:
- 1 LCN reflecting the grace period change.
- 1 LCN reflecting the expiration of the subscription.
F.A.Q.
- What happens if the grace period expires?
- 2Checkout will no longer accept payments and customers will not be able to renew their expired subscriptions.
- Does grace period offer extra usage?
- No. Configuring a grace period for subscriptions does not influence the recurring billing process. Grace periods provide an interval of time, after the expiration of a subscription, in which shoppers can order a renewal. After the grace period, if any, runs out for expired subscriptions, customers will have to purchase a new offering. Expirations deadlines are calculated in accordance to purchase dates and converted to the 2Checkout local time zone.
- Does 2Checkout send LCNs for grace period updates?
- Yes. 2Checkout sends out LCN notifications for each change you perform per subscription that results in an update of the grace period.
Retrieve an order
Overview
Use the getOrder method to retrieve details on a specific order using its unique, system generated reference.
Parameters
|
Parameters |
Type/Description |
|
sessionID |
Required (string) |
|
|
Session identifier, the output of the Login method. Include sessionID into all your requests. 2Checkout throws an exception if the values are incorrect. The sessionID expires in 10 minutes. |
|
orderReference |
Required (string) |
|
|
Order reference number of older order, which is already approved/paid. |
Response
|
Object |
Request
<?php
$host = "https://api.2checkout.com";
$client = new SoapClient($host . "/soap/6.0/?wsdl", array(
'location' => $host . "/soap/6.0/",
"stream_context" => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false
)
))
));
function hmac($key, $data)
{
$b = 64; // byte length for md5
if (strlen($key) > $b) {
$key = pack("H*", md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad;
$k_opad = $key ^ $opad;
return md5($k_opad . pack("H*", md5($k_ipad . $data)));
}
$merchantCode = "YOUR_MERCHANT_CODE";// your account's merchant code available in the 'System settings' area of the cPanel: https://secure.2checkout.com/cpanel/account_settings.php
$key = "YOUR_SECRET_KEY";// your account's secret key available in the 'System settings' area of the cPanel: https://secure.2checkout.com/cpanel/account_settings.php
$now = gmdate('Y-m-d H:i:s'); //date_default_timezone_set('UTC')
$string = strlen($merchantCode) . $merchantCode . strlen($now) . $now;
$hash = hmac($key, $string);
try {
$sessionID = $client->login($merchantCode, $now, $hash);
}
catch (SoapFault $e) {
echo "Authentication: " . $e->getMessage();
exit;
}
$orderReference = '43403739';
try {
$fullOrderDetails = $client->getOrder ($sessionID, $orderReference);
}
catch (SoapFault $e) {
echo "fullOrderDetails: " . $e->getMessage();
exit;
}
var_dump("fullOrderDetails", $fullOrderDetails);
?>