API Robokassa: основные методы, подпись, webhooks

Получить CloudPayments бесплатно

API Robokassa: основные методы, подпись и webhooks — полная инструкция

![Схема Robokassa API — поток платежа от клиента к магазину и обратно]

Что такое Robokassa API и когда оно нужно

Robokassa API — это набор протоколов и правил обмена данными между вашим сайтом/приложением и платежным шлюзом RoboKassa. С его помощью вы создаете оплаты, получаете статусы, принимаете уведомления (webhook Robokassa), оформляете возвраты и фискальные чеки.

Когда используется:

  • Интернет-эквайринг для сайта, мобильного приложения и CMS.
  • Выставление счетов и прием платежей в один клик.
  • Автоматическая фискализация по 54-ФЗ и отправка чеков.
  • Интеграции с ERP/CRM (например, 1С) и кассовыми системами.

Для работы вам понадобится Личный кабинет продавца (см. также вход Robokassa) на официальном сайте провайдера (ООО Robokassa). В ЛК доступны настройки паролей/ключей, адресов Success/Fail/Result URL, параметров фискализации и интерфейс для ручных операций.

Архитектура и ключевые сущности

В основе Robokassa API — три ключевые сущности:

  • Платеж (Payment): инициируется вашим магазином и оплачивается клиентом. Подробнее о сценариях — в разделе Платежи.
  • Чек (Receipt): фискальный документ с номенклатурой, НДС и признаками расчета. Подробно — в разделе Чеки.
  • Уведомление (Webhook): асинхронный обратный вызов на ваш сервер о смене статуса платежа.

Обычно поток выглядит так:

  1. Магазин формирует заказ, считает подпись Robokassa и перенаправляет клиента на платежную форму.
  2. Клиент платит выбранным методом (карта, СБП и т. п.) — это инфраструктура интернет-эквайринга (см. Интернет‑эквайринг).
  3. Robokassa отправляет webhook на ваш Result URL с параметрами оплаты и контрольной подписью.
  4. Ваш сервер проверяет подпись, проводит заказ и возвращает «OK».
  5. Опционально формируется чек и отправляется клиенту.

Основные методы: инициация, статус, возврат

Типовой набор взаимодействий с robokassa api:

  • Инициация платежа (redirect):

    • Формирование ссылки на платежную форму с параметрами MerchantLogin, OutSum, InvId, Description, Email/Phone, пользовательскими полями (shp_), SignatureValue и др.
    • Параметры и URL берите из официальной документации в ЛК; состав подписи зависит от настроек.
  • Получение статуса:

    • Надежнее всего — через webhook Robokassa (Result URL).
    • Дополнительно можно опрашивать статус через серверный запрос (если включено), но итоговым источником истины остается webhook.
  • Возврат и отмена:

    • Полный или частичный возврат можно инициировать из ЛК или через API (если доступно в тарифе). Всегда сверяйте права и ограничения по методам возврата.
  • Фискализация:

    • Отправляйте номенклатуру, ставки НДС и сумму по позициям при оплате/возврате. Чек формируется автоматически или по вашему вызову — детали зависят от выбранных настроек в ЛК.

Пример ключевых параметров при инициации:

Параметр Назначение
MerchantLogin Логин магазина в Robokassa
OutSum Сумма оплаты (десятичная строка)
InvId ID заказа в вашей системе (уникальный номер)
Description Описание заказа (для клиента)
Email/Phone Контакты покупателя
Culture Локаль интерфейса платежной формы
Shp_* Пользовательские поля, возвращаются в webhook
SignatureValue Контрольная подпись Robokassa

Подпись Robokassa: формирование и проверка

Подпись Robokassa — главный механизм защиты целостности данных. Ее задача — гарантировать, что параметры не были изменены на пути от вашего сервера до шлюза и обратно.

Ключевые факты:

  • Алгоритм подписи выбирается в ЛК (часто используется SHA‑256; встречается MD5). Уточняйте настройки в Личном кабинете.
  • Обычно применяются две секции секретов: Password1 (для формирования ссылки/инициации) и Password2 (для проверки Result URL).
  • Пользовательские параметры, начинающиеся с shp_, почти всегда включаются в строку подписи. Порядок важен.

Упрощенная схема (пример, не подменяет официальную документацию):

  • Подпись при инициации: hash(MerchantLogin:OutSum:InvId:Password1[:shp_*…])
  • Подпись в webhook (Result URL): hash(OutSum:InvId:Password2[:shp_*…])

Рекомендации по безопасности:

  • Никогда не рассчитывайте подпись на клиенте — только на сервере.
  • Приводите регистр подписи к нижнему/верхнему согласно настройкам; часто сравнивают в нижнем регистре.
  • Храните пароли/ключи только в защищенных переменных окружения.

Мини‑пример на Python (SHA‑256):

import hashlib

def sign_initiate(merchant_login, out_sum, inv_id, password1, shp_params=None):
    parts = [merchant_login, f"{out_sum}", str(inv_id), password1]
    if shp_params:
## Включайте shp_* в порядке ключей по алфавиту, если это требуется в настройках вашей схемы подписи
        for k in sorted(shp_params):
            parts.append(f"{k}={shp_params[k]}")
    raw = ":".join(parts)
    return hashlib.sha256(raw.encode('utf-8')).hexdigest()

Webhook Robokassa (Result URL): структура, повторные уведомления, безопасность

Webhook Robokassa — это серверный запрос на ваш Result URL, который сообщает о статусе оплаты. Его необходимо валидировать по подписи и параметрам.

Что приходит в webhook (набор параметров может отличаться):

Поле Описание
OutSum Итоговая сумма платежа
InvId Ваш ID заказа
SignatureValue Подпись robokassa для проверки
Shp_* Пользовательские параметры, если передавались
Доп. поля Могут включать метод оплаты, валюту и др.

Практика обработки:

  1. Логируйте весь запрос (без секретов) для отладки.
  2. Восстановите строку для подписи и проверьте SignatureValue (используйте Password2).
  3. Проверьте соответствие суммы и валюты заказу, убедитесь, что платеж еще не обработан (идемпотентность).
  4. Проведите заказ в своей системе.
  5. Верните HTTP 200 и «OK» (или требуемую строку подтверждения) — формат ответа смотрите в документации вашего ЛК.

Повторы: webhook может прийти несколько раз (сетевые задержки, ретраи). Поэтому ваш обработчик должен быть идемпотентным: повторная обработка одного и того же InvId не должна дублировать списания/проводки.

Безопасность:

  • Проверяйте только подпись и деловую логику; доверять IP‑адресам без проверки подписи нельзя. При этом актуальные подсети провайдера обычно публикуются в ЛК.
  • Принимайте Result URL только по HTTPS.

Идемпотентность Robokassa: практики и антидублирование

Идемпотентность Robokassa — это стратегия, позволяющая безопасно обрабатывать повторные запросы и уведомления, не создавая дублей транзакций. Что стоит сделать:

  • Уникальный ключ: используйте InvId (ваш OrderID) как уникальный ключ операции.
  • Таблица состояний: храните статусы платежа (new, paid, refunded) и флаг «проведен».
  • Защита от гонок: оборачивайте обработку webhook в транзакцию БД и «select for update» по InvId.
  • Повторные вызовы: если уведомление пришло повторно, проверяйте статус — при paid просто верните OK без повторной логики.
  • Контроль суммы: проверяйте OutSum на соответствие заказу, чтобы исключить подмену.

Если API провайдера поддерживает RequestId/Idempotency-Key в заголовке — используйте. В противном случае достаточно грамотно работать с InvId и транзакциями.

Пример API Robokassa: ссылки и код

Ниже — нейтральные примеры, иллюстрирующие общий принцип. Базовые URL уточняйте в вашем ЛК.

Формирование ссылки на оплату (redirect):

## ВАЖНО: используйте URL платежной формы из вашей документации в ЛК
PAY_URL="https://auth.robokassa.ru/Merchant/Index.aspx"
## Пример cURL (GET-параметры)
curl -G "$PAY_URL" \
  --data-urlencode "MerchantLogin=demo-shop" \
  --data-urlencode "OutSum=1990.00" \
  --data-urlencode "InvId=12345" \
  --data-urlencode "Description=Оплата заказа №12345" \
  --data-urlencode "[email protected]" \
  --data-urlencode "shp_user=42" \
  --data-urlencode "SignatureValue=3f5a...d1"

Проверка подписи в webhook на PHP (пример):

<?php
function verifyWebhook($outSum, $invId, $signatureValue, $password2, $shpParams = []) {
    ksort($shpParams); // если ваша схема подписи требует сортировки shp_*
    $parts = [$outSum, $invId, $password2];
    foreach ($shpParams as $k => $v) {
        $parts[] = "$k=$v";
    }
    $raw = implode(":", $parts);
    $calc = strtolower(hash('sha256', $raw));
    return strtolower($signatureValue) === $calc;
}
?>

Мини‑сервер на Node.js (Express) для приема webhook:

const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.urlencoded({ extended: true }));

app.post('/result', (req, res) => {
  const { OutSum, InvId, SignatureValue, ...rest } = req.body;
  const shp = Object.fromEntries(Object.entries(rest).filter(([k]) => k.startsWith('shp_')));
  const password2 = process.env.RB_PWD2;
  const parts = [OutSum, InvId, password2];
  Object.keys(shp).sort().forEach(k => parts.push(`${k}=${shp[k]}`));
  const raw = parts.join(':');
  const calc = crypto.createHash('sha256').update(raw).digest('hex');

  if (calc !== String(SignatureValue).toLowerCase()) {
    return res.status(400).send('bad sign');
  }

  // идемпотентная обработка InvId ...
  // conduct order here

  return res.status(200).send('OK');
});

app.listen(3000);

Тестовый режим и фискальные чеки

  • Тестовый магазин: в ЛК обычно выдается отдельный логин и две «пароли» (Password1/Password2) для тестовой витрины. Не путайте их с боевыми.
  • Проверка чеков: в тестовом режиме формируйте номенклатуру с корректными ставками НДС, признаками способа расчета. Это упростит переход на прод.
  • Обязательные поля для чека: наименование, цена, количество, ставка НДС, предмет расчета. Подробнее см. Чеки.

Частые ошибки и отладка

  • Некорректная подпись robokassa: проверьте порядок полей, алгоритм (SHA‑256 vs MD5), регистр и участие shp_* в подписи.
  • Несовпадение суммы: передавайте денежные суммы в одном формате (строка с двумя знаками после запятой).
  • Дублирование проводки: сделайте идемпотентность на уровне БД/транзакций.
  • Webhook не приходит: убедитесь, что ваш Result URL доступен по HTTPS из внешней сети; проверьте логирование и firewall.
  • Неверный ответ Result URL: возвращайте именно ту строку/статус, которую требует документация, иначе Robokassa будет повторять уведомления.

Для вопросов — загляните в FAQ или свяжитесь через телефон службы поддержки.

Интеграции и полезные ссылки

  • Быстрый старт и подключение: страница Подключить.
  • О приемах платежей и сценариях — раздел Платежи.
  • Кассовая фискализация чеков — раздел Чеки.
  • Интеграция с 1С — готовые подходы и советы на странице 1С интеграция.
  • Подробная API‑справка — эта страница API документация.

Итоги и как подключить

Robokassa API позволяет быстро запустить прием онлайн‑платежей: от генерации безопасной ссылки до приема webhook и автоматической фискализации. Соблюдайте правила подписи Robokassa, делайте обработчики идемпотентными и не считайте секреты на клиенте — это обеспечит надежность и предсказуемость платежного потока.

Готовы принять первый платеж? Перейдите к подключению интернет‑эквайринга на странице Подключить и оформите интеграцию. Если остались вопросы, изучите FAQ или уточните детали на официальном сайте.

Получить CloudPayments бесплатно