Інтеграція 1С-Бітрікс зі службою доставки UkrPoshta (Україна)

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс зі службою доставки UkrPoshta (Україна)
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Інтеграція 1С-Бітрікс зі службою доставки Укрпошта (Україна)

Укрпошта — державний поштовий оператор України. Як і Пошта Росії, незамінна для доставки в малі міста та села. API сучасне (REST, OAuth 2.0), але має ряд специфічних вимог: обов'язкова нормалізація адрес, суворі формати даних. Для магазинів з охопленням всієї України інтеграція з Укрпоштою часто йде паралельно з Новою Поштою.

API Укрпошти: OAuth 2.0

Базовий URL: https://www.ukrposhta.ua/ecom/0.0.1/. Авторизація: Bearer-токен. Токен отримується через OAuth 2.0 з типом grant client_credentials.

private function getToken(): string
{
    $cacheKey = 'ukrposhta_token';
    $cached = \Bitrix\Main\Data\Cache::createInstance();

    if ($cached->startDataCache(3000, $cacheKey, '/ukrposhta')) {
        $ch = curl_init('https://www.ukrposhta.ua/oauth/token');
        curl_setopt_array($ch, [
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => http_build_query([
                'grant_type'    => 'client_credentials',
                'client_id'     => $this->clientId,
                'client_secret' => $this->clientSecret,
            ]),
            CURLOPT_RETURNTRANSFER => true,
        ]);
        $response = json_decode(curl_exec($ch), true);
        $token = $response['access_token'] ?? '';
        $cached->endDataCache(['token' => $token]);
    }

    return $cached->getVars()['token'];
}

Токен кешується на 3000 секунд (TTL токена — 3600 секунд, залишаємо запас).

Розрахунок вартості

public function calcPostcardPrice(
    string $fromPostcode,
    string $toPostcode,
    int $weightGram,
    string $type = 'PARCEL'
): float {
    $response = $this->apiGet('/delivery360/calculate', [
        'from_postcode' => $fromPostcode,
        'to_postcode'   => $toPostcode,
        'weight'        => $weightGram,
        'length'        => 300,
        'width'         => 200,
        'height'        => 100,
        'type'          => $type, // PARCEL, DOCUMENT, LETTER
    ]);

    return (float)($response['deliveryPrice'] ?? 0);
}

Розрахунок вимагає індексів відправки та доставки. Для отримання індексу за адресою використовується метод пошуку адреси: GET /addresses/search?street=...&city=....

Нормалізація та пошук адреси

public function searchAddress(string $city, string $street, string $house = ''): array
{
    $response = $this->apiGet('/addresses/search', [
        'street'       => $street,
        'city'         => $city,
        'houseNumber'  => $house,
        'language'     => 'UA',
    ]);

    return $response['addresses'] ?? [];
}

У відповіді приходить масив адрес з postcode — індексом, який потрібен для розрахунку та створення відправлення. Якщо адресу не знайдено або вона неоднозначна — показуємо покупцю список варіантів для уточнення.

Створення відправлення

public function createShipment(\Bitrix\Sale\Shipment $shipment): string
{
    $order = $shipment->getOrder();
    $props = $order->getPropertyCollection();

    $addressRef = $props->getItemByOrderPropertyCode('UKRPOSHTA_ADDRESS_ID')?->getValue();

    $payload = [
        'type'           => 'PARCEL',
        'sender'         => [
            'name'    => $this->getOption('SENDER_NAME'),
            'phone'   => $this->getOption('SENDER_PHONE'),
            'postcode' => $this->getOption('SENDER_POSTCODE'),
        ],
        'recipient'      => [
            'name'        => $props->getItemByOrderPropertyCode('FIO')?->getValue(),
            'phone'       => $props->getItemByOrderPropertyCode('PHONE')?->getValue(),
            'postcode'    => $props->getItemByOrderPropertyCode('UKRPOSHTA_POSTCODE')?->getValue(),
            'addressId'   => $addressRef,
        ],
        'weight'         => $this->getWeight($shipment),
        'length'         => 300,
        'width'          => 200,
        'height'         => 100,
        'declaredPrice'  => $order->getPrice(),
        'postPay'        => 0, // накладений платіж (0 = без НП)
    ];

    $response = $this->apiPost('/shipments', $payload);
    $barcode = $response['barcode'] ?? '';

    $props->getItemByOrderPropertyCode('UKRPOSHTA_BARCODE')?->setValue($barcode);
    $order->save();

    return $barcode;
}

Трекінг

public function trackShipment(string $barcode): array
{
    $response = $this->apiGet('/statuses/shipments', [
        'barcode' => $barcode,
    ]);

    $event = end($response['eventHistory'] ?? []);
    return [
        'status'    => $event['eventName'] ?? '',
        'date'      => $event['date'] ?? '',
        'postcode'  => $event['postcode'] ?? '',
    ];
}

Push-сповіщень немає. Polling агентом раз на 4–6 годин (терміни доставки Укрпошти — 2–7 днів, частий polling є надлишковим).

Накладений платіж

Укрпошта підтримує накладений платіж (postPay). Сума передається в гривнях. При доставці покупець сплачує суму, Укрпошта утримує комісію і переводить залишок магазину за реквізитами з договору.

Терміни

Склад Термін
OAuth + розрахунок вартості 2–3 дні
+ Створення відправлень + трекінг +2 дні
+ Пошук адреси/індексу на чекауті +1 день