yookassa
Введение
YooKassa (ранее Yandex.Kassa) — платёжная система, позволяющая принимать платежи банковскими картами, через электронные кошельки и другие способы.
При интеграции с EnotPro через вебхук вы сможете:
- Принимать уведомления об успешных платежах
- Автоматически начислять баланс пользователю
- Обрабатывать отмены и возвраты платежей
Типы событий YooKassa
YooKassa присылает уведомления о следующих событиях:
| Событие | Описание | Когда происходит |
|---|---|---|
| payment.succeeded | Платёж успешно завершён | Деньги списаны, можно начислять товар/услугу |
| payment.waiting_for_capture | Платёж ожидает подтверждения | Для двухстадийных платежей (холдирование) |
| payment.canceled | Платёж отменён | Пользователь отменил или истёк срок |
| refund.succeeded | Возврат успешно выполнен | Деньги вернулись пользователю |
Важно: Для большинства сценариев (одностадийные платежи) достаточно обрабатывать только
payment.succeeded.
Предварительные требования
Данные для доступа к API YooKassa
| Параметр | Где взять | Описание |
|---|---|---|
| shopId | Личный кабинет ЮKassa → Настройки магазина | Идентификатор магазина |
| secretKey | Личный кабинет ЮKassa → API-ключи | Секретный ключ для аутентификации |
| webhookUrl | Создаётся в EnotPro | URL для приёма уведомлений |
Важно: Аутентификация в API ЮKassa происходит по HTTP Basic Auth: логин =
shopId, пароль =secretKey.
Шаг 1: Создание вебхука в EnotPro
Создаём вебхук
- Перейдите в раздел
/adm → Web → Webhook. - Нажмите кнопку «Добавить».
- Название:
yookassa_payments. - Скопируйте сгенерированный URL (понадобится в личном кабинете ЮKassa).
Настраиваем разрешённые методы
| Разрешённый метод | Причина |
|---|---|
| POST | ЮKassa отправляет уведомления методом POST |
Включаем вебхук
Переключатель «Включен» → ✅.
Шаг 2: Настройка вебхука в личном кабинете ЮKassa
- Войдите в личный кабинет ЮKassa.
- Перейдите в раздел «Интеграция» → «HTTP-уведомления» (формулировка может отличаться).
Укажите URL вебхука:
https://enotpro.app/wh/xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx
- Выберите события для уведомлений (рекомендуется):
payment.succeededpayment.canceled
- Сохраните настройки.
Ссылка на официальную документацию: Настройка HTTP-уведомлений в ЮKassa
Шаг 3: Структура входящего запроса от YooKassa
Пример тела запроса для payment.succeeded
{
"type": "notification",
"event": "payment.succeeded",
"object": {
"id": "22d6d597-000f-5000-9000-145f6df21d6f",
"status": "succeeded",
"paid": true,
"amount": {
"value": "1000.00",
"currency": "RUB"
},
"created_at": "2018-07-10T14:27:54.691Z",
"description": "Пополнение баланса",
"metadata": {
"user_id": "123456789"
},
"payment_method": {
"type": "bank_card",
"card": {
"first6": "555555",
"last4": "4444",
"card_type": "MasterCard"
}
}
}
}
Доступные переменные в триггере MAIN
| Переменная | Значение | Пример |
|---|---|---|
${web.body.event} |
Тип события | payment.succeeded |
${web.body.object.id} |
ID платежа в ЮKassa | 22d6d597-000f-5000-9000-145f6df21d6f |
${web.body.object.status} |
Статус платежа | succeeded |
${web.body.object.amount.value} |
Сумма платежа | 1000.00 |
${web.body.object.amount.currency} |
Валюта | RUB |
${web.body.object.metadata.user_id} |
ID пользователя (из метаданных) | 123456789 |
${web.body.object.description} |
Описание | Пополнение баланса |
Шаг 5: Создание HTTP-ответа для YooKassa
ЮKassa ожидает получить ответ с кодом 200 OK. Если ответ не получен или код ошибки, ЮKassa будет повторять уведомления (с увеличивающимися интервалами).
Создаём HTTP-ответ в EnotPro
- Перейдите в раздел
/adm → Web → HTTP-ответы. - Нажмите «Добавить».
- Название:
yookassa_success. - Настройки:
| Параметр | Значение |
|---|---|
| Код | 200 |
| Тело | {"status": "ok"} |
| Content-Type | application/json |
Важно: ЮKassa игнорирует тело ответа, но код
200обязателен.
Шаг 6: Настройка триггеров в EnotPro
Создаём HTTP-ответ для кастомного ответа
(См. Шаг 5 выше)
Настраиваем триггер MAIN
Триггер MAIN:
Реакция 1: Условие (проверяем тип события)
→ Тип: String
→ Путь: ${web.body.event}
→ Режим: равно
→ Значение: payment.succeeded
→ Если условие НЕ выполнено:
→ SendResponse (код 200, текст "Ignored")
→ StopTrigger
Реакция 2: SetVarLocal (сохраняем данные платежа)
→ Название: payment_id
→ Значение: ${web.body.object.id}
Реакция 3: SetVarLocal
→ Название: user_id
→ Значение: ${web.body.object.metadata.user_id}
Реакция 4: SetVarLocal
→ Название: amount
→ Значение: ${web.body.object.amount.value}
Реакция 5: SendResponse (подтверждаем получение)
→ HTTP-ответ: yookassa_success
Настраиваем триггер FINISH (из HTTP-ответа yookassa_success)
Здесь выполняем длительные операции — начисление баланса, отправку сообщений.
Триггер FINISH:
Реакция 1: Проверяем, что user_id получен
→ Тип: Has
→ Путь: ${localVar.user_id}
→ Если условие НЕ выполнено:
→ Log: "Ошибка: user_id не передан в metadata"
→ StopTrigger
Реакция 2: GetVarCloud (загружаем текущий баланс)
→ Тип: person
→ Название: balance
→ user_id: ${localVar.user_id}
Реакция 3: AddVarCloud (начисляем сумму)
→ Тип: person
→ Название: balance
→ Значение: ${localVar.amount}
Реакция 4: SendMessage (уведомляем пользователя)
→ chat_id: ${localVar.user_id}
→ Текст: «Ваш баланс пополнен на ${localVar.amount} руб.»
Реакция 5: Log
→ Текст: «Платёж ${localVar.payment_id} обработан, пользователю ${localVar.user_id} начислено ${localVar.amount} руб.»
Шаг 7: Формирование запроса на создание платежа (со стороны бота)
Чтобы пользователь мог инициировать платёж, бот должен отправить запрос к API ЮKassa на создание платежа.
Параметры запроса (minimal для одностадийного платежа)
{
"amount": {
"value": "1000.00",
"currency": "RUB"
},
"capture": true,
"confirmation": {
"type": "redirect",
"return_url": "https://t.me/ваш_бот"
},
"description": "Пополнение баланса",
"metadata": {
"user_id": "123456789"
}
}
| Параметр | Описание |
|---|---|
| amount.value | Сумма платежа |
| amount.currency | Валюта (RUB) |
| capture | true — одностадийный платёж (сразу списание), false — двухстадийный (холд) |
| confirmation.type | redirect — перенаправить пользователя на платёжную страницу ЮKassa |
| confirmation.return_url | Куда вернуть пользователя после оплаты |
| metadata.user_id | Важно: ID пользователя в вашем боте (будет в вебхуке) |
| idempotence_key | Уникальный ключ для защиты от дублей (рекомендуется) |
Пример создания платежа через SendRequest
Перейдите в раздел /adm → Web → HTTP-запросы.
Создайте запрос с параметрами:
| Настройка | Значение |
|---|---|
| URL | https://api.yookassa.ru/v3/payments |
| Метод | POST |
| Заголовки | Authorization: Basic base64(shopId:secretKey) |
| Content-Type: application/json | |
| Idempotence-Key: уникальный_ключ_платежа | |
| Тело | JSON из примера выше |
В ответе ЮKassa вернёт поле confirmation.confirmation_url — на эту ссылку нужно отправить пользователя.