Shopping Cart

The following hooks are provided for Shopping Cart related events.

AcceptOrder

Runs when an order is accepted prior to any acceptance actions being executed.

Parameters

Variable Type Notes
orderid int The order ID

Response

No response supported

Example Code

<?php
add_hook('AcceptOrder', 1, function($vars) {
    // Perform hook code here...
});

AddonFraud

Executes when an addon is set as fraud.

Parameters

Variable Type Notes
id int The addon ID (tblhostingaddons)
userid int
serviceid int
addonid int The predefined addon ID (tbladdons)

Response

No response supported

Example Code

<?php
add_hook('AddonFraud', 1, function($vars) {
    // Perform hook code here...
});

AfterCalculateCartTotals

Executes after the cart totals have been calculated.

Parameters

Variable Type Notes
total \Price Total due today

Response

No response supported

Example Code

<?php
add_hook('AfterCalculateCartTotals', 1, function($vars) {
    // Perform hook code here...
});

AfterFraudCheck

Executes after a fraud check has been completed

Parameters

Variable Type Notes
orderid int The id of the order that has been fraud checked
ordernumber int The order number
invoiceid int The ID of the invoice generated on order
amount float The amount the order was for
fraudresults array The full result from the fraud check
isfraud bool Has the check been deemed as fraud
frauderror array The details of the fraud check if an error occurs
clientdetails array The full details of the client the order is for

Response

No response supported

Example Code

<?php
add_hook('AfterFraudCheck', 1, function($vars) {
    // Perform hook code here...
});

AfterShoppingCartCheckout

Upon completion of checkout once the order has been created, invoice generated and all email notifications sent.

Parameters

Variable Type Notes
OrderID int The Order ID
OrderNumber int The randomly generated order number
ServiceIDs array An array of Service IDs created by the order
AddonIDs array An array of Addon IDs created by the order
DomainIDs array An array of Domain IDs created by the order
RenewalIDs array An array of Domain Renewal IDs created by the order
PaymentMethod string The payment gateway selected
InvoiceID int The Invoice ID
TotalDue float The total amount due

Response

No response supported

Example Code

<?php
add_hook('AfterShoppingCartCheckout', 1, function($vars) {
    // Perform hook code here...
});

CancelOrder

Runs when an order is requested to be cancelled, prior to the change of status actually occurring.

Parameters

Variable Type Notes
orderid int The order ID

Response

No response supported

Example Code

<?php
add_hook('CancelOrder', 1, function($vars) {
    // Perform hook code here...
});

CartItemsTax

Invoked as tax is being calculated for both cart and checkout, this can be used to manipulate the tax rate applied to the cart total or relevant checkout payment intents.

Parameters

Variable Type Notes
clientData array null
cartData \ItemInterface[] An array of all data held within in the shopping cart.

Response

Return an array of the manipulated ItemInterface items. Tax will be calculated from the delta of the original items.

Example Code

<?php

use WHMCS\View\Formatter\Price;

add_hook('CartItemsTax', '1', function ($vars) {
    $cartItems = $vars['cartData'];
    $client = $vars['clientData'];

    // Calculate your tax rate to apply
    $taxRate = 1.5; // 50%

    /** @var \WHMCS\Cart\Item\ItemInterface $item */
    foreach ($cartItems as $item) {
        if (!$item->isTaxed()) {
            continue;
        }

        /** @var Price $amountToday */
        $amountToday = $item->getAmount();

        // Set the price due today for the item
        $item->setAmount(new Price(
            ($amountToday->toNumeric() * $taxRate),
            $amountToday->getCurrency()
        ));

        if ($item->isRecurring()) {
            /** @var Price $recurringAmount */
            $recurringAmount = $item->getRecurringAmount();
            // Set the recurring price of the item
            $item->setRecurringAmount(
                new Price(
                    ($recurringAmount->toNumeric() * $taxRate),
                    $recurringAmount->getCurrency()
                )
            );
        }
    }

    return [
        'cartData' => $cartItems
    ];
});

CartSubdomainValidation

Executes when Cart Subdomain Validation is occurring

Parameters

Variable Type Notes
subdomain string eg sub in sub.whmcs.com
domain string eg whmcs.com in sub.whmcs.com

Response

Return any validation errors. eg: return array(‘error1’, ‘error2’,);

Example Code

<?php
add_hook('CartSubdomainValidation', 1, function($vars) {
    // Perform hook code here...
});

CartTotalAdjustment

Invoked as the order total is being calculated, this can be used to manipulate the final total.

Parameters

Variable Type Notes
products array An indexed array of products in the shopping cart. Keys include pid, domain, billingcycle, configoptions, customfields, addons, server, hostname
domains array An indexed array of domain registrations & transfers in the shopping cart. Keys include type, domain, regperiod

Response

Return an array consisting of adjustment description, amount and taxed (bool)

Example Code

<?php

add_hook('CartTotalAdjustment', 1, function($vars) {
    $cart_adjustments = array();

    $products = $tlds = [];

    foreach ($vars['products'] as $product) {
        $products[] = $product['pid'];
    }

    foreach ($vars['domains'] as $domain) {
        if ($domain['type'] == 'register') {
            $domainParts = explode('.', $domain['domain'], 2);
            $tlds[] = $domainParts[1];
        }
    }

    if (in_array(1, $products) && in_array('co.uk', $tlds)) {
        $cart_adjustments = [
            "description" => "Custom discount for buying product 1 and a co.uk domain",
            "amount" => "-18.00",
            "taxed" => false,
        ];
    }
    return $cart_adjustments;
});

DeleteOrder

Runs when an order is requested to be deleted, prior to the deletion actually occurring.

Parameters

Variable Type Notes
orderid int The order ID

Response

No response supported

Example Code

<?php
add_hook('DeleteOrder', 1, function($vars) {
    // Perform hook code here...
});

FraudCheckAwaitingUserInput

Executes when the fraud check is awaiting user input.

Parameters

Variable Type Notes
orderid int The id of the order that has been fraud checked
ordernumber int The order number
invoiceid int The ID of the invoice generated on order
amount float The amount the order was for
fraudresults array The full result from the fraud check
isfraud array The details of the fraud check if an error occurs
clientdetails array The full details of the client the order is for

Response

No response supported

Example Code

<?php
add_hook('FraudCheckAwaitingUserInput', 1, function($vars) {
    // Perform hook code here...
});

FraudCheckFailed

Executes when the fraud check fails for a new order.

Parameters

Variable Type Notes
orderid int The id of the order that has been fraud checked
ordernumber int The order number
invoiceid int The ID of the invoice generated on order
amount float The amount the order was for
fraudresults array The full result from the fraud check
isfraud array The details of the fraud check if an error occurs
clientdetails array The full details of the client the order is for

Response

No response supported

Example Code

<?php
add_hook('FraudCheckFailed', 1, function($vars) {
    // Perform hook code here...
});

FraudCheckPassed

Executes when the fraud check passes successfully for a new order.

Parameters

Variable Type Notes
orderid int The id of the order that has been fraud checked
ordernumber int The order number
invoiceid int The ID of the invoice generated on order
amount float The amount the order was for
fraudresults array The full result from the fraud check
isfraud array The details of the fraud check if an error occurs
clientdetails array The full details of the client the order is for

Response

No response supported

Example Code

<?php
add_hook('FraudCheckPassed', 1, function($vars) {
    // Perform hook code here...
});

FraudOrder

Runs when an order is requested to be set as fraud, prior to the change of status actually occurring.

Parameters

Variable Type Notes
orderid int The order ID

Response

No response supported

Example Code

<?php
add_hook('FraudOrder', 1, function($vars) {
    // Perform hook code here...
});

OrderAddonPricingOverride

Executes as an addon price is being calculated in the cart.

Parameters

Variable Type Notes
key int The key for the product in the cart session
pid int The product id
addonid int The addon id
proddata array The product data for an addon with new product purchase
serviceid int The service id when purchasing an addon for existing service

Response

Addon pricing can be overridden. Accepts a return of the keys ‘setup’ and ‘recurring’.

Example Code

<?php

use WHMCS\Service\Service;

add_hook('OrderAddonPricingOverride', 1, function($vars) {
    $return = [];
    if (array_key_exists('proddata', $vars)) {
        /**
         * This is a product and addon purchase
         */
        if ($vars['addonid'] == 1 && $vars['proddata']['pid'] == 1) {
            $return = ['setup' => '1.00', 'recurring' => '5.00',];
        }
    } else {
        /**
         * This is an addon only purchase for existing service
         */
        $serviceData = Service::find($vars['serviceid']);
        if ($serviceData && $vars['addonid'] == 1 && $serviceData->packageId == 1) {
            $return = ['setup' => '1.00', 'recurring' => '5.00',];
        }
    }
    return $return;
});

OrderDomainPricingOverride

Executes as a domain price is being calculated in the cart.

Parameters

Variable Type Notes
type string Either register or transfer
domain string
regperiod int The registration period of the domain (in years)
renewalperiod int The renewal period of the domain (in years)
dnsmanagement bool
emailforwarding bool
idprotection bool
eppcode string Available for transfer only.
isPremium bool

Response

A float to override the first payment, or an array to override first and/or recurring amounts

Example Code

<?php

add_hook('OrderDomainPricingOverride', 1, function($vars) {
    // Perform operations to determine price.
    // To override the first payment amount only simply return a float
    return '64.95';
    // To override the first payment and recurring amount, return an array as follows
    return ['firstPaymentAmount' => 64.95, 'recurringAmount' => 14.45];
});

OrderPaid

Executes when the first invoice for a new order is marked paid. This will execute in addition to the regular invoice payment hooks.

Parameters

Variable Type Notes
orderId int The unique identifier for the order
userId int The unique identifier for the client
invoiceId int The unique identifier for the invoice

Response

No response supported

Example Code

<?php
add_hook('OrderPaid', 1, function($vars) {
    // Perform hook code here...
});

OrderProductPricingOverride

Executes as a product price is being calculated in the cart.

Parameters

Variable Type Notes
key int The key for the product in the cart session
pid int The product id
proddata array The product data

Response

Product pricing can be overridden - exclusive of configurable option cost. Accepts a return of the keys ‘setup’ and ‘recurring’. eg: return array(‘setup’ => 1.00, ‘recurring’ => 12.00);

Example Code

<?php

use WHMCS\Authentication\CurrentUser;

add_hook('OrderProductPricingOverride', 1, function($vars) {
    $return = [];

    /**
     * Get the logged in client. Returns null if no client logged in.
     *
     * @see https://developers.whmcs.com/advanced/authentication/
     */
    $client = CurrentUser::client();

    /**
     * Run the following rules if a Client is logged in.
     */
    if ($client) {
        /**
         * Override the product price when ordering product 1 and the user has the ID 10.
         */
        if ($vars['pid'] == 1 && $client->id == 10) {
            $return = ['setup' => '0.00', 'recurring' => '0.00',];
        }

        /**
         * Override the product price when user has the ID 72.
         */
        if ($client->id == 72) {
            $return = ['setup' => '0.00', 'recurring' => '0.00',];
        }
    }
    return $return;
});

OrderProductUpgradeOverride

Executes as a product upgrade order is being calculated.

Parameters

Variable Type Notes
oldproductid int
oldproductname string
newproductid int
newproductname string
days int
totaldays int
newproductbillingcycle string
price float
discount float
promoqualifies bool

Response

Return any key -> value pairs of the parameters to override. eg return array(‘discount’ => 10.00,);

Example Code

<?php

use WHMCS\Carbon;

add_hook('OrderProductUpgradeOverride', 1, function($vars) {
    $return = [];

    if ($vars['newproductid'] == 15) {
        /**
         * No promotion should be applied to product 15
         */
        $return['promoqualifies'] = false;
    }
    if (Carbon::now()->toDateString() == '2016-12-25') {
        /**
         * Offer half price upgrade on Christmas Day
         * This can also be done by halving the $vars['price'] and returning that.
         */
        $return['totaldays'] = round($vars['totaldays'] / 2);
    }
    return $return;
});

OverrideOrderNumberGeneration

Executes prior to checkout. All cart information is passed to the hook.

Parameters

Variable Type Notes
products array An indexed array of product information for each product in the cart.
domains array An indexed array of domain information for each domain in the cart.

Response

Return the custom order number to be used (must be a valid numeric value).

Example Code

<?php

add_hook('OverrideOrderNumberGeneration', 1, function($vars) {
    // Generate and return a custom order number value (must be a valid integer).
    // We also recommend ensuring the custom number is unique.
    return time();
});

PendingOrder

Runs when an order is requested to be set back to pending, prior to the change of status actually occurring.

Parameters

Variable Type Notes
orderid int The order ID

Response

No response supported

Example Code

<?php
add_hook('PendingOrder', 1, function($vars) {
    // Perform hook code here...
});

PreCalculateCartTotals

Executes as the cart totals are being calculated. All cart information is passed to the hook. Examples given here.

Parameters

Variable Type Notes
products array An indexed array of product information for each product in the cart.
domains array An indexed array of domain information for each domain in the cart.

Response

No response supported

Example Code

<?php
add_hook('PreCalculateCartTotals', 1, function($vars) {
    // Perform hook code here...
});

PreFraudCheck

Parameters

Variable Type Notes
$params

Response

No response supported

Example Code

<?php
add_hook('PreFraudCheck', 1, function($vars) {
    // Perform hook code here...
});

PreShoppingCartCheckout

Executes prior to checkout. All cart information is passed to the hook.

Parameters

Variable Type Notes
products array An indexed array of product information for each product in the cart.
domains array An indexed array of domain information for each domain in the cart.

Response

No response supported

Example Code

<?php
add_hook('PreShoppingCartCheckout', 1, function($vars) {
    // Perform hook code here...
});

RunFraudCheck

Executes as the fraud module is being checked for an order.

Parameters

Variable Type Notes
orderid int
userid int

Response

Return any value to skip the fraud check

Example Code

<?php
add_hook('RunFraudCheck', 1, function($vars) {
    // Perform hook code here...
});

ShoppingCartCheckoutCompletePage

Executes when the Complete Page is displayed on checkout.

Parameters

Variable Type Notes
orderid int The ID of the order
ordernumber int The order number for the order
invoiceid int The id of the invoice for the order
ispaid bool Indicates whether the order has been paid
amount float The amount of order
paymentmethod string The payment method of the order
clientdetails array The full details for the client the order is for

Response

Return HTML to be displayed on the order complete page.

Example Code

<?php

add_hook('ShoppingCartCheckoutCompletePage', 1, function($vars) {
    /**
     * Redirect all orders to a different page after the order complete page is loaded.
     */
    return '<META http-equiv="refresh" content="5;URL=http://www.mydomain.com/ownpage.html" />';
});

ShoppingCartValidateCheckout

Executes during checkout completion, which occurs before order and invoice creation. Use this to prevent order creation and present errors to the user.

Parameters

Variable Type Notes
a string Value will be checkout.
submit string Value will be true.
promocode string If entered, a promotion code.
notes string If enabled, additional order notes
paymentmethod string The selected payment method
ccinfo string Either new or useexisting.
cctype string
ccnumber string
ccexpirymonth string
ccexpiryyear string
cccvv string
custtype string Possible values are new or existing
clientId int A non-zero value if the user is authenticated during checkout.
loginemail string Value present only when the client authenticates during checkout.
loginpassword string Value present only when the client authenticates during checkout.
firstname string Value present when the client is new.
lastname string Value present when the client is new.
companyname string Value present when client is new
email string Value present when client is new
address1 string Value present when client is new
address2 string Value present when client is new
city string Value present when client is new
state string Value present when client is new
country string Value present when client is new; two letter ISO code
tax_id string The client’s tax ID
phonenumber string Value present when client is new
password string Value present when client is new
password2 string Value present when client is new
securityqid string Value present when client is new
securityqans string Value present when client is new
customfield array Value present when client is new

Response

Return accepts both a string or an array. Use a string for single error message or an array of strings for multiple error messages.

Example Code

<?php

add_hook('ShoppingCartValidateCheckout', 1, function($vars) {
    return [
        'Error message feedback error 1',
        'Error message feedback error 2',
    ];
});

ShoppingCartValidateDomain

Executes when Domain Update is occurring

Parameters

Variable Type Notes
N/A array The REQUEST variables

Response

Return accepts both a string or an array. Use a string for single error message or an array of strings for multiple error messages.

Example Code

<?php

add_hook('ShoppingCartValidateDomain', 1, function($vars) {
    return [
        'Error message feedback error 1',
        'Error message feedback error 2',
    ];
});

ShoppingCartValidateDomainsConfig

Executes when Domain Update is occurring

Parameters

Variable Type Notes
N/A array The REQUEST variables

Response

Return accepts both a string or an array. Use a string for single error message or an array of strings for multiple error messages.

Example Code

<?php

add_hook('ShoppingCartValidateDomainsConfig', 1, function($vars) {
    return [
        'Error message feedback error 1',
        'Error message feedback error 2',
    ];
});

ShoppingCartValidateProductUpdate

Executes when Product Update is occurring

Parameters

Variable Type Notes
N/A array The REQUEST variables

Response

Return accepts both a string or an array. Use a string for single error message or an array of strings for multiple error messages.

Example Code

<?php

add_hook('ShoppingCartValidateProductUpdate', 1, function($vars) {
    return [
        'Error message feedback error 1',
        'Error message feedback error 2',
    ];
});