Накладная на три сервиса и одну витрину
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
- Дамп окружения. Отправлен POST на адрес без www, а в скрипте GET и www.
- Копия на своём хостинге. Тот же код на другом сервере отвечает без потерь. Значит, дело в окружении.
- Логи по заявке в поддержку. В error-логе редирект есть.
Владелец согласился на переезд, DNS уже меняли. «Верните ns обратно», «я походу нашёл»
Адрес без www попадал под редирект хостинга, который стоял всегда. Домен только сделал его видимым. Все запросы ушли на адрес с www, правила легли в .htaccess. 12 марта менеджер Яндекса снова поймал 401 на адресе без www, на следующий день адрес склеился в настройках дважды и дал 404. Оба раза разобрались в тот же день.
Девять из примерно пятнадцати
С 4 по 11 марта закрыл около 15 замечаний тестировщика. Подсчёт мой, формулировки настоящие.
categories.sortOrderполучаем string, ожидаем integerdescription.expiresInожидаем string, получаем nulldeliveryAddress.fullполучаем null, ожидаем stringpaymentInfo.deliveryFeeполучаем string, ожидаем numberlongtitudeопечатка, должно быть 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 вместе закрывали почти четверть экрана. Поэтому на время прокрутки верхняя панель уходит, а строка разделов догоняет.
Владелец магазина: подкатегории при прокрутке реализовали хорошо. Пересказ из переписки.
Телефон здесь реконструкция поведения: настоящих снимков нет, товары настоящие.
Арбузы и дыни
Дыня боло
Арбуз
Экзотика
Манго
Авокадо хасс
Гранат
Ягоды
Голубика 125 г
Смородина
Овощи
Помидоры узбекские
Капуста брюссельская
Зелень
Петрушка
актРасхождениячестно
Что не сошлось
- Купер. Тесты пройдены, кроме отмены и замены позиции и изменения пакетов. Функция нужна, её реализации нет.
- Обед.ру. В марте 2025 фото в каталоге снова повели на старый домен. Новый скрипт, новый файл каталога и 25 исправленных ссылок помогли, но первопричину я не нашёл. В апреле жалоба повторилась.
- Что я делал
- Восстановил две чужие интеграции, третью написал с нуля, переделал мобильный каталог. Код и выкладка на мне
- Кто ещё работал
- Владелец вёл постановку и приёмку. Замечания и тесты дали сотрудники сервисов, программист Обед.ру нашёл отличие в XML и подсказал про телефон
- Инструменты
- 1С-Битрикс, PHP, REST, JSON, XML, Postman
Что я вынес
Когда код не меняли, а всё сломалось, смотреть надо вокруг кода: домен, редиректы, настройки хостинга. Если у партнёра не работает то, что работает в Postman, сравнивать надо настоящие байты запроса. А логи приёма пишутся до запуска.
СдалНикита Митусов
Принялвладелец магазина, 13 месяцев возвращался с новыми интеграциями