Повна інтеграція СДЕК на сайт: від розрахунку вартості до відстеження посилок
Ми інтегруємо сервіс СДЕК на ваш сайт під ключ. Підключаємо розрахунок вартості з урахуванням усіх тарифів (136–139), відображаємо пункти видачі (PVZ) на карті, створюємо замовлення одним запитом і синхронізуємо статуси через webhook у реальному часі. Базова версія готова за 5–7 робочих днів. Зв'яжіться з нами — оцінимо ваш проект. Гарантуємо коректну інтеграцію та підтримку протягом усього терміну експлуатації.
На практиці інтеграція з API СДЕК часто викликає проблеми: неправильний розрахунок через коди міст (у базі >100 000 міст) або втрачені замовлення при збоях запитів. Ми вирішуємо це кешуванням довідників, автоматичними повторними спробами (retry з exponential backoff) та детальним логуванням. У результаті кількість збоїв знижується до 0.1% — це підтверджують наші клієнти з 15+ проектами інтеграції доставки. Автоматизація через API в 5 разів швидша за ручну обробку.
Що дає інтеграція СДЕК
| Компонент | Результат |
|---|---|
| Розрахунок вартості | Актуальні тарифи з урахуванням ваги, габаритів і типу доставки (двері/ПВЗ) |
| Карта ПВЗ | Інтерактивна карта з фільтрацією за містом, вагою, наявністю готівки |
| Створення замовлень | Автоматичне створення замовлення в СДЕК при оформленні на сайті |
| Відстеження | Статуси в реальному часі через webhook (CREATED, ACCEPTED, READY, DELIVERED) |
| Документація та навчання | Опис API, приклади коду, інструкція для операторів |
Що входить у вартість
- Технічне завдання та архітектура інтеграції
- Повний код інтеграції на вашому стеку (авторизація, калькулятор, ПВЗ, замовлення, webhook)
- Документація API та інструкція для операторів
- Тестування в тестовому середовищі СДЕК
- Навчання вашої команди (1 вебінар)
- Підтримка протягом 3 місяців після здачі
Як інтегрувати: крок за кроком
- Отримайте ключі API СДЕК (client_id та client_secret) в особистому кабінеті.
- Налаштуйте OAuth 2.0 авторизацію з кешуванням токена (див. приклад нижче).
- Інтегруйте розрахунок вартості через метод
/v2/calculator/tarifflist. - Додайте карту ПВЗ з допомогою методу
/v2/deliverypoints. - Реалізуйте створення замовлення через
/v2/orders. - Налаштуйте webhook для отримання статусів.
Як ми забезпечуємо надійність синхронізації статусів?
Використовуємо webhook-повідомлення. Після створення замовлення СДЕК надсилає POST-запит на ваш URL при кожній зміні статусу. Це швидше та дешевше за polling. Достатньо повернути HTTP 200 — інакше СДЕК повторює відправку до 3 разів. Ми також додаємо моніторинг: при відсутності повідомлень протягом 5 хвилин надсилаємо алерт.
Які дані потрібні для розрахунку вартості?
Для розрахунку достатньо передати коди міст відправника та отримувача, вагу та габарити посилки, а також тип доставки (двері/ПВЗ). API повертає список тарифів із мінімальним та максимальним терміном доставки. Ми автоматично фільтруємо тарифи з помилками (наприклад, код міста не знайдено) і віддаємо лише валідні варіанти.
Порівняння ручної та автоматичної обробки замовлень
| Критерій | Ручна обробка | Наша інтеграція |
|---|---|---|
| Час на замовлення | 15–20 хвилин | 2–3 секунди |
| Помилки введення даних | до 5% | <0.1% |
| Оновлення статусів | ручний опит | автоматичний webhook |
| Вартість підтримки | висока (оплата оператора) | мінімальна (один раз налаштували) |
Стек та інструменти
- Авторизація: OAuth 2.0 client credentials, токен живе 3600 секунд, кешуємо в Redis.
- Розрахунок вартості: метод
/v2/calculator/tarifflist. - ПВЗ: метод
/v2/deliverypointsз фільтрацією за містом, вагою та типом. - Замовлення: метод
/v2/ordersз повним набором полів. - Webhook: реєструємо один раз, обробляємо ключові статуси.
Приклад авторизації та кешування токена:
class CdekAuthService { private const TOKEN_URL = 'https://api.cdek.ru/v2/oauth/token'; private const CACHE_KEY = 'cdek_access_token'; public function getToken(): string { return Cache::remember(self::CACHE_KEY, 3500, function () { $response = Http::asForm()->post(self::TOKEN_URL, [ 'grant_type' => 'client_credentials', 'client_id' => config('services.cdek.client_id'), 'client_secret' => config('services.cdek.client_secret'), ]); if ($response->failed()) { throw new CdekAuthException('Failed to obtain CDEK token: ' . $response->body()); } return $response->json('access_token'); }); } } Приклад розрахунку вартості:
class CdekCalculatorService { public function calculateTariffList( string $fromCityCode, string $toCityCode, array $packages, int $deliveryType = 1 ): array { $response = Http::withToken($this->auth->getToken()) ->post('https://api.cdek.ru/v2/calculator/tarifflist', [ 'type' => $deliveryType, 'from_location' => ['code' => (int)$fromCityCode], 'to_location' => ['code' => (int)$toCityCode], 'packages' => $packages, ]); if ($response->failed()) { throw new CdekApiException($response->body()); } return collect($response->json('tariff_codes')) ->filter(fn($t) => empty($t['errors'])) ->map(fn($t) => [ 'code' => $t['tariff_code'], 'name' => $t['tariff_name'], 'cost' => $t['delivery_sum'], 'min_days' => $t['period_min'], 'max_days' => $t['period_max'], ]) ->values() ->toArray(); } } Приклад отримання пунктів видачі:
public function getPickupPoints( string $cityCode, float $weightKg, bool $cashAllowed = false ): array { $response = Http::withToken($this->auth->getToken()) ->get('https://api.cdek.ru/v2/deliverypoints', [ 'city_code' => $cityCode, 'weight_max' => (int)($weightKg), 'have_cash' => $cashAllowed ? 'true' : null, 'type' => 'PVZ', 'is_handout' => 'true', ]); return collect($response->json()) ->map(fn($p) => [ 'code' => $p['code'], 'name' => $p['name'], 'address' => $p['location']['address'], 'lat' => $p['location']['latitude'], 'lng' => $p['location']['longitude'], 'work_time' => $p['work_time'], 'cash_allowed'=> $p['have_cash'], ]) ->toArray(); } Приклад створення замовлення:
public function createOrder(Order $order): string { $payload = [ 'tariff_code' => $order->cdek_tariff_code, 'from_location' => [ 'code' => config('services.cdek.warehouse_city_code'), 'address' => config('services.cdek.warehouse_address'), ], 'to_location' => [ 'code' => $order->cdek_city_code, 'address' => $order->delivery_address, ], 'recipient' => [ 'name' => $order->recipient_name, 'phones' => [['number' => $order->recipient_phone]], 'email' => $order->recipient_email, ], 'packages' => [[ 'number' => 'p' . $order->id, 'weight' => (int)($order->total_weight_kg * 1000), 'length' => $order->package_length, 'width' => $order->package_width, 'height' => $order->package_height, 'comment' => 'Замовлення #' . $order->id, 'items' => $order->items->map(fn($item) => [ 'name' => $item->product->name, 'ware_key'=> (string)$item->product_id, 'payment' => ['value' => 0], 'cost' => $item->price, 'amount' => $item->quantity, 'weight' => (int)($item->product->weight_g), ])->toArray(), ]], ]; if ($order->pickup_point_code) { $payload['delivery_point'] = $order->pickup_point_code; } $response = Http::withToken($this->auth->getToken()) ->post('https://api.cdek.ru/v2/orders', $payload); $orderId = $response->json('entity.uuid'); if (!$orderId) { throw new CdekOrderException( 'Failed to create CDEK order: ' . json_encode($response->json('requests.0.errors')) ); } return $orderId; } Приклад обробки webhook:
public function handleWebhook(Request $request): Response { $data = $request->json()->all(); if ($data['type'] !== 'ORDER_STATUS') { return response('ok', 200); } $cdekOrderUuid = $data['attributes']['uuid']; $statusCode = $data['attributes']['status']['code']; $order = Order::where('cdek_uuid', $cdekOrderUuid)->first(); if ($order) { $order->update([ 'cdek_status' => $statusCode, 'cdek_status_at' => now(), ]); if (in_array($statusCode, ['READY_FOR_PICKUP', 'DELIVERED'])) { dispatch(new NotifyCustomerDeliveryStatus($order, $statusCode)); } } return response('ok', 200); } Етапи робіт
| Етап | Що робимо | Результат |
|---|---|---|
| Аналітика | Вивчаємо ваш сайт, вимоги, підбираємо оптимальні тарифи та методи інтеграції | Технічне завдання |
| Проектування | Проектуємо архітектуру: сервіси, кешування, обробка помилок | Документація |
| Реалізація | Пишемо код інтеграції: авторизація, розрахунок, ПВЗ, замовлення, webhook | Робочий код на вашому стеку |
| Тестування | Перевіряємо в тестовому середовищі СДЕК, імітуємо всі сценарії, виправляємо помилки | Протокол тестування |
| Деплой | Перемикаємо на бойові credentials, налаштовуємо моніторинг | Інтеграція в продакшені |
Терміни та вартість орієнтовно
Базова інтеграція (розрахунок вартості + ПВЗ на карті + створення замовлень) — 5–7 робочих днів, від 15 000 грн. Додавання відстеження через webhook, синхронізація статусів і друк накладних — ще 3–4 дні, від 25 000 грн. Тестування в тестовому середовищі СДЕК обов'язкове.
Типові помилки та як їх уникнути
- Некоректний код міста. Використовуйте метод
/location/citiesі кешуйте довідник. - Закінчення токена. Кешуйте токен із запасом 100 секунд, як у прикладі.
- Неправильні габарити. Усі розміри в см, вага в грамах, інакше розрахунок невірний.
- Втрата webhook. Налаштуйте ретраї та моніторинг: якщо СДЕК не отримує 200, він повторює відправку.
Наша команда має понад 10 успішних проектів з інтеграцією СДЕК та 5 років досвіду роботи з API служб доставки. Офіційна документація API СДЕК доступна за посиланням. Замовте консультацію — допоможемо інтегрувати доставку швидко та без помилок.







