Никита Митусов Обсудить задачу
лист 1

Накладная на три сервиса и одну витрину

ViVaDa

Получатель
Доставка фруктов, овощей и зелени по Москве и области, сайт на 1С-Битрикс
Основание
Яндекс Еда перестала получать токен, хотя код никто не трогал. Нашёл, где POST теряет тело, вернул две чужие интеграции и с нуля написал третью.
Период
март 2024 – апрель 2025
№НаименованиеЯзыкКодПринято
1 Яндекс Еда REST и JSON чужой, починил 14.03.2024
2 Обед.ру XML, изображаем кассу чужой, починил 28.03.2024
3 Купер JSON и события с нуля 30.09.2024
4 Витрина на телефоне вёрстка каталога с нуля 31.03.2024

Магазин один, а каждый сервис говорит по-своему. Нажми позицию, она развернётся ниже.

поз. 1Яндекс Едамарт 2024

Письмо вскрыли по дороге

Интеграция работала два года. Потом смена домена, полгода простоя, и на перезапуске Яндекс получил 401 на запрос токена. Изменился только домен.

Отправь запрос сам

Что увидел скрипт

REQUEST_METHOD: GET
HTTP_HOST: www.vivada.ru
тело запроса: пусто

Яндекс получил 401. Код проверяет метод, ни одна ветка не срабатывает.

Строки с GET из настоящего дампа, март 2024.

Три доказательства, потом один DNS

  1. Дамп окружения. Отправлен POST на адрес без www, а в скрипте GET и www.
  2. Копия на своём хостинге. Тот же код на другом сервере отвечает без потерь. Значит, дело в окружении.
  3. Логи по заявке в поддержку. В error-логе редирект есть.

Владелец согласился на переезд, DNS уже меняли. «Верните ns обратно», «я походу нашёл»

Адрес без www попадал под редирект хостинга, который стоял всегда. Домен только сделал его видимым. Все запросы ушли на адрес с www, правила легли в .htaccess. 12 марта менеджер Яндекса снова поймал 401 на адресе без www, на следующий день адрес склеился в настройках дважды и дал 404. Оба раза разобрались в тот же день.

Девять из примерно пятнадцати

С 4 по 11 марта закрыл около 15 замечаний тестировщика. Подсчёт мой, формулировки настоящие.

  • categories.sortOrderполучаем string, ожидаем integer
  • description.expiresInожидаем string, получаем null
  • deliveryAddress.fullполучаем null, ожидаем string
  • paymentInfo.deliveryFeeполучаем string, ожидаем number
  • longtitudeопечатка, должно быть longitude
  • "deliveryDate": "dt-2"ломалось при правке заказа в админке, мой недосмотр
  • код 112оплаченный заказ не отменяется: Битрикс не удаляет заказ с активной оплатой
  • отменаудаляла заказ. Теперь статус, запись остаётся
  • 7959 и 7960повторный запрос создавал дубль. Теперь тот же orderId

Тестировщик Яндекса: по логам всё хорошо, можно запускаться. Пересказ из переписки.

поз. 2Обед.румарт 2024

Касса, которой нет

Обед.ру принимает заказы по протоколу кассовой программы FastOperator. Кассы у магазина нет, поэтому сайт на Битриксе притворяется ею по адресу /obed/FastOperator.asmx/AddOrder.

Неделя с ответом 200 и пустым телом

18.03тесты проходят
20.03боевой заказ дошёл
21.03следующий пропал, на почту тоже не пришёл200
22.03Обед.ру видит статус 200 и пустой ответ200
25.03в Postman и curl то же тело работает. Программист Обед.ру переписал отправку на Guzzle, картина та же200
27.03боевой заказ прошёл сам. Программист Обед.ру: Order уходит чистым XML, в Postman такое не отправить
28.03воспроизвёл: XML разобран, заказа нет, ошибки нет. Его подсказка: проверьте телефон
28.03разбор телефона переписан, заказ 8025 прошёл, магазин на витрине

Скрипт приёма молча не создавал заказ, если не разобрал телефон, и отвечал 200 с пустым телом.

Неделю я считал, что проблема у партнёра. Она была в принимающем скрипте, который я унаследовал. Логов приёма в нём не было, программист Обед.ру справедливо попросил их сделать. Главные наблюдения тоже его: чистый XML и телефон. Отлаживали вместе.

14 статусов кассы, 6 статусов магазина

Наведи или нажми на статус. Обед.ру опрашивает статус примерно раз в 5 минут.

поз. 3Куперсентябрь – октябрь 2024

Ноль, которого нельзя поставить

Эту интеграцию я написал с нуля: выгрузка контента JSON-ами, приём заказов, события обратно. 13 дней от входа в общий чат до завершения. Упёрлись в одно место. Попробуй отменить манго.

Заказ в Битриксе

  • Помидоры узбекские, 0,5 кг2
  • Манго
    1
  • Голубика 125 г1

Чтобы отменить позицию, Купер просит поставить ей количество 0.

Что ждёт Купер

{ "id": 1, "quantity": 2 }
{ "id": 2, "quantity": 0 }
{ "id": 3, "quantity": 1 }

Яндекс: строки нет, значит удалена.
Купер: строка на месте, количество 0.
Битрикс: вес и количество обязаны быть больше 0, а удалённой строки уже нет.

Можно было хранить удалённые позиции отдельно и подставлять при отправке, но владелец попросил ничего не менять в Битриксе: за него держатся другие интеграции. Запустились без отмены и замены позиции. Отмена заказа работает.

Цена за квант

Помидоры продаются по 0,5 кг, а в Купер ушла цена за килограмм. Владелец заметил 6 октября. 7–8 октября я разобрал товар и спросил формулу, ответ пришёл 17-го, и верные цены ушли в тот же день. Ждали ответа, правка заняла день.

900 ₽ за кг × 0,5 кг900 ₽ 450 ₽

order.createdorder.in_workorder.ready_for_deliveryorder.canceled

События 30 сентября, проход на бою. Тестовый заказ сам отменяется через 10 минут, поэтому в логе был 422, разобрали на месте.

Куратор Купера: все тесты пройдены, на проде обмен работает, интеграция завершена. Пересказ из переписки.

поз. 4Витрина на телефонемарт 2024

Строка, которая догоняет

Отдельная работа рядом с интеграциями, две недели в марте. Переделал каталог vivada.ru под телефон: подкатегории наверху, товары на одной странице, строка разделов едет вместе с прокруткой.

Панель с логотипом 65 px и панель разделов 86 px вместе закрывали почти четверть экрана. Поэтому на время прокрутки верхняя панель уходит, а строка разделов догоняет.

Владелец магазина: подкатегории при прокрутке реализовали хорошо. Пересказ из переписки.

Телефон здесь реконструкция поведения: настоящих снимков нет, товары настоящие.

ViVaDa

Арбузы и дыни

Дыня боло

Арбуз

Экзотика

Манго

Авокадо хасс

Гранат

Ягоды

Голубика 125 г

Смородина

Овощи

Помидоры узбекские

Капуста брюссельская

Зелень

Петрушка

актРасхождениячестно

Что не сошлось

  1. Купер. Тесты пройдены, кроме отмены и замены позиции и изменения пакетов. Функция нужна, её реализации нет.
  2. Обед.ру. В марте 2025 фото в каталоге снова повели на старый домен. Новый скрипт, новый файл каталога и 25 исправленных ссылок помогли, но первопричину я не нашёл. В апреле жалоба повторилась.
Что я делал
Восстановил две чужие интеграции, третью написал с нуля, переделал мобильный каталог. Код и выкладка на мне
Кто ещё работал
Владелец вёл постановку и приёмку. Замечания и тесты дали сотрудники сервисов, программист Обед.ру нашёл отличие в XML и подсказал про телефон
Инструменты
1С-Битрикс, PHP, REST, JSON, XML, Postman

Что я вынес

Когда код не меняли, а всё сломалось, смотреть надо вокруг кода: домен, редиректы, настройки хостинга. Если у партнёра не работает то, что работает в Postman, сравнивать надо настоящие байты запроса. А логи приёма пишутся до запуска.

СдалНикита Митусов

Принялвладелец магазина, 13 месяцев возвращался с новыми интеграциями

Нужно похожее? Доработка и поддержка: от 3 000 ₽