Skip to content

Basket Payments API

Feature name: basket

Api name: basketPaymentsApi


API used to perform actions related to payments in a basket like getting available payment options, adding payment info or validating the payment section.

classDiagram
direction LR
    class select["select$"]
    class selectAvailable["selectAvailable$"]
    class selectSelectedPayment["selectSelectedPayment$"]
    class selectActivePaymentCost["selectActivePaymentCost$"]
    class selectSectionValidation["selectSectionValidation$"]

    BasketPaymentsAPI --> get
    BasketPaymentsAPI --> select
    BasketPaymentsAPI --> getAvailable
    BasketPaymentsAPI --> selectAvailable
    BasketPaymentsAPI --> setPayment
    BasketPaymentsAPI --> setPaymentData
    BasketPaymentsAPI --> getSelectedPayment
    BasketPaymentsAPI --> selectSelectedPayment
    BasketPaymentsAPI --> getActivePaymentCost
    BasketPaymentsAPI --> selectActivePaymentCost
    BasketPaymentsAPI --> getPaymentChannelStrategy
    BasketPaymentsAPI --> addPaymentChannelStrategy
    BasketPaymentsAPI --> addPaymentInfo
    BasketPaymentsAPI --> getPaymentInfo
    BasketPaymentsAPI --> getSectionValidation
    BasketPaymentsAPI --> selectSectionValidation

    class BasketPaymentsAPI {
        get() BasketPayment[]
        select() Observable~BasketPayment[]~
        getAvailable() BasketPayment[]
        selectAvailable() Observable~BasketPayment[]~
        setPayment(payment: BasketPayment) Promise~void~
        setPaymentData(payment: BasketPayment, paymentData: Record~string, unknown~) Promise~void~
        getSelectedPayment() BasketPayment|undefined
        selectSelectedPayment() Observable~BasketPayment|undefined~
        getActivePaymentCost() FullPrice|undefined
        selectActivePaymentCost() Observable~FullPrice|undefined~
        getPaymentChannelStrategy(channelKey?: string) IPaymentChannel
        addPaymentChannelStrategy(channelKey: string, paymentChannel: IStrategy~void, IPaymentChannel~) void
        addPaymentInfo(payment: BasketPayment, template: HTMLTemplateElement|string) void
        getPaymentInfo(payment: BasketPayment) HTMLTemplateElement|undefined
        getSectionValidation() TSectionValidation
        selectSectionValidation() Observable~TSectionValidation~
    }

    link get "methods/get/"
    link select "methods/select/"
    link getAvailable "methods/get-available/"
    link selectAvailable "methods/select-available/"
    link setPayment "methods/set-payment/"
    link setPaymentData "methods/set-payment-data/"
    link getSelectedPayment "methods/get-selected-payment/"
    link selectSelectedPayment "methods/select-selected-payment/"
    link getActivePaymentCost "methods/get-active-payment-cost/"
    link selectActivePaymentCost "methods/select-active-payment-cost/"
    link getPaymentChannelStrategy "methods/get-payment-channel-strategy/"
    link addPaymentChannelStrategy "methods/add-payment-channel-strategy/"
    link addPaymentInfo "methods/add-payment-info/"
    link getPaymentInfo "methods/get-payment-info/"
    link getSectionValidation "methods/get-section-validation/"
    link selectSectionValidation "methods/select-section-validation/"

Get API

To get the Basket Payments API use its name basketPaymentsApi with the getApiSync method.

useStorefront(async (storefront) => {
    const basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
});

This API is not automatically initialized. Unless you initialize it by hand, you won't be able to fetch the API. To do it you can use the registerDynamic method from the Feature System API. Here is an example on how to do it:

useStorefront(async (storefront) => {
    const featureSystemApi = this.getApiSync('FeatureSystemApi');
    await featureSystemApi.registerDynamic('basket');

    const basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
});

Methods

Event Bus events

This API listens to the following events with the Event Bus:

Additionally, methods of this API listen to the following events:

Example

In this example, we use the basketPaymentsApi to retrieve the currently selected payment option.

useStorefront(async (storefront) => {
    let basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');

    if (!basketPaymentsApi) {
        const featureSystemApi = this.getApiSync('FeatureSystemApi');
        await featureSystemApi.registerDynamic('basket');

        basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
    }

    const selectedPayment = basketPaymentsApi.getSelectedPayment();

    if (selectedPayment) {
        console.log('Selected payment option:', selectedPayment);
    } else {
        console.log('No payment option has been selected.');
    }
});

Example

In this example, we subscribe to the selectAvailable$ observable to monitor available payment options.

useStorefront(async (storefront) => {
    let basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');

    if (!basketPaymentsApi) {
        const featureSystemApi = this.getApiSync('FeatureSystemApi');
        await featureSystemApi.registerDynamic('basket');

        basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
    }

    const availablePaymentOptions$ = basketPaymentsApi.selectAvailable$();

    availablePaymentOptions$.subscribe((availablePaymentOptions) => {
        console.log('Updated available payment options:', availablePaymentOptions);
    });
});

Example

In this example, we use the basketPaymentsApi to validate the payment section of the basket's shipping configuration.

useStorefront(async (storefront) => {
    let basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');

    if (!basketPaymentsApi) {
        const featureSystemApi = this.getApiSync('FeatureSystemApi');
        await featureSystemApi.registerDynamic('basket');

        basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
    }

    const validationResults = basketPaymentsApi.getSectionValidation();

    console.log('Payment section validation:', validationResults);
});

Example

In this example, we use the basketPaymentsApi to retrieve the payment channel strategy for a given channel key.

useStorefront(async (storefront) => {
    let basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');

    if (!basketPaymentsApi) {
        const featureSystemApi = this.getApiSync('FeatureSystemApi');
        await featureSystemApi.registerDynamic('basket');

        basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
    }

    const channelKey = 'paypal';
    const paymentChannelStrategy = basketPaymentsApi.getPaymentChannelStrategy(channelKey);

    console.log(`Payment channel strategy for ${channelKey}:`, paymentChannelStrategy);
});

Example

In this example, we use the basketPaymentsApi to set a selected payment option for the basket shipping.

For this example let's assume we have a list of shippings with elements that have an id attribute representing the id of a specific payment option. To achieve that you can use the getAvailable method and render elements based on the data it returns.

Let's assume such HTML structure:

    <div class="shipping-details">
        <div data-shipping-option id="1">
            Shipping details 1
        </div>
        <div data-shipping-option id="2">
            Shipping details 2
        </div>
        <div data-shipping-option id="3">
            Shipping details 3
        </div>
    </div>

We can select elements using the querySelectorAll method and attach an event listener to each of them which sets a new payment option like this:

useStorefront(async (storefront) => {
    let basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');

    if (!basketPaymentsApi) {
        const featureSystemApi = this.getApiSync('FeatureSystemApi');
        await featureSystemApi.registerDynamic('basket');

        basketPaymentsApi = storefront.getApiSync('basketPaymentsApi');
    }

    const $shippingOptionsArray = [...document.querySelectorAll('div[data-shipping-option]')];

    $shippingOptionsArray.forEach(($shippingOption) => {
        $shippingOption.addEventListener('click', async function(ev) {
            const $target = ev.target;

            const availablePaymentOptions = basketPaymentsApi.getAvailable();

            const selectedPaymentOption = availablePaymentOptions.find(({ id }) => id === $target.id);

            try {
                await basketPaymentsApi.setPayment(selectedPaymentOption);
                console.log('Payment option set successfully.');
            } catch (error) {
                console.error('Error setting payment option:', error);
            }
        });
    });
});

APIs reference