Ошибка несовпадения подписи (bad sign) — самая частая причина потери платежей при интеграции Robokassa. Недавно к нам обратился интернет-магазин: 20% транзакций не доходили до статуса paid. Мы выяснили — в обработчике ResultURL использовался Password1 вместо Password2. Это стоило им около $1.4k–1.9k недополученной выручки за месяц. Наша команда имеет опыт более 50 интеграций платёжных систем, что позволяет избежать подобных ошибок. Свяжитесь с нами — настроим приём платежей без потерь.
При redirect-схеме Robokassa сайт формирует ссылку с подписью на Password1, а коллбэк ResultURL проверяет подпись на Password2. Перепутать — потерять деньги. Мы гарантируем корректную настройку всех подписей и идемпотентность обработчика. В этой статье разберём, как настроить приём платежей без потерь, какие подводные камни встречаются и как гарантировать стабильную работу даже при пиковых нагрузках.
Как избежать ошибки подписи при интеграции Robokassa?
Подпись — MD5 от строки с параметрами. Порядок: Login:OutSum:InvId:Receipt(если есть):Password1/2. Частая ошибка — лишние пробелы или неверный порядок. Мы применяем hash_equals для сравнения и логируем входящие параметры. Как отмечается в документации Robokassa: "Подпись — это строка, полученная из параметров запроса, перечисленных в определённом порядке". Использование разных паролей — Password1 для формирования ссылки и Password2 для проверки уведомлений — ключевой момент. Для отладки включите логирование всех входящих параметров в ResultURL. Проверьте, что пароли в конфиге соответствуют тем, что указаны в личном кабинете Robokassa.
Почему фискализация обязательна для интернет-магазина?
Без фискализации невозможно легально принимать платежи от физических лиц по 54-ФЗ. Robokassa поддерживает облачную кассу, что в 2 раза быстрее, чем аренда собственной. Чек передаётся в параметре Receipt при формировании ссылки. Подпись при наличии Receipt считается как MD5(Login:OutSum:InvId:urlencode(Receipt):Password1). Порядок критичен. Проверить корректность подписи можно, сравнив сгенерированную подпись с полученной в колбэке. Используйте hash_equals для защиты от timing-атак. Логируйте входящие параметры для диагностики.
Как обработать ResultURL идемпотентно?
Robokassa повторяет запросы, пока не получит OK{InvId}. Если статус уже изменён, повторное обновление вызовет ошибку. Мы используем атомарные обновления с блокировкой строки БД. Использование queue worker для обработки колбэков в 3 раза надёжнее синхронного подхода, так как позволяет избежать таймаутов при высокой нагрузке.
public function result(Request $request): Response { $outSum = $request->input('OutSum'); $invId = $request->input('InvId'); $received = strtolower($request->input('SignatureValue')); // Проверяем подпись с Password2 $expected = strtolower(md5("{$outSum}:{$invId}:" . env('ROBOKASSA_PASS2'))); if (!hash_equals($expected, $received)) { return response('bad sign', 400); } $order = Order::findOrFail($invId); // Дополнительно проверяем сумму if (abs((float)$outSum - $order->total) > 0.01) { return response('amount mismatch', 400); } $order->update(['status' => 'paid']); // Robokassa ожидает ответ строго в формате "OK{InvId}" return response("OK{$invId}"); } Если Robokassa не получает OK{InvId}, уведомление повторяется. Именно поэтому обработчик должен быть идемпотентным: повторный запрос с тем же InvId не должен менять статус заново.
Что делать при ошибке фискализации?
Некорректная фискализация — вторая по частоте причина отказов. Чек передаётся в параметре Receipt (JSON, URL-encode). Структура: sno, items с sum, tax, payment_method. Ошибка в формате — отказ в проведении. Мы подключаем тестовый прогон до боя, чтобы проверить корректность данных. Обязательно используйте тестовый режим Robokassa с реальными данными, но без списания средств.
Пошаговая инструкция по интеграции Robokassa
- Зарегистрируйте магазин в личном кабинете Robokassa и получите логин и пароли.
- Установите тестовый режим: все транзакции будут тестовыми, но с реальными подписями.
- Реализуйте формирование ссылки на оплату: передайте
OutSum,InvId,Receipt(если нужна фискализация) и подпишите строкуPassword1. - Напишите обработчик ResultURL: проверьте подпись (через
Password2), сумму, обновите статус заказа и вернитеOK{InvId}. - Настройте SuccessURL и FailURL для возврата пользователя на сайт.
- Протестируйте сценарии: успешная оплата, отмена, ошибка подписи, повторный коллбэк.
- Переключите магазин на боевой режим и настройте мониторинг коллбэков.
Процесс работы
| Этап | Что делаем | Результат |
|---|---|---|
| Аналитика | Изучаем специфику магазина, способы оплаты, требования 54-ФЗ | Документ с архитектурой |
| Проектирование | Схема запросов, обработчики, обработка ошибок | Спецификация интерфейса |
| Реализация | Код на Laravel/PHP: формирование ссылки, ResultURL, SuccessURL | Готовый модуль |
| Тестирование | Тестовый режим Robokassa, имитация платежей | Отчёт о прохождении кейсов |
| Деплой | Перенос на бой, настройка мониторинга, обучение команды | Работающая интеграция |
Сроки и стоимость
Интеграция занимает от 2 до 5 дней в зависимости от сложности (фискализация, маркетплейс). Стоимость рассчитывается индивидуально после анализа.
Типичные ошибки и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| Bad sign | Неверный пароль или порядок параметров | Проверить Password1/Password2, формат MD5 |
| Повторная оплата | Неидемпотентный обработчик | Проверять статус заказа, блокировать запись |
| Ошибка фискализации | Неправильный JSON Receipt | Сверить поля с документацией |
| Таймаут при оплате | Долгий Response | Ответить OK{InvId} сразу, обработку перенести в очередь |
Что входит в работу
- Доступ к личному кабинету Robokassa с настроенными ключами
- Документация по интеграции (схема запросов, обработчики)
- Исходный код модуля с комментариями
- Обучение вашей команды (1 час онлайн)
- Поддержка 2 недели после деплоя
Опыт нашей команды — более 50 успешных интеграций платёжных систем, 10+ лет на рынке. Документация Robokassa — основной источник. Получите консультацию — напишите нам, настроим приём платежей надёжно.







