Приём платежей через ЮKassa
Как устроены готовые платежи, вебхуки и Telegram-уведомления в Vixy.
Что нужно подключить
В редакторе откройте «Данные → Интеграции» и подключите ЮKassa. Для уведомлений об оплате дополнительно подключите Telegram. Секретные ключи шифруются и не попадают в файлы сайта.
Перед подключением получите Shop ID и секретный ключ в кабинете ЮKassa. Не отправляйте их в чат и не добавляйте в .env или React-файлы проекта.
Обязательная настройка HTTP-уведомлений
После сохранения Shop ID и секретного ключа подключение ещё не закончено. Для обычного магазина ЮKassa не разрешает Vixy автоматически создавать вебхуки: API управления вебхуками доступно только партнёрским приложениям с OAuth.
Настройте уведомления вручную:
- В карточке ЮKassa в Vixy скопируйте показанный URL обработчика.
- Откройте личный кабинет ЮKassa.
- Перейдите в «Интеграция → HTTP-уведомления».
- Вставьте скопированный URL.
- Включите события
payment.succeededиpayment.canceled. - Сохраните настройки.
Используйте именно URL, показанный в карточке интеграции текущего окружения. Для production он выглядит так:
https://vixy.dev/api/integrations/yookassa/webhook
Локальный адрес localhost нельзя указать в ЮKassa: обработчик должен быть доступен из интернета по HTTPS. Поэтому полноценную проверку входящего уведомления выполняйте после деплоя или через отдельный публичный HTTPS-туннель.
Зелёная отметка в Vixy подтверждает только то, что Shop ID и секретный ключ проверены и сохранены. Она не подтверждает настройки в личном кабинете ЮKassa.
Таблица товаров
Платёжный сценарий использует таблицу products. У товара должны быть:
id— идентификатор записи;nameилиtitle— название;price— цена в рублях числом, например1490или1490.50;active— необязательный флаг доступности.
Поле price должно содержать число без символа валюты и пробелов. Значения "1 490 ₽" и "по запросу" не подходят для серверного расчёта.
Сайт передаёт серверу только идентификаторы товаров и количество. Итоговую сумму Vixy рассчитывает заново по данным таблицы — передать произвольную цену из браузера нельзя.
Создание платежа
const checkoutId = crypto.randomUUID();
const { data, error } = await vixy.integrations.yookassa.createPayment({
checkoutId,
items: cart.map((item) => ({
productId: item.id,
quantity: item.quantity,
})),
returnUrl: window.location.href,
customer: { name, email, phone },
});
if (error) throw new Error(error.message);
localStorage.setItem("vixy:lastOrderId", data.orderId);
window.location.assign(data.confirmationUrl);
checkoutId обеспечивает идемпотентность: повтор одного запроса не создаёт второй платёж.
Создавайте checkoutId один раз на попытку оформления и блокируйте кнопку, пока запрос выполняется. Если соединение оборвалось, повторите запрос с тем же идентификатором.
Проверка после возврата
const orderId = localStorage.getItem("vixy:lastOrderId");
const { data, error } = await vixy.integrations.yookassa.getPayment(orderId);
if (data?.status === "succeeded") {
// Показать покупателю успешную оплату.
}
Статус читается не из параметров адресной строки, а повторно проверяется через API ЮKassa.
Обрабатывайте как минимум три состояния:
succeeded— оплата подтверждена;pending— платёж ещё обрабатывается, можно повторить проверку;canceled— платёж отменён, предложите повторить оформление.
Сетевая ошибка не означает отмену или успех. Покажите нейтральное сообщение и разрешите повторную проверку по сохранённому orderId.
Что делает Vixy на сервере
- Проверяет товары и рассчитывает сумму по БД проекта.
- Создаёт идемпотентный платёж в ЮKassa.
- Сохраняет заказ в изолированном хранилище проекта.
- Принимает вебхук и повторно запрашивает платёж у ЮKassa.
- Сверяет проект, заказ, идентификатор платежа, валюту и сумму.
- Фиксирует подтверждённый статус.
- Если подключён Telegram, отправляет уведомление об оплате.
AI не создаёт и не изменяет этот серверный код. Он только подключает интерфейс сайта к проверенному SDK Vixy.
Проверка перед публикацией
- Создайте товар с небольшой тестовой ценой.
- Проверьте, что URL и события сохранены в разделе HTTP-уведомлений кабинета ЮKassa.
- Добавьте его в корзину и проверьте изменение количества.
- Убедитесь, что двойное нажатие не создаёт два заказа.
- Завершите оплату и дождитесь статуса
succeeded. - Обновите страницу результата: успешный статус должен сохраниться.
- Проверьте уведомление Telegram, если сервис подключён.
- Выполните отменённый платёж и проверьте понятное сообщение покупателю.
Частые ошибки
«Сначала подключите ЮKassa» — откройте «Данные → Интеграции» и проверьте реквизиты.
Товар не найден — productId из корзины не совпадает с id записи в таблице products.
Некорректная цена — поле price отсутствует, содержит текст или товар отключён.
Страница результата всегда показывает успех — интерфейс доверяет URL вместо вызова getPayment(orderId).