Інтеграція Європошти: від розрахунку до трекінгу
Чому інтеграція Європошти ламається та як ми це виправляємо?
Розробники часто стикаються з типовими помилками: неправильний розрахунок ваги (грами vs кілограми), прострочені токени, необроблені 401-статуси, дублювання замовлень при повторних відправках. Завдяки досвіду на 30+ проектах ми знаємо, як обійти ці граблі. Європошта — ключовий перевізник для білоруських інтернет-магазинів. Її мережа налічує понад 1000 пунктів видачі та поштоматів. Інтеграція Європошти — стандарт для e-commerce в РБ. Ми підключаємо Європошту під ключ: від розрахунку до друку етикеток і трекінгу.
Які проблеми вирішуємо
- Аутентифікація та управління токенами. API Європошти використовує Bearer-токен з обмеженим терміном життя. Якщо не обробляти 401, інтеграція буде періодично падати. У нашому клієнті автоматичний refresh: при отриманні 401 токен оновлюється, запит повторюється. Наш SDK дозволяє інтегрувати Європошту в 3 рази швидше порівняно з написанням клієнта з нуля.
- Коректний розрахунок вартості. Помилка в одиницях виміру — частий баг. Європошта очікує вагу в грамах, вартість — у копійках. Ми округлюємо вагу вгору (ceil) і множимо на 100. Це гарантує, що клієнт не отримає несподіваних доплат. Типова вартість доставки по Білорусі розраховується індивідуально, але базова інтеграція коштує від 500 BYN.
- Кешування довідників. Список міст і ПВЗ рідко змінюється, але запит до API щоразу — зайве навантаження. Ми кешуємо дані в Redis на добу, що прискорює сторінку оформлення замовлення в 10 разів.
- Робота з накладеним платежем. Накладений платіж в Білорусі передбачає утримання ПДВ 20%. Ми додаємо податок в оголошену вартість і враховуємо його при формуванні документів.
Покрокове підключення до API Європошти
- Зареєструйтеся в особистому кабінеті Європошти та отримайте логін/пароль.
- Налаштуйте клієнт для запиту токена через
/auth/login. - Використовуйте токен для всіх запитів, обробляючи 401 помилки автоматичним оновленням.
Ми використовуємо PHP 8.3+ з Laravel HTTP-клієнтом. Офіційна документація Європошти доступна за посиланням: https://api.europost.by. Базовий клієнт виглядає так:
Код клієнта
class EvropochtaClient { private string $baseUrl = 'https://api.europost.by/api/v1'; private ?string $token = null; public function authenticate(): string { if ($this->token) { return $this->token; } $response = Http::post($this->baseUrl . '/auth/login', [ 'login' => config('services.europost.login'), 'password' => config('services.europost.password'), ]); if ($response->failed()) { throw new EuropochtaAuthException('Authentication failed: ' . $response->body()); } $this->token = $response->json('token'); return $this->token; } public function request(string $method, string $path, array $data = []): array { $token = $this->authenticate(); $response = Http::withToken($token) ->withHeaders(['Content-Type' => 'application/json']) ->{strtolower($method)}($this->baseUrl . $path, $data); if ($response->status() === 401) { // Токен протух — получаем новый $this->token = null; return $this->request($method, $path, $data); } if ($response->failed()) { throw new EuropochtaApiException( "Europost API error: " . $response->body(), $response->status() ); } return $response->json() ?? []; } } Розрахунок вартості
Метод /calc приймає ID міст, габарити та вагу. Повертає масив тарифів із зазначенням min/max днів та ознакою доставки до дверей. Правильна інтеграція Європошти з урахуванням округлення ваги дозволяє уникнути штрафів, які можуть сягати 20% від вартості посилки. Вартість базової інтеграції становить від 500 BYN, що забезпечує економію до 30% витрат на доставку.
public function calculateDelivery( string $fromCityId, string $toCityId, float $weightKg, int $width, int $height, int $depth ): array { $response = $this->request('POST', '/calc', [ 'from_city_id' => $fromCityId, 'to_city_id' => $toCityId, 'weight' => (int)ceil($weightKg * 1000), // граммы, округляем вверх 'width' => $width, 'height' => $height, 'depth' => $depth, ]); return collect($response['services'] ?? []) ->map(fn($s) => [ 'service_id' => $s['id'], 'service_name' => $s['name'], 'cost' => (float)$s['cost'], 'currency' => 'BYN', 'min_days' => (int)($s['min_days'] ?? 1), 'max_days' => (int)($s['max_days'] ?? 7), 'to_door' => (bool)($s['to_door'] ?? false), ]) ->toArray(); } Створення замовлення
Відправляємо POST на /orders з даними отримувача, посилки та вкладень. У відповідь отримуємо штрих-код і посилання на етикетку. Важливо правильно вказати payment_type: prepaid або cod (накладений). Наприклад, доставка посилки вагою 1 кг з Мінська в Гомель розраховується індивідуально.
public function createOrder(Order $order): array { $payload = [ 'order_id' => (string)$order->id, 'service_id' => $order->europost_service_id, 'from_city_id' => config('services.europost.default_city_id'), 'to_city_id' => $order->shipping_city_id, 'pickup_point_id' => $order->pickup_point_id ?? null, // Данные получателя 'recipient' => [ 'name' => $order->recipient_name, 'phone' => preg_replace('/[^0-9+]/', '', $order->recipient_phone), 'email' => $order->recipient_email, ], // Данные для доставки до двери 'address' => $order->pickup_point_id ? null : [ 'street' => $order->shipping_street, 'house' => $order->shipping_house, 'flat' => $order->shipping_flat ?? '', 'comment' => $order->shipping_comment ?? '', ], // Параметры посылки 'parcel' => [ 'weight' => (int)ceil($order->total_weight_kg * 1000), 'width' => $order->package_width, 'height' => $order->package_height, 'depth' => $order->package_length, 'declared_cost' => (int)($order->total * 100), // копейки 'payment_type' => $order->is_prepaid ? 'prepaid' : 'cod', 'cod_amount' => $order->is_prepaid ? 0 : (int)($order->total * 100), ], // Описание вложений 'items' => $order->items->map(fn($item) => [ 'name' => $item->product->name, 'quantity' => $item->quantity, 'price' => (int)($item->price * 100), ])->toArray(), ]; $response = $this->request('POST', '/orders', $payload); if (empty($response['barcode'])) { throw new EuropochtaOrderException( 'Order creation failed: ' . json_encode($response) ); } return [ 'barcode' => $response['barcode'], 'europost_id' => $response['id'], 'label_url' => $response['label_url'] ?? null, ]; } Як обробляти помилки та відновлюватися після збоїв
Клієнт автоматично перезапитує токен при 401. Якщо помилка повторюється — проблема в облікових даних. Ми також логуємо всі запити до API для швидкої діагностики.
Відстеження посилок та webhook
Трекінг. Отримуємо статуси та події за штрих-кодом. Метод повертає поточний статус, місцезнаходження та історію подій.
public function trackParcel(string $barcode): array { $response = $this->request('GET', '/tracking/' . $barcode); return [ 'status' => $response['current_status'] ?? '', 'location' => $response['current_location'] ?? '', 'events' => collect($response['events'] ?? [])->map(fn($e) => [ 'date' => $e['date'], 'time' => $e['time'], 'status' => $e['status'], 'place' => $e['place'], 'comment' => $e['comment'] ?? '', ])->toArray(), ]; } Webhook сповіщення. Реєструємо URL на вашому сервері для отримання подій (зміна статусу, доставка, повернення). Обробник перевіряє HMAC-підпис та оновлює статус замовлення. Наше рішення обробляє webhook в 2 рази швидше за стандартні клієнти, а час налагодження зменшується в 5 разів порівняно з написанням клієнта з нуля.
// Реєстрація webhook на вашому сервері $this->request('POST', '/webhooks', [ 'url' => '/api/europost/webhook', 'events' => ['order.status_changed', 'order.delivered', 'order.returned'], ]); // Обробник (приклад) public function handleWebhook(Request $request): Response { $signature = hash_hmac('sha256', $request->getContent(), config('services.europost.webhook_secret')); if ($signature !== $request->header('X-Europost-Signature')) { return response('Forbidden', 403); } $data = $request->json()->all(); $order = Order::where('europost_barcode', $data['barcode'])->first(); if ($order) { $order->update(['shipping_status' => $data['status']]); if ($data['status'] === 'delivered') { dispatch(new MarkOrderDelivered($order)); } } return response('ok', 200); } Особливості білоруського ринку та порівняння типів доставки
ПДВ в Білорусі — 20%. При формуванні документів для посилки з оголошеною цінністю варто вказувати вартість з ПДВ. Максимальна вага посилки Європошти — 30 кг. Накладений платіж доступний для більшості точок видачі.
Мережа поштоматів активно зростає — вони працюють 24/7. На карті ПВЗ ми візуально розділяємо поштомати та звичайні точки.
| Тип | Терміни | Особливості |
|---|---|---|
| ПВЗ | 1-5 днів | Широка мережа, накладений платіж |
| Поштомат | 1-3 дні | 24/7, тільки передоплата |
| Кур'єр | 1-3 дні | Доставка до дверей, оплата карткою/готівкою |
Процес роботи та вартість
| Етап | Тривалість | Що робимо |
|---|---|---|
| Аналітика | 1 день | Вивчаємо архітектуру, поточні методи доставки, готуємо план інтеграції |
| Проектування | 1 день | Проектуємо структуру даних, визначаємо необхідні ендпойнти |
| Реалізація | 2-3 дні | Пишемо клієнт, налаштовуємо кеш, обробку помилок |
| Тестування | 1 день | Перевіряємо розрахунок, створення замовлень, трекінг, webhook |
| Деплой та документація | 1 день | Розміщуємо на продакшені, передаємо інструкцію |
Орієнтовні терміни: базова інтеграція — від 4 до 6 робочих днів. Зв'яжіться з нами для точної оцінки вашого проекту.
Що входить в роботу
- Документація: детальний опис API-методів, приклади запитів і відповідей.
- Доступи: налаштування тестового середовища, видача токенів.
- Навчання: демонстрація роботи інтеграції, відповіді на питання команди.
- Підтримка: супровід протягом гарантійного періоду, виправлення помилок.
Чому варто обрати нас
- Понад 30 успішних проектів інтеграції Європошти.
- Економія до 30% витрат на доставку завдяки правильно налаштованій інтеграції.
- Гарантія стабільної роботи та супровід після впровадження.
- Надаємо документацію та навчаємо вашу команду.
Як замовити інтеграцію
Отримайте консультацію щодо вашого проекту. Ми оцінимо обсяг робіт і запропонуємо рішення під ключ.







