Skip to main content

Perform action

Overview

Use the performAction method via JSON-RPC APIv6 to execute an action on the proposal.

Request parameters

Request parameters for the performAction method via JSON-RPC APIv6
Action Parameters Type Required/Optional Description
  sessionId String Required Unique 2Checkout session ID code.

 

 

 

 

 

 

 

 

SEND

proposalId String Required The unique merchant proposal ID generated by the 2Checkout system.
exirationDate Date Required The date at which the proposal expires; date-time ISO 8601 format
userId String Optional The unique user ID generated by the 2Checkout system.
action String Required The action to be executed on the proposal.
statusComment String Optional Free text comments that can accompany a status.
sentBy String Required Represents the account manager of the merchant.

FirstName

String Required The first name of the email sender.

LastName

String Required The last name of the email sender.

Email

String Required The email address of the email sender.

 

ACCEPT

action String Required The action to be executed on the proposal.
statusComment String Optional Free text comments that can accompany a status.

 

 

CLOSE

action String Required The action to be executed on the proposal.
statusComment String Optional Free text comments that can accompany a status.
userId String Optional The unique user ID generated by the 2Checkout system.

 

 

DISCARD

action String Required The action to be executed on the proposal.
statusComment String Optional Free text comments that can accompany a status.
userId String Optional The unique user ID generated by the 2Checkout system.

 

 

REOPEN

action String Required The action to be executed on the proposal.
statusComment String Optional Free text comments that can accompany a status.
userId String Optional The unique user ID generated by the 2Checkout system.

 

DECLINE

action String Required The action to be executed on the proposal.
statusComment String Optional Free text comments that can accompany a status.

Request sample

<?php

require ('PATH_TO_AUTH');

$proposalId = "0573e71d-38bb-4d61-88ca-b3c557517c68";

$actionPayload = new stdClass();
$actionPayload->ExpirationDate = "2021-01-05T17:21:42+00:00";
$actionPayload->UserId = "john.doe@email.com";
$actionPayload->action = "decline";
$actionPayload->StatusComment = "The price is too high for the first product";
$actionPayload->SentBy = new stdClass();
$actionPayload->SentBy->FirstName = "John";
$actionPayload->SentBy->LastName = "Doe";
$actionPayload->SentBy->Email = "john.doe@email.com";

$jsonRpcRequest = new stdClass();
$jsonRpcRequest->jsonrpc = '2.0';
$jsonRpcRequest->method = 'performAction';
$jsonRpcRequest->params = array($sessionID, $actionPayload);
$jsonRpcRequest->id = $i++;

try {
    $result = callRPC($jsonRpcRequest, $host);
    echo "Proposal: </br>", 
    var_dump($result);
}
catch (SoapFault $e) {
    echo "Could not fetch proposal: " . $e->getMessage();
    exit;
}

Response

The performAction call via JSON-RPC APIv6 returns the Proposal object.

Place orders with catalog products

Overview

Use this object via SOAP API 6.0 to create new orders and collect payments from shoppers using catalog products defined in your Merchant Control Panel.

For orders that require physical delivery, if no shipping methods are provided, 2Checkout will add to the cart your account's default shipping configuration.

You can find a list of common errors that may arise when using the placeOrder call via API 6.0 here.

Supported payment methods/flows

  1. Credit/Debit cards: Visa, Visa Electron, MasterCard, Maestro, Amex, Discover, Dankort, Carte Bleue, JCB. 2Checkout supports local Brazilian cards.
  2. PayPal and PayPal Express
  3. Purchase Order
  4. Wire
  5. Check
  6. WeChat Pay
  7. iDEAL
  8. Alipay
  9. UnionPay
  10. Trustly
  11. TEST orders
  12. Free orders (no payment information required)
  13. Previous order references - In addition to the payment methods enumerated above, 2Checkout also supports 1-click purchase flows in which you use valid previous order references belonging to returning customers to pay for new orders with their previously used cards and PayPal accounts.
  14. 2Pay.js

Requirements

For credit card orders placed using 2Checkout API 6.0 or a more recent version, you need to pass through additional parameters that support the 3D Secure flow. 3D Secure works by redirecting customers to pages provided by their banks, where they need to enter additional security tokens or password to trigger the completion of the charge. By using 3D Secure, you get additional protection from liability for fraudulent card payments, with customers having to go through an extra layer of authentication.

Send the following parameters in the placeOrder call, as part of the PaymentDetails object:

Parameters Description
Vendor3DSReturnURL Required (string)
  URL address to which customers are redirected after the 3DS details get validated by the bank and the order is successfully authorized.
Vendor3DSCancelURL Required (string)
  URL address to which customers are redirected if the 3DS details were not validated or the order could not be authorized.

Response

Parameters Type/Description
Order information Object
  Object containing order information.

Parameters

 
Parameters Type/Description
Currency String / Optional
  The currency ISO code for the payment - ISO 4217. Example: “usd.”
Country String / Optional
  Shopper country. ISO 3166 two-letter code. Example: “us.”
Language String / Optional
  ISO 639-1 two-letter code. The language used for the purchase process. Example: “en.”
ExternalReference String / Optional
  Set external reference identifiers for orders. Enables you to replicate the functionality of the REF parameter included into Buy Links. Maximum 100 characters. If there is a need for longer references, you can apply an md5 hash for any string value, resulting in a 32 characters string. You can verify the hash after the order notification, on the client side.
Source String / Optional
 

The link source for the sales. Enables you to replicate the functionality of the SRC (separate link identifier) parameter when included into Buy Links. Use the SRC parameter to track sale sources.

 

Maximum length 255 characters.

CustomerReference Integer/Optional
  Set an external customer ID, attached to the customer.
Affiliate Object/Optional
                 AffiliateCode String/Required
  The affiliate unique code (as returned by the affiliates API methods).
AffiliateSource String/Optional
  The affiliate source.
Items Array of objects / Required
  Details below. 
  OrderItem Object
    Details below. 
    Code String / Mandatory
      Unique product identifier your control. Max length 256 characters. Only for catalog products.
    Quantity Integer / Optional
      Number of units
    PriceOptions Array of strings / Optional
      Array of price option codes.
    SKU String / Optional
      SKU identifier.
    Price Object - Can be NULL. If Price Type is set to 'CUSTOM', dynamic pricing can be added to the order via the Amount parameter.
    CrossSell Object – Can be NULL
        Details below. 
      ParentCode String 
        The product code of the master product you set to trigger the campaign.
      CampaignCode String 
        Unique, system-generated identifier for cross-sell campaigns.
    Trial Object – Can be NULL
      Details below. 
      Period Integer 
        The length of the trial subscription lifetime in days.
      Price Double / Optional
        Total trial price in the payment currency before 2Checkout deducts any taxes, discounts, etc.
    AdditionalFields Array of objects – Can be NULL
      AdditionalFieldSet Object – Can be NULL
        Code String
          The alpha-numeric characters, underscores and dashes that are set as the field identifier.
        Value String
          Selected field value.
    SubscriptionStartDate String
     

Specify the date time stamp when the subscription becomes active. Format 2016-07-02 22:22:22 (YYYY-MM-DD HH:mm:ss). Available for JSON-RPC and REST.

Send empty or NULL to activate subscriptions on the same date when customers purchase them.

You can exclude HH:mm:ss when sending the date and include only YYYY-MM-DD. In this case, 2Checkout uses 00:00:01. Default time zone GMT+02:00.

    SubscriptionCustomSettings Object/Optional
      To use this, the ExtraInformation object with AssistedSale property set to "true" is required.
   

CycleAmountType

String/Required
      Billing cycle unit NET/GROSS.
   

CycleUnit

String/Required
      DAY/MONTH. Can be NULL.
   

CycleAmount

Float/Required
      Billing cycle (renewal) price.
   

CycleLength

Integer/Required
      Billing cycle length. Can be NULL.
   

ContractLength

Integer/Optional
   
 
Contract period length (expressed in the specified CycleUnit; must be multiple of CycleLength). Can be NULL.
   

MerchantDealAutoRenewal

Boolean/Optional
      Merchant deal auto-renewal flag.
   

ClientDealAutoRenewal

Boolean/Optional
      Client deal auto-renewal flag.
BillingDetails Object / Required
  Details below. 
  FirstName String / Required
    Shopper name.
  LastName String / Required
    Shopper surname.
  CountryCode String / Required
    Shopper country. ISO 3166 two-letter code.
  State String/Optional – Required for US, Canada, Brazil, Turkey, India and Romania
    The state in the shopper's country. Mandatory when you set the Billing Country to US, Canada, Brazil, Turkey, India and Romania. Use case insensitive utf8 strings for the full name, or just the two-letter code.
  City String /Required
    Shopper city.
  Address1 String/Required
    Shopper address.
  Address2 String / Optional
    Shopper address.
  Zip               String/Required
    ZIP/ Postal code.
  Email String/Required
    Shopper email address.
  Phone String / Optional
    Shopper phone number. Mandatory when you set Brazil as the Billing Country. Can be NULL.
  Company String / Optional
    Company name. Can be null for end users. When present, you also need to provide the FiscalCode.
  FiscalCode String / Optional– Required for Brazil
   

• For companies, it needs to be the VAT ID. 2Checkout will validate the value provided and throw an error if the VAT ID is invalid/incorrect when calling setPaymentDetails. When present, you also need to provide the Company name.

• Mandatory when you set Brazil as the Billing Country. For Brazilian customers it represents the Fiscal Code (CPF/CNPJ).

Mandatory when you set India as the Billing Country, and purchase is made by a Company.

• Can be NULL for end users.

  TaxExemptionId  Optional (string)
    Tax Exempt Certification id used to deduct taxes for US orders
Example: 1b80eecc349v
DeliveryDetails Object / Required
  Details below. 
    FirstName String / Required
      Shopper name from the delivery details.
    LastName String / Required
      Shopper surname from the delivery details.
    CountryCode String / Required
      Shopper country. ISO 3166 two-letter code from the delivery details.
    State String/Optional – Required for US, Canada, Brazil, Turkey, India and Romania
      The state in the shopper's country. Mandatory when you set the Billing Country to US, Canada, Brazil, Turkey, India and Romania. Use case insensitive utf8 strings for the full name, or just the two-letter code.
    City String / Optional
      Shopper city from the delivery details.
    Address1 String / Optional
      Shopper address from the delivery details.
    Address2 String / Optional
      Shopper address from the delivery details.
    Zip               String / Optional
      ZIP/ Postal code from the delivery details.
    Email String / Optional
      Shopper email address from the delivery details.
    Phone String / Optional
      Shopper phone number from the delivery details. Mandatory when you set Brazil as the Billing Country. Can be NULL.
    Company String / Optional
      Company name from the delivery details. Can be null for end users. When present, you also need to provide the FiscalCode.
DeliveryInformation

Object / Optional

For products that require physical delivery, use this object to send the shipping method.

    ShippingMethod

Object

Details below

      Code String
  System-generated identified for your shipping method configuration
PaymentDetails Object / Required
  Adapt this object to the desired payment method.
  Type Required (string)
   

The payment method:

  • CC (credit/debit card - including local Brazilian cards).
  • ENCRYPTED_PAYMENT_DATA (client-side encryption)
  • PAYPAL
  • PAYPAL_EXPRESS
  • CCNOPCI(credit/debit card for non-PCI certified merchants).
  • TEST (for test orders).
  • PREVIOUS_ORDER(place new orders using the reference of a previous order).
  • EXISTING_PAYMENT_DATA  (use a card one of your customers already used to purchase from your account).
  • WIRE – the placeOrder response includes Wire payment details.
  • CHECK – the placeOrder response includes Check payment details.
  • WE_CHAT_PAY (for WeChat payments).
  • IDEAL (for iDEAL payments).
  • PURCHASEORDER - use for orders with POs.
  • FREE – for 0 value orders for which you’re not requiring customers to provide payment details.
  • ALIPAY
  • UNIONPAY
  • DIRECT_EBANKING
  • TRUSTLY (for Trustly payments)
  • EES_TOKEN_PAYMENT (2Pay.js)

 

  Currency Required (string)
    The currency ISO code for the payment - ISO 4217. Example: “usd.”
  PaymentMethod Optional (object)
   

Object structure and parameters differ according to payment method selected and API method (placing orders (POST) vs. retrieving order data (GET)).

 

NULL for 0 value orders for which you’re not requiring customers to enter payment details.

                                                              RecurringEnabled Optional (boolean)Optional (boolean)
   

true – shopper checks the auto-renewal checkbox and 2Checkout charges subscription renewals using a recurring billing process.

false – shopper doesn’t check the auto-renewal checkbox.

      CardPayment Optional (object)
        Details below. 
        CardNumber Required (string)
          The credit/debit card number.
        CardType Required (string)
          visa, visaelectron, mastercard, maestro, amex, discover, dankort, cartebleue, jcb, hipercard, elo
        ExpirationYear Required (string)
          The year in which the card expires.
        ExpirationMonth Required (string)
          The month in which the card expires.
        HolderName Required (string)
          Cardholder name.
        CCID Required (string)
          Credit Card Identification - an extra ID printed on the card, usually a 3-4 digit number, the CVC2/CVV2.
        Vendor3DSReturnURL Required (string)
          URL address to which customers are redirected after the 3DS details get validated by the bank and the order is successfully authorized.
        Vendor3DSCancelURL Required (string)
          URL address to which customers are redirected if the 3DS details were not validated or the order could not be authorized.
        HolderNameTime Optional (float)
         

The interval of time in seconds in which shoppers enter their name in the HolderName field. An abnormally short interval is usually a red flag for fraud attempts.

Can be NULL, but not a negative number.

        CardNumberTime Optional (float)
         

The interval of time in seconds in which shopper enters their card number in the CardNumber field. An abnormally short interval is usually a red flag for fraud attempts.

Can be NULL, but not a negative number.

        InstallmentsNumber  Optional (Int)
          Number of installments. Available only when customers un Brazil pay with Visa or MasterCard using Brazilian Real as the order currency. Use 1 or exclude the parameter for full payments. 
      PayPalExpress Optional (object)
        Details below. 
        Email Optional (string)
          Email address customers use for their PayPal account.
        ReturnURL Optional (string)
          The PayPal Express Checkout redirect URL returned by calling the getPayPalExpressCheckoutRedirectURL method. The return URL is the page on your website to which PayPal redirects yourbuyer's browser after the buyer logs into PayPal and approves the payment. Typically, this is a secure page (https://...) on your site.
        CancelURL Optional (string)
          The cancel URL is the page on your website to which PayPal redirects your buyer's browser if the buyer does not approve the payment. Typically, this is the secure page (https://...) on your site from which you redirected the buyer to PayPal.
      PreviousOrder Optional (Object)
        Details below. 
        RefNo Optional (string)
         

Order reference a previous purchase that reached the Approved/Complete status. You can use orders for which customers paid with credit/debit cards or with PayPal. The status of orders should be AUTHRECEIVED or COMPLETE.

 

Check the validity of references with the isValidOrderReference method.

 

The 2Checkout system blocks you from using references for fraudulent or potentially fraudulent orders.

      PurchaseOrderPaymentDetails Optional (Object)
        Details below. 
        InternalPONumber Optional (string)
          Identifier that business customers use internally in their organization to track and manage Purchase Orders (PO). Can be NULL.
        AutoApprove Optional (boolean)
         

TRUE - requires activation of the PO AutoApprove package (If the package is inactive 2Checkout returns an error). Please contact 2Checkout. When AutoApprove is TRUE, 2Checkout no longer requires that business customers upload a PO document. As such, PO orders are automatically approved for your account, without a PO doc. 2Checkout sets the PURCHASE_PENDING status for auto-approved PO orders.

FALSE - Default. Send this if the PO AUtoApprove package is not available for your account. 2Checkout uses the same flow as cart purchases with Purchase Orders for business customers placing orders with POs via API. This means that customers receive the same emails as if they made the purchase using the cart and need to update the PO document, which is reviewed by 2Checkout and that you need to approve. 2Checkout sets the AVAITING_UPLOAD status for POs andUnfinished for their orders.

 

Can be NULL.

      WE_CHAT_PAY Optional (string)
        Details below
        ReturnURL Optional (string)
          The return URL is the page to which your customers are redirected after their successful payment.
        CancelURL Optional (string)
          The cancel URL is the page to which your customers are redirected after their failed payment attempt.
      IDEAL Optional (string)
        Details below
        ReturnURL Optional (string)
          The return URL is the page to which your customers are redirected after their successful payment.
        CancelURL Optional (string)
          The cancel URL is the page to which your customers are redirected after their failed payment attempt.
        BankCode Required (string)
          String contains the SWIFT code of the bank, the plus sign "+", and the first 3 characters from the bank name. E.q.: in the case of Rabobank, code parameter is "RABONL2U+RAB".
      EXISTING_PAYMENT_DATA Optional (Object)
        By using EXISTING_PAYMENT_DAT you no longer require shoppers to enter any payment details.
        TransientToken Optional (string)
          Returned as a part of the process of retrieving customer information by SSOToken.
      TRUSTLY  Optional (string)
        Details below.
        ReturnURL Optional (string)
     

 
  The return URL is the page to which your customers are redirected after their successful payment. The return URL is the page to which your customers are redirected after their successful payment. 
  CustomerIP Optional (string)
    Shopper IP.
Promotions Optional (Array of strings)
  Array of promotion codes.
AdditionalFields Object / Optional
  Details below. 
  Code Optional (string)
    The alpha-numeric characters, underscores, and dashes that are set as the field identifier.
  Text Optional (string)
    Field text visible to shoppers in the cart.
  Value Optional (string)
    Selected field value.
LocalTime Optional (string)
 

Local shopper time in the following format: Y-m-d H:i:s.

This parameter can impact the fraud score of an order when it's missing, NULL or incorrectly formatted.

GiftDetails Optional (object)
  Contains contact details for the recipient of a gift purchase.
  FirstName Optional (string)
    First name of gift recipient.
  LastName Optional (string)
    Last name of gift recipient.
  Email Optional (string)
    Email of gift recipient. 2Checkout uses this email for the delivery/fulfillment process.
  GiftNote Optional (string)
    Custom text shoppers provide as a message to the gift recipient.

 

Place orders with upsell campaign

Overview

When calling the placeOrder method in order to place an order with an upsell campaign, the code of the master product and the campaign code need to be added to the UpSell object for the product item where it is applied.

UpSell Object for the placeOrder API method

Parameter name Type Required/Optional Description
CampaignCode String Required The upsell campaign code.
ParentCode String Required Product code of the product to be recommended to the shopper.
PriceOptions String Required Array of priceOptions strings used on parent product.
Quantity Integer Required Product quantity.

Request Example 

{ 
  "Currency": "USD", 
  "Language": "EN", 
  "Country": "US", 
  "CustomerIP": "10.10.10.10", 
  "Source": "sourceAPI.net", 
  "CustomerReference": 421820775, 
  "Items": [ 

    { 
      "Code": "15", 
      "Quantity": 1 
    }, 
    { 
      "Code": "34924C876E", 
      "Quantity": 1, 
      "UpSell": {
        "CampaignCode": "1490b954-c299-430a-8134-e6a0501913ef",
        "ParentCode": "0BQ591VOTW",
        "PriceOptions": [
            "option_code_1"
        ],
        "Quantity": 5
      }
    } 
  ], 

   "BillingDetails":{ 

      "FirstName":"Customer First Name", 
      "LastName":"Customer Last Name", 
      "CountryCode":"US", 
      "State":"California", 
      "City":"San Francisco", 
      "Address1":"Example Street", 
      "Zip":"90210", 
      "Email":"example@email.com" 

   }, 

  "PaymentDetails": { 
    "Type": "CC", 
    "Currency": "USD", 
    "CustomerIP": "10.10.10.10", 
    "PaymentMethod": { 

      "Vendor3DSReturnURL": "https:\/\/example.com", 
      "Vendor3DSCancelURL": "https:\/\/example.com", 
      "CardNumber": "4111111111111111", 
      "CardType": "VISA", 
      "ExpirationYear": "2020", 
      "ExpirationMonth": "12", 
      "CCID": "123", 
    } 
  } 
} 

Response

Using the same structure, the getContents method will take into account the discount associated with the upsell campaign and display the appropriate prices and taxes. 

{ 
    "Country": "DE", 
    "Currency": "EUR", 
    "Items": [ 
        { 
            "Code": "NIQRPI0GTU", 
            "Quantity": 1 
        }, 
        { 
            "Code": "0XICS3OVDK", 
            "Quantity": 1, 
            "UpSell": {
                "CampaignCode": "1490b954-c299-430a-8134-e6a0501913ef",
                "ParentCode": "0BQ591VOTW",
                "PriceOptions": [
                    "option_code_1"
                ],
                "Quantity": 5
             }
        } 
    ], 

    "BillingDetails": { 
        "FirstName": "Customer First Name", 
        "LastName": "Customer Last Name", 
        "CountryCode": "DE", 
        "City": "Bucharest", 
        "Address1": "Example Street", 
        "Zip": "73331", 
        "Email": "example@email.com" 
    } 
} 

Remove promotion coupon

Request

<?php 

class Client
{
    protected static $merchantCode;
    protected static $loginDate;
    protected static $hash;
    protected static $baseUrl;
    protected static $callCount = 0;
    protected static $sessionId = '';

    protected static $client;

    public static function setCredentials($code, $key)
    {
        static::$merchantCode = $code;
        static::$loginDate = gmdate('Y-m-d H:i:s');
        static::$hash = hash_hmac('md5', strlen($code) . $code . strlen(static::$loginDate) . static::$loginDate, $key);
        static::$sessionId = static::login();
    }

    public static function setBaseUrl($url)
    {
        static::$baseUrl = $url;
    }

    public static function login()
    {
        $client = static::getClient();
        return $client->login(static::$merchantCode, static::$loginDate, static::$hash);
    }

    public static function __callStatic($name, $arguments = array())
    {
        $client = static::getClient();

        array_unshift($arguments, static::$sessionId);
        $response = call_user_func_array(array($client, $name), $arguments);

        return $response;
    }

    protected static function getClient()
    {
        $opts = array(
            'http'=> ['user_agent' => 'PHPSoapClient'],
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        );

        if (null === static::$client) {
            static::$client = new \SoapClient(static::$baseUrl . '?wsdl', [
                'location' => static::$baseUrl,
                'cache_wsdl' => WSDL_CACHE_NONE,
                'stream_context' => stream_context_create($opts),
            ]);
        }

        return static::$client;
    }
}

Client::setBaseUrl('https://api.avangate.com/soap/3.1/');
Client::setCredentials('YOUR_MERCHANT_CODE', 'YOUR_SECRET_KEY');
Client::login();

$promotionCode = 'YOUR_PROMOTION_CODE'; // code of the promotion that you want to update

// // Select single coupon object
// $promotionCoupon = new stdClass;
// $promotionCoupon->Type = 'SINGLE';
// $promotionCoupon->Code = 'YOUR_CODE_HERE';

// // Select multiple coupon object
// $promotionCoupon = new stdClass;
// $promotionCoupon->Type = 'MULTIPLE';
// $promotionCoupon->Codes = ['YOUR_CODE_1', 'YOUR_CODE_2'];

$response = Client::deletePromotionCoupon ($promotionCode,$promotionCoupon); // Delete selected coupons
var_dump($response);

Create percentage discount

Overview

Use setPromotionDiscount to set a percentage based promotion discount.

Parameters

Parameter Type/Description

sessionID

Required (string)

 

Output of the Login method.

promotionCode

Required (string)

 

The code corresponding to the promotion that you want to set the discount for.

promotionDiscount

Required(Object)

 

Type

Required (String)

 

 

Discount type:

  • PERCENT, use in combination with Value
  • FIXED, use in combination with Values and DefaultCurrency

 

Value / Values

Required (Int / Array of objects)

 

 

  • Value = Int, determines the discount percentage from 0 to 100
  • Values = Array of Value objects

 

 

Value

Required (Object)

 

 

 

Currency

Required (String)

 

 

 

 

Discount currency ISO code (ISO 4217).

 

 

 

Amount

Required (Int)

 

 

 

 

Discount amount in corresponding currency.

 

DefaultCurrency

Required (String)

 

 

Default discount currency ISO code (ISO 4217).

Response

Parameter Type/Description
PromotionDiscount Object

Request

<?php
declare(strict_types=1);

class Configuration
{
    public const MERCHANT_CODE = '';
    public const MERCHANT_KEY = '';
    public const URL = 'http://api.2checkout.com/soap/6.0';
    public const ACTION = 'setPromotionDiscount';
    public const ADDITIONAL_OPTIONS = null;
    public const PROMOTION_CODE = "AB3WMME0UA";
    //array or JSON
    public const PAYLOAD = <<<JSON
{
  "Type": "PERCENT",
  "Value": 30
}
JSON;
}

class Client
{
    public function call(
        string $url = Configuration::URL,
        $payload = Configuration::PAYLOAD,
        string $action = Configuration::ACTION,
        string $promotionCode = Configuration::PROMOTION_CODE
    ): ?object {
        if (is_array($payload)) {
            $payload = json_encode($payload);
        }
        if (!empty($payload)) {
            // SoapClient works with objects(StdClass)
            $payload = json_decode($payload);
        }
        $soapClient = $this->getClient($url);
        $sessionId = $this->getSession($soapClient);
        $args = array_filter([$sessionId, $promotionCode, $payload]);

        return $soapClient->$action(...$args);
    }

    public function getClient(string $url): SoapClient
    {
        return new SoapClient(
            $url.'?wsdl',
            [
                'location' => $url,
                'cache_wsdl' => WSDL_CACHE_NONE,
            ]
        );
    }

    public function getSession(SoapClient $client)
    {
        $date = gmdate('Y-m-d H:i:s');
        $merchantCode = Configuration::MERCHANT_CODE;
        $key = Configuration::MERCHANT_KEY;
        $string = strlen($merchantCode).$merchantCode.strlen($date).$date;
        $hash = hash_hmac('md5', $string, $key);
        $client->__setCookie('XDEBUG_SESSION', 'PHPSTORM');

        return $client->login($merchantCode, $date, $hash);
    }
}

try {
    $client = new Client();
    var_dump($client->call());
} catch (Exception $ex) {
    var_dump($ex);
}

One click (1-click) purchase

Overview

2Checkout supports 1-click purchases for returning customers who paid for their previous orders with:

  • Credit/Debit cards
  • PayPal
  • iDEAL
  • Alipay

Availability

Select 2Checkout accounts. Contact 2Checkout for more details. 

How does this work?

  1. Identify returning customers. 
  2. Access data on the previous purchases of returning customers.
  3. Validate previous order references for 1-click purchase scenarios using the isValidOrderReference method.
  4. Place a new order using a valid previous order reference as the payment method. 
  5. 2Checkout charges returning customers using their payment-on-file information, either a card or their PayPal account. 

Requirements

  • Use only references of previous orders with one of the following statuses AUTHRECEIVED or COMPLETE.
  • The email address of the BillingDetails object is mandatory and it needs to match the email address used as a part of the billing details of the initial order whose reference you're now using to place a new order. 2Checkout checks whether the email addresses are identical, and throws an error if they're not, blocking the order placement process. Note: You need to provide only the email address of the shopper, and can ignore the rest of the required customer billing information. If you enter any billing details in addition to the email address, you'll have to provide all information required in the BillingDetails object.
  • For orders paid with PayPal, the original order must have automatic renewal enabled so that it can be reused for future 1-click purchases.

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.
Order Required (Object)
  Object designed to collect all data necessary for an order, including billing, product/subscription plan and payment details.

Response

Order information Object

Request


<?php
echo "<pre>";
$host   = "https://api.2checkout.com";
$client = new SoapClient($host . "/soap/3.0/?wsdl", array(
    'location' => $host . "/order/3.0/soap",
    "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 = "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 = "SECRET_KEY";// your account's secret key available in the 'System settings' area of the Merchant Control Panel: https://secure.2checkout.com/cpanel/account_settings.php
$now = date('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 = '45452071';
try {
    $validOrderRef = $client->isValidOrderReference($sessionID, $orderReference);
}
catch (SoapFault $e) {
    echo "validOrderRef: " . $e->getMessage();
    exit;
}
var_dump("validOrderRef", $validOrderRef);
try {
    $existentOrder = $client->getOrder($sessionID, $orderReference);
}
catch (SoapFault $e) {
    echo "existentOrder: " . $e->getMessage();
    exit;
}
$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';
$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->BillingDetails = new stdClass();
$Order->BillingDetails = $existentOrder->BillingDetails;
$Order->DeliveryDetails = NULL;
$Order->PaymentDetails = new stdClass ();
$Order->PaymentDetails->Type = 'PREVIOUS_ORDER';
$Order->PaymentDetails->Currency = 'usd';
$Order->PaymentDetails->PaymentMethod = new stdClass ();
$Order->PaymentDetails->CustomerIP = '10.10.10.10';
$Order->PaymentDetails->PaymentMethod->RecurringEnabled = true;
$Order->PaymentDetails->PaymentMethod->RefNo = $orderReference;
$Order->Promotions = NULL;
$Order->AdditionalFields = NULL;
$Order->LocalTime = NULL;
$Order->GiftDetails = NULL;
try {
    $newOrderPaidWithPreviousRef = $client->placeOrder($sessionID, $Order);
}
catch (SoapFault $e) {
    echo "newOrderPaidWithPreviousRef: " . $e->getMessage();
    exit;
}
var_dump("newOrderPaidWithPreviousRef", $newOrderPaidWithPreviousRef);
?>

 

Add promotion translations

Overview

Use the addPromotionTranslations method to add localized texts to existing promotions.

Parameters

Parameter Type/Description

sessionID

Required (string)

 

Output of the Login method.

promotionCode

Required (string)

 

The code corresponding to the promotion that you want to add translations to.

promotions

Required (array of PromotionTranslations objects)

PromotionTranslations  Object

 

language

Required (string)

 

 

ISO country code corresponding to the country you want to set the translation for.

 

name

Required (string)

 

 

Localized promotion name applicable to the selected country.

Response

Parameters Type/Description

promotionTranslation

Object

Request

<?php

function callRPC($Request, $host, $Debug = true) {
    $curl = curl_init($host);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_VERBOSE, true);
    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'));
    $RequestString = json_encode($Request);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $RequestString);
    if ($Debug) {
        $RequestString;
    }
    $ResponseString = curl_exec($curl);
    if ($Debug) {
        $ResponseString;
    }
    if (!empty($ResponseString)) {
        var_dump($ResponseString);
        $Response = json_decode($ResponseString);
        if (isset($Response->result)) {
            return $Response->result;
        }
        if (!is_null($Response->error)) {
            var_dump($Request->method, $Response->error);
        }
    } else {
        return null;
    }
}

$host = 'https://api.avangate.com/rpc/3.1/';

$merchantCode = "YOUR_MERCHANT_CODE"; // your account's merchant code available in the 'System settings' area of the cPanel: https://secure.avangate.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.avangate.com/cpanel/account_settings.php

$string = strlen($merchantCode) . $merchantCode . strlen(gmdate('Y-m-d H:i:s')) . gmdate('Y-m-d H:i:s');
$hash = hash_hmac('md5', $string, $key);

$i = 1;

$jsonRpcRequest = new stdClass();
$jsonRpcRequest->jsonrpc = '2.0';
$jsonRpcRequest->method = 'login';
$jsonRpcRequest->params = array($merchantCode, gmdate('Y-m-d H:i:s'), $hash);
$jsonRpcRequest->id = $i++;

$sessionID = callRPC($jsonRpcRequest, $host);

// Promotion code corresponding to the promotion you want to add translations to
$promotionCode = '';

// Defining a translation for German shoppers
$promotionTranslation1 = new stdClass;
$promotionTranslation1->Language = 'de'; 
$promotionTranslation1->Name = 'YOUR_GERMAN_PROMOTION_NAME';

// Defining a translation for Bulgarian shoppers
$promotionTranslation2 = new stdClass;
$promotionTranslation2->Language = 'bg'; 
$promotionTranslation2->Name = 'YOUR_BULGARIAN_PROMOTION_NAME';

$translations = [$promotionTranslation1, $promotionTranslation2];

$jsonRpcRequest = array (
'jsonrpc' => '2.0',
'id' => $i++,
'method' => 'addPromotionTranslations',
'params' => array($sessionID, $promotionCode, $translations)
);
var_dump (callRPC($jsonRpcRequest, $host));

 

Assign to product group

Overview

Use the assignProductGroup method to assign a product to a product group. Following the assignation, the 2Checkout system uses the shopping cart template associated with the product group as the default cart design when shoppers purchase a subscription plan/product.

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.

productCode

Required (string)

 

The code of the product you wish assigned to the group.

groupCode Required (string)
  Unique, system-generated identifier assigned to product groups. 

Response

bool(true)

Request

<?php

require ('PATH_TO_AUTH');

$productCode = "YOUR_PRODUCT_CODE";
$groupCode = "YOUR_PRODUCT_GROUP_CODE";

try {
    $AssignedProductGroup = $client->assignProductGroup($sessionID, $ProductCode, $Code);
}

catch (SoapFault $e) {
    echo "AssignedProductGroup: " . $e->getMessage();
    exit;
}

var_dump("AssignedProductGroup", $AssignedProductGroup);

?>

 

Retrieve product info by code

Overview

Use getProductByCode to extract product information using the unique identifier you assign to subscription plans/products.  

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.

ProductCode

String

 

The product code that you control.

Response

Parameters Type/Description
Product Object

Request

<?php

require ('PATH_TO_AUTH');

$ProductCode = "subscr1";

$jsonRpcRequest = array (
'jsonrpc' => '2.0',
'id' => $i++,
'method' => 'getProductByCode',
'params' => array($sessionID, $ProductCode)
);
var_dump (callRPC((Object)$jsonRpcRequest, $host, true));

?>

Advanced Partner Control Panel customization

Overview

Use HTML, CSS and JavaScript to customize the look and feel of the Control Panel used by your partners/resellers/distributors.

Availability

This feature is available in tandem with the 2Checkout Channel Manager (Partner) package.

Requirements

Customization work can be done by you or by 2Checkout (contact us directly for more details).

How do I enable a custom template for the Partner Control Panel?

  1. Navigate to Interface Templates under Setup.
  2. Click on the Partners tab.
  3. Select the Advanced customization option.
  4. Click on Add template.

How do I customize the template?

  1. Enter a unique name.
  2. Select the languages for which the customization will be displayed:
    • English (default)
    • German
    • French
    • Spanish
    • Japanese
    • Portuguese
    • Italian
  3. Use external JavaScript and CSS files for customization or use the inline editors available in the template customization page.

What are the Partner Control Panel pages that I can customize?

  • Partner Control Panel Dashboard (full customization, it includes the PartnerCPanel JS object). The remaining Control Panel pages do not feature this object, so customization capabilities are limited.
  • Partner ordering process (partial customization, as the process requires loading pages with AJAX. Hint: you could use a hidden DIV and personalize the contents).
  • Partners SignupPartners LoginPartners product registration by using a cart template available in the Default Template area.

Partner Control Panel templates are standalone designs that do not share code with cart or myAccount templates. As such, if you check the Partners option on either a cart or a myAccount template, the template impacts exclusively the Partner Control Panel and gets moved to the Partner templates area. You cannot undo this process.

External JavaScript and CSS files

Upload one or more .CSS files, and similarly use a single or multiple .JS files, but also graphical elements to 2Checkout's server via the Media center. Unless uploaded to the 2Checkout server, these files will not allow for an SSL connection to be established.

When multiple .CSS or .JS files are uploaded, the last ones added will take precedence over previous items. Important: 2Checkout recommends that you use only a single .CSS file and a single .JS file in order to optimize page load time.

2Checkout Interface Templates use JavaScript and CSS external files to ensure a fast page loading time. 2Checkout will automatically merge the external JavaScript and CSS files uploaded via "Media Center" with the built-in interface files and serve them from a CDN (Content Delivery Network) for increased performance.

Once uploaded, the CSS and JS files will be featured in the External JavaScript and CSS files area of custom templates.

When added to a template, the custom .CSS and .JS files will override the default .CSS and .JS files.

Inline code editors

You can edit the:

  • Doctype Declaration
  • Page Title
  • Meta & CSS
  • HTML Code
  • JavaScript code

Click Save per-editor after inline changes.

CSS classes

You can use the following CSS classes to further customize the look and feel of the Partner Control Panel.

 

Class

Scope

Availability

partners__breadcrumb

Breadcrumbs area

All partner Control Panel pages

partners__header__bar

Header area

All partner Control Panel pages

partners__footer

Footer area

All partner Control Panel pages

partenrs__body__table

Content area

All partner Control Panel pages

partners__languages

Language selector area

All partner Control Panel pages and in the header

partners__main__menu

Menu area

All partner Control Panel pages

partners__errors

Error display area

All partner Control Panel pages

partners__messages

Message/notification display area

All partner Control Panel pages

partners__favorite__links

Favorites display area

If used

partners__quick__links

Quick link display area

If used

partners__quick__links__sidebar

Quick links sidebar display area

If used

partners__quick__stats

Statistics area

Homepage/dashboard

partners__proformas__listing

Partner invoices area

Homepage/dashboard

partners__orders__listing

Order listing area

Homepage/dashboard

In addition, you can also use the following JavaScript object included on the dashboard, the Partner Control Panel homepage.

window.PartnerCPanel = {
    /*optional - present on all pages that display the breadcrumb*/
    Breadcrumb: {
        All: [ /*ordered array of breadcrumb items, the last item is the one related to the current page*/ {
                Label: string,
                /*translated label of the breadcrumb item*/
                Url: string /*url to go to the breadcrumb item*/
            }
            /*, ...*/
        ]
    },
    /*optional - present if the partner is assigned to more than one vendor*/
    Companies: [ /*array of companies the partner can switch between and login into*/ {
            CompanyName: string,
            /*partner company name*/
            FirstName: string,
            /*partner first name*/
            LastName: string,
            /*partner last name*/
            MerchantCommercialName: string,
            /*vendor commercial name for this partner*/
            Selected: boolean,
            /*true if this is the current selected partner*/
            Url: string /*url to allow switching to this partner*/
        }
        /*, ...*/
    ],
    IS_LOGGED_IN: boolean,
    /*true when the partner is logged in, false otherwise*/
    Languages: { /*object with available languages*/
        All: [ /*array of all available languages*/ {
                Lang: string,
                /*3-letter language code*/
                LangAbr: string,
                /*2-letter language code*/
                Language: string,
                /*language name*/
                LanguageEN: string /*language name, translated in english*/
            }
            /*, ...*/
        ],
        Selected: string /*2-letter code of the selected language*/
    },
    Links: {
        /*optional - present only if any favorite links are defined by the partner*/
        Favorites: {
            All: [ /*array with all favorite links*/ {
                    Label: string,
                    Url: string
                }
                /*, ...*/
            ]
        },
        General: { /*object with all general links*/
            Contact: {
                Label: string,
                /*translated link label*/
                Url: string /*link url*/
            },
            /* same for Help, Home, Info, Logout*/
        },
        /*optional - present only if any top links are defined by the partner*/
        Top: {
            All: [ /*array with all top links*/ {
                    Label: string,
                    Url: string
                }
                /*, ...*/
            ]
        },
        /*optional - present only if any quick links are defined by the partner*/
        Quick: {
            All: [ /*array with all quick links*/ {
                    Label: string,
                    Url: string
                }
                /*, ...*/
            ]
        }
    },
    /*optional - present only if the vendor has a specific logo image*/
    Logo: {
        CompanyName: string,
        /*vendor company name*/
        Url: string /*Url of the image*/
    },
    Menu: { /*menu item details*/
        All: { /*object with keys for all the menu items details - below are examples based on the menu items at the current release date*/
            ACC_INFO: {
                Label: string,
                /*translated menu item*/
                Parent: string,
                Url: string /*url of the menu item*/
            },
            /* same for ADD_ORDER, ALL_ORDERS, CUSTOMERS, GRAPHICAL_REPORTS, PARTNERSHIP_DETAILS, PRODUCTS, PROFORMA_LISTING, REFUNDS, RESOURCES, USER_ACCESS */
        },
        Selected: string /*Url of the selected menu item*/
    },
    /*partner information*/
    Partner: {
        FirstName: string,
        LastName: string
    },
    /*vendor information*/
    Vendor: {
        CompanyName: string,
        CommercialName: string
    },
    /*optional - present only on specific pages, as needed; this element contents are to be changed over time*/
    SECTION: { /*relevant information on specific areas on the current page*/
        /*optional - present only on homepage*/
        INDEX: { /*relevant information on different homepage areas*/
            ORDERS: [ /*array of last 5 orders - exposes the orders data - present on homepage*/ {
                    Currency: string,
                    /*3-letter uppercase code*/
                    OrderDate: string,
                    /*yyyy-mm-dd*/
                    RefNo: string,
                    StatusCode: string,
                    /*ex: AWAITING_PAYMENT*/
                    Total: string,
                    /*user-friendly amount, two digits*/
                    Url: string /*url to access the order details*/
                }
                /*, ... */
            ],
            PROFORMAS: { /*data regarding the overdue proforma invoices - present on homepage*/
                count: {
                    amount: string,
                    /*user-friendly amount of all overdue proformas, converted to the default partner decont currency*/
                    count: string /*count of all overdue proformas*/
                },
                data: [ /*array of first 5 overdue proformas*/ {
                        IdProforma: string,
                        ProformaNumber: string,
                        /*proforma number*/
                        Status: string,
                        /*proforma invoice status*/
                        amount: string,
                        /*user-friendly proforma amount, converted to the default partner decont currency*/
                        due: string /*days overdue*/
                    }
                    /*, ... */
                ]
            },
            STATS: { /*data regarding the last week stats data - present on homepage*/
                licences_no: {
                    count: integer /*count of last week delivered subscriptions*/
                },
                orders: {
                    amount: float,
                    /*amount of last week complete orders, converted to the default partner decont currency*/
                    count: integer /*count of last week complete orders*/
                },
                orders_ni: {
                    amount: float,
                    /*amount of last week orders not yet invoiced, converted to the default partner decont currency*/
                    count: integer /*count of last week orders not yet invoiced*/
                },
                profit: { /*last week profit*/
                    amount: float /*converted to the default partner decont currency*/
                },
                proformas: {
                    amount: float,
                    /*amount of last week unpaid proforma invoices, converted to the default partner default currency*/
                    count: integer /*count of last week unpaid proforma invoices*/
                }
            },
            TOTAL_ORDERS: string /*count of all partner orders*/
        }
    }
};

 

Use the inline editors to overwrite specific lines in the existing .CSS or .JS files. Note: Changing these files is an advanced operation best handled by experienced programmers.

Add your custom CSS and JS files. To upload the files, use the Media Center area of the Control Panel. Unless custom CSS and JS files are uploaded to a secure 2Checkout server, a secure connection (SSL) cannot be established for your customers.

When present, code in the inline editor overrides both the custom .CSS and .JS files added to a template as well as the default .CSS and .JS files.

Make sure to delete from the inline editors any pieces of code that you customized using external .CSS and .JS files. For example, if you defined the full CSS through an external file, delete the code in the inline editor completely. However, in scenarios in which you customized only some portions of the template using the .CSS file, leave the necessary code in the inline editor.

HTML tags

Use the following tags to include/exclude specific content such as the language selector, the menu, footer and breadcrumbs. All tags are optional with the exception of PAGECODE, that is mandatory.

  • Mandatory content:
    • <--{PAGECODE}--> Loads the dynamic content of the Partner Control Panel.
  • Optional content:
    • <--{LANGUAGES}--> Language selector
    • <--{MENU}--> Main menu
    • <--{HEADER}--> Header area
    • <--{FOOTER}--> Footer area
    • <--{BREADCRUMB}--> Navigation breadcrumbs for Control Panel pages
    • <--{QUICK_LINKS}--> Quick links - the grey top bar above the breadcrumbs
    • <--{FAVORITE_LINKS}--> Favorite links - displayed in the right sidebar only after you mark pages as favorites
    • <--{SIDE_LINKS}--> Side links - the links below the Favorite links area (only available in certain scenarios)
    • <--{TOP_LINKS}--> Top links - the top left row of links next to the language selector

Simple customization settings

Simple customization settings are automatically migrated to your templates when you start using advanced customization. You will be able to find your personalized settings in the Meta & CSS inline editor.

How does the preview work?

The preview functionality uses a dummy Partner Control Panel account. To access it:

  1. Navigate to Interface Templates under Setup.
  2. Click on the Partners tab.
  3. Select the Advanced customization option.
  4. Click on Add template.
  5. Select Click here under Preview.

FAQ

Can I create multiple templates?

Yes. But you can have only a single design active at any given time.

Need help?

Do you have a question? If you didn’t find the answer you are looking for in our documentation, you can contact our Support teams for more information. If you have a technical issue or question, please contact us. We are happy to help.

Not yet a Verifone customer?

We’ll help you choose the right payment solution for your business, wherever you want to sell, in-person or online. Our team of experts will happily discuss your needs.

Verifone logo