Ошибка несовпадения подписи (bad sign) — самая частая причина потери платежей при интеграции Robokassa. Недавно к нам обратился интернет-магазин: 20% транзакций не доходили до статуса paid. Мы выяснили — в обработчике ResultURL использовался Password1 вместо Password2. Это стоило им около 150 тысяч рублей недополученной выручки за месяц. Наша команда имеет опыт более 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 — основной источник. Получите консультацию — напишите нам, настроим приём платежей надёжно.







