Типовые ошибки интеграции
Симптомы, которые чаще всего приводят в поддержку, и что их вызывает.
Мок ответил 200, но в ответе пустые поля
Почти всегда — поле лежит не на своём месте. Песочница не валидирует тело запроса: неизвестные ключи она молча игнорирует, а обязательные, которых не нашла, подставляет пустыми. Запрос выглядит успешным, но данные потеряны.
| Поле | Где лежит |
|---|---|
merchant_order_id | внутри order в POST /invoices |
merchant_contract_id | на верхнем уровне в POST /contracts, но внутри contract в POST /invoices |
InvoiceID (XML) | внутри <InvoiceInfo>, а не сразу под тегом операции |
Простая проверка: сравните эхо-поля ответа с тем, что отправили. Если merchant_order_id вернулся пустым — поле не доехало, и дальше по нему ничего не найдётся.
getInvoice не меняет статус
Так проявляется предыдущая ошибка в XML-контуре. Имитация задержки тарификации ищет InvoiceID в <InvoiceInfo>; если положить его сразу под <GetInvoiceRequest>, ответ будет приходить из заготовленного шаблона, и статус не сменится никогда. Правильная форма — в разделе «Статус инвойса».
Платёж создан, но деньги «не пришли»
Ответ createInvoice — это подтверждение приёма, а не результат тарификации. Исход наступает позже: в песочнице — через test_info. (по умолчанию 10 секунд), в XML-контуре getInvoice переключается на Processed / PAID через 6 секунд после первого запроса статуса. Ориентируйтесь на status и payment_status, а не на факт успешного создания.
Ошибка подписи
| Причина | Как проверить |
|---|---|
| Локальное время вместо UTC | Самая частая. Метка времени всегда UTC, даже если сервер живёт в другом поясе |
| Формат метки перепутан между протоколами | XML — yyyyMMddHHmmss, JSON — ISO-8601. Подпись считается по той строке, которую вы реально отправляете |
| Подписан один timestamp, отправлен другой | Не вызывайте «получить текущее время» дважды: посчитайте один раз и используйте и в подписи, и в запросе |
| base64 вместо hex | Обе HMAC-операции дают hex в нижнем регистре |
| Перепутан порядок конкатенации | login + inner, не наоборот. Сверьтесь с пошаговым примером в «Подписи запросов» |
| Часы сервера ушли | Допуск ±20 минут; при большем дрейфе приходит AUTH_INVALID_TIMESTAMP |
Коллбек не приходит
Проверяйте по порядку: настроен ли callback URL у проекта (в песочнице его задают администраторы); прошла ли задержка первой отправки; отвечает ли ваш обработчик 2xx — всё остальное считается неуспехом, включая редирект, который песочница не выполняет; не закрыт ли ваш адрес фаерволом со стороны песочницы. Помните, что в XML-контуре приходит только уведомление о платеже — возврата и событий контракта там нет вовсе.