Перейти к содержимому

Доставка СДЭК

Доставку СДЭК считает и оформляет сервер платформы на ключах продавца. Витрина показывает виджет СДЭК, передаёт выбор покупателя и выводит цену и срок. Ключи продавца в браузер не попадают.

  1. Витрина запрашивает cdekWidgetParams и открывает виджет СДЭК с этими параметрами. null — СДЭК у магазина не настроен, доставку не предлагайте.

  2. Покупатель выбирает пункт выдачи или адрес. Виджет ходит за пунктами и ценами в сервис виджета платформы.

  3. Витрина вызывает setCdekDelivery с выбором. Сервер сам узнаёт у СДЭК цену и назначает заказу доставку.

  4. Перед оплатой витрина повторяет setCdekDelivery с тем же выбором. Сервер пускает заказ в оплату только со свежей ценой.

  5. После оплаты сервер создаёт отправление в СДЭК (если продавец включил автосоздание) и позже получает номер для отслеживания.

query CdekWidgetParams {
cdekWidgetParams {
senderCityCode
tariffs { office door }
parcels { length width height weight }
}
}
Поле Что это
senderCityCode Код города отправки СДЭК
tariffs.office Тарифы до пункта выдачи, которые разрешил продавец
tariffs.door Тарифы до двери
parcels Места текущей корзины с габаритами (см) и весом (г) — для расчёта в виджете

По умолчанию тарифы — 136 и 234 до пункта выдачи, 137 и 233 до двери. Продавец меняет их в Настройки → Доставка СДЭК.

Места собираются из корзины по правилам продавца: габариты берутся с варианта товара, недостающие — из умолчаний магазина. Небольшой заказ едет по единице на место, крупный укладывается в минимальное число коробок.

Виджет СДЭК 4.x ищет пункты выдачи и считает цены через сервис на стороне магазина. На платформе это:

https://api.fluttrium.store/cdek/widget?channel=<токен магазина>

Передайте адрес виджету в servicePath. Магазин выбирается параметром channel, а не заголовком. Сервис отвечает заголовком X-Service-Version: 4.0.0: виджет сверяет мажорную версию и с другой работать не будет, поэтому версию виджета закрепляйте на 4.x.

Котировки СДЭК кешируются на 10 минут, данные пунктов выдачи — на сутки.

mutation SetCdekDelivery($input: SetCdekDeliveryInput!) {
setCdekDelivery(input: $input) {
__typename
... on Order {
code
shippingWithTax
totalWithTax
cdekDelivery {
mode tariffCode tariffName periodMin periodMax doorAddress trackingNumber
deliveryPoint { code name address city cityCode postalCode workTime }
}
}
... on CdekDeliveryError { errorCode message reason }
}
}
{ "input": { "mode": "OFFICE", "tariffCode": 136, "deliveryPointCode": "MSK123" } }

До двери — mode: "DOOR" и address: { address, city, postalCode }. Город и индекс передавайте, если они есть: по ним СДЭК точнее определяет адрес, и цена не расходится. Мутация отправляется в сессии покупателя, работает с его активным заказом.

Ошибки приходят данными, в поле reason:

reason Когда
NOT_CONFIGURED У магазина нет ключей или настроек СДЭК
SHIPPING_METHOD_MISSING Способ доставки СДЭК в магазине не включён или недоступен для этого заказа
NO_ACTIVE_ORDER, EMPTY_ORDER Нет корзины или она пуста
TARIFF_NOT_ALLOWED Магазин не предлагает этот тариф
TARIFF_UNAVAILABLE Тариф недоступен по этому направлению
POINT_NOT_FOUND Пункт выдачи не выбран или не найден
ADDRESS_REQUIRED Для доставки до двери не передан адрес
CDEK_UNAVAILABLE СДЭК не ответил, стоит повторить

Выбранная доставка всегда доступна в заказе: activeOrder { cdekDelivery { … } }.

При переходе заказа в ArrangingPayment сервер проверяет доставку СДЭК. Переход отклоняется ошибкой с понятным покупателю текстом, если:

  • пункт выдачи или адрес не выбран;
  • у адреса нет имени и телефона получателя — без них СДЭК не примет отправление;
  • цена в заказе разошлась с актуальной ценой СДЭК на текущих условиях (котировка старше 30 минут или изменились корзина, тариф, адрес).

Повторите setCdekDelivery с тем же выбором прямо перед переходом к оплате — тогда котировка свежая, и проверка проходит без лишнего запроса в СДЭК.

Что Когда
Отправление создаётся После оплаты, если в настройках включено автосоздание. При сбое — до 8 повторов. Иначе вручную кнопкой в заказе
Номер отслеживания Сразу, если СДЭК присвоил его при создании, иначе фоновая задача дозапрашивает каждые 10 минут
Покупатель видит номер Order.cdekDelivery.trackingNumber
Письмо «передан в СДЭК» Когда появился номер, если у магазина включены письма о заказе

Ссылка на отслеживание в письме — https://www.cdek.ru/ru/tracking?order_id=<номер>.

В Admin API для админки есть cdekCreateShipment(orderId) — создать отправление, в том числе повторно после неудачи, и cdekRefreshShipment(orderId) — подтянуть номер и статус.

В настройках СДЭК есть тестовый режим: сервер работает с учебным API СДЭК (api.edu.cdek.ru), отправления не уходят в настоящую доставку. Ключи для него — тестовые ключи СДЭК, а не боевые.