---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://pay.yandex.ru/docs/en/custom/web-sdk/order-update.md
  - https://pay.yandex.ru/docs/ru/custom/web-sdk/order-update.md
  - href: ru/custom/web-sdk/order-update.md
    type: text/markdown
    title: Markdown version
  - href: ../../llms.txt
    type: text/markdown
    title: llms.txt
title: "Динамическое обновление цены\_— изменение суммы заказа в реальном времени | Документация"
description: API для изменения стоимости заказа после создания. Корректировка цены, добавление доставки и скидок в процессе оформления.
---
> **Documentation Index:** Fetch the complete configuration index at https://pay.yandex.ru/docs/ru/llms.txt


# Обновление стоимости заказа

После создания платежной сессии иногда возникает необходимость обновить стоимость заказа.

Стоимость влияет на доступность оплаты через Сплит. Поэтому при изменении стоимости заказа важно обновлять стоимость на кнопке Яндекс Пэй, чтобы пользователь имел актуальную информацию о доступности Сплита.

Обычно обновление корзины — это асинхронное действие, которое по шагам выглядит так:

1. Пользователь меняет состав корзины (или конечную сумму заказа).
2. Продавец обновляет данные у себя на сервере.
3. Продавец обновляет данные в платежной сессии Яндекс Пэй.

Проблема в том, что пользователь может начать процесс оплаты где-то между 1 и 2 пунктом, не дождавшись обновленных данных. Таким образом, он нажмет на кнопку и откроет форму Яндекс Пэй, ожидая воспользоваться Сплитом, однако Сплит может быть недоступен для обновленной суммы заказа.

Чтобы избежать подобной ситуации, нужно обновлять корзину с блокировкой кнопки Яндекс Пэй на время обновления.

Метод `paymentSession.update` принимает в качестве аргумента функцию (которая тут же выполняется), результатом работы которой ожидается `Promise`. Кнопка блокируется до резолва `Promise`.

## Пример {#example}

<!-- TODO: w-sdk-snippets-1 -->

<!-- source: ru/custom/web-sdk/_snippets/cart-update--v4.mdx -->
<!-- markdownlint-disable -->

<div class="ypd-preview ypd-preview_with-source">
    <a href="https://yastatic.net/s3/pay-static/docs/v46.0.0/custom/cart-update--v4/index.html" target="_blank">
        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M18 19H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h5c.55 0 1-.45 1-1s-.45-1-1-1H5c-1.11 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-6c0-.55-.45-1-1-1s-1 .45-1 1v5c0 .55-.45 1-1 1zM14 4c0 .55.45 1 1 1h2.59l-9.13 9.13c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0L19 6.41V9c0 .55.45 1 1 1s1-.45 1-1V3h-6c-.55 0-1 .45-1 1z"></path></svg>
    </a>
    <iframe src="https://yastatic.net/s3/pay-static/docs/v46.0.0/custom/cart-update--v4/index.html" style="height: 200px"></iframe>
</div>

```javascript
function onYaPayLoad() {
    const YaPay = window.YaPay;
    let activeSession = null;

    // Данные платежа
    const paymentData = {
        env: YaPay.PaymentEnv.Sandbox,
        version: 4,
        currencyCode: YaPay.CurrencyCode.Rub,
        merchantId: '<YOUR_MERCHANT_ID>',
        totalAmount: '7990.00',
        availablePaymentMethods: ['CARD', 'SPLIT'],
    };

    // Обработчик на клик по кнопке
    // Функция должна возвращать промис которые резолвит ссылку на оплату полученную от бэкенда Яндекс Пэй
    // Подробнее про создание заказа: https://pay.yandex.ru/ru/docs/custom/backend/yandex-pay-api/order/merchant_v1_orders-post
    async function onPayButtonClick() {
        /* Создание заказа... */
    }

    // Создаем платежную сессию
    YaPay.createSession(paymentData, {
        onPayButtonClick: onPayButtonClick,
    })
        .then(function (paymentSession) {
            activeSession = paymentSession;
            paymentSession.mountButton(document.querySelector('#button_container'), {
                type: YaPay.ButtonType.Pay,
                theme: YaPay.ButtonTheme.Black,
                width: YaPay.ButtonWidth.Auto,
            });
        })
        .catch(function (err) {
            // Не получилось создать платежную сессию.
        });

    // Эмуляция обновления корзины
    //   apiRequestPromise — Promise api-запроса на обновление корзины на сервисе
    onOrderUpdate(function (apiRequestPromise) {
        if (!activeSession) {
            return console.log('Payment session is not created');
        }

        const newAmount = getNewAmount();

        // Обновляем корзину с блокировкой кнопки
        activeSession.update(async function () {
            await apiRequestPromise;

            return {
                totalAmount: newAmount,
            };
        });
    });
}

/**
 * Сопроводительные функции для иллюстрации работы
 */

function getNewAmount() {
    const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;

    const price = 7990;
    const count = randomInt(1, 20);

    return `${price * count}.00`;
}

function onOrderUpdate(cb) {
    const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

    const updateButton = document.querySelector('#update_order_button');

    updateButton.addEventListener('click', function () {
        // Эмуляция Promise'a запроса на обновление корзины на сервере
        const apiRequestPromise = wait(2000);

        cb(apiRequestPromise);
    });
}

```
<!-- endsource: ru/custom/web-sdk/_snippets/cart-update--v4.mdx -->
