Интеграция расчёта стоимости доставки через API
Расчёт стоимости доставки в реальном времени — важный элемент конверсии. Покупатель должен видеть точную стоимость каждого варианта доставки ещё на этапе выбора, не дожидаясь подтверждения заказа. Это снижает количество отказов на финальном шаге оформления.
Архитектура расчёта
Расчёт стоимости делается одним запросом к бэкенду, который параллельно опрашивает API всех подключённых служб доставки и возвращает унифицированный список вариантов.
class DeliveryCalculator
{
private array $providers;
public function calculate(Cart $cart, Address $destination): Collection
{
$requests = collect($this->providers)->map(function ($provider) use ($cart, $destination) {
return $provider->calculateAsync($cart, $destination); // возвращает Promise
});
return collect(async_all($requests)) // параллельное выполнение
->flatten()
->sortBy('price')
->filter(fn($option) => $option->isAvailable());
}
}
Параллельные запросы через Guzzle Pool или ReactPHP HTTP. Таймаут на каждый внешний запрос — не более 2–3 секунд. Если провайдер не ответил — его вариант просто не включается в список.
Унифицированный формат варианта доставки
class DeliveryOption
{
public string $providerId; // 'cdek', 'boxberry', 'pochta'
public string $serviceCode; // 'cdek_express', 'cdek_pvz'
public string $name; // 'СДЭК: Экспресс'
public string $type; // 'courier' | 'pvz' | 'postamat'
public int $price; // в копейках
public ?int $priceWithDiscount;
public int $minDays;
public int $maxDays;
public ?string $pvzCode; // если нужно выбрать точку
public array $meta; // доп. данные провайдера
}
Кеширование результатов
Расчёт повторяется при каждом изменении адреса или состава корзины. Кешировать имеет смысл по ключу {cart_hash}:{destination_hash} на 10–15 минут.
$cacheKey = "delivery:{$cart->hash()}:{$destination->hash()}";
return Cache::remember($cacheKey, 900, fn() => $this->fetchFromProviders($cart, $destination));
Параметры для расчёта
Каждый провайдер требует разные параметры, но основа общая:
- Размеры и вес посылки (суммарные по всем товарам в корзине)
- Город/регион отправления (адрес склада)
- Город/регион назначения
- Объявленная ценность (влияет на стоимость страховки)
- Количество мест
Габариты извлекаются из товаров: если продавец не заполнил — применяются дефолтные значения.
Разные склады и точки отправления
Интернет-магазины с несколькими складами должны считать доставку от ближайшего склада к адресу покупателя. Это требует предварительной логики маршрутизации: определить, с какого склада будет отгружен каждый товар, и рассчитать доставку от каждого склада отдельно.
Отображение результатов
На UI результаты группируются:
- Курьерская доставка: несколько вариантов по скорости/стоимости
- Самовывоз из ПВЗ: клик → открывается карта выбора точки
- Почта России: отдельно (обычно медленнее, дешевле)
Скорость доставки отображается как "1–2 рабочих дня" или "к 15 марта" — для этого нужен производственный календарь (праздники, выходные).
Срок интеграции: 3–5 дней для подключения 2–3 провайдеров с параллельными запросами и кешированием.







