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

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

Казпошта — національний поштовий оператор Казахстану. Покриття — всі населені пункти країни, включаючи важкодоступні райони. Для e-commerce, що працює на казахстанський ринок, Казпошта необхідна там, де приватні кур'єрські служби не працюють. API надає REST-інтерфейс з токен-авторизацією.

API Казпошти: підключення

Казпошта надає API через партнерський кабінет. Базовий URL продакшн-середовища: https://api.kazpost.kz/api/v1/. Авторизація через API-ключ у заголовку Authorization: Bearer TOKEN.

private function apiRequest(string $method, string $path, array $data = []): array
{
    $url = 'https://api.kazpost.kz/api/v1' . $path;
    $ch = curl_init($method === 'GET' ? $url . '?' . http_build_query($data) : $url);

    curl_setopt_array($ch, [
        CURLOPT_CUSTOMREQUEST  => $method,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . $this->getOption('API_TOKEN'),
            'Content-Type: application/json',
            'Accept: application/json',
        ],
        CURLOPT_POSTFIELDS => $method !== 'GET' ? json_encode($data) : null,
    ]);

    $response = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($code >= 400) {
        throw new \RuntimeException("Kazpost API error {$code}: {$response}");
    }

    return json_decode($response, true) ?? [];
}

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

public function calcPrice(
    string $fromZip,
    string $toZip,
    int $weightGram,
    string $mailType = 'SMALL_PACKAGE'
): float {
    $response = $this->apiRequest('POST', '/tariff/calculate', [
        'fromZip'     => $fromZip,
        'toZip'       => $toZip,
        'weight'      => $weightGram,
        'mailType'    => $mailType, // SMALL_PACKAGE, PACKAGE, EMS
        'addServices' => [],
    ]);

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

Типи відправлень: SMALL_PACKAGE (малий пакет, до 2 кг), PACKAGE (посилка), EMS (експрес). Вартість розраховується в тенге.

Пошук індексу за адресою

Для розрахунку потрібен поштовий індекс отримувача. Казпошта надає API пошуку індексу:

public function findZipByAddress(string $city, string $street, string $house): ?string
{
    $cacheKey = 'kazpost_zip_' . md5($city . $street . $house);
    $cached = \Bitrix\Main\Data\Cache::createInstance();

    if ($cached->startDataCache(86400 * 7, $cacheKey, '/kazpost')) {
        $response = $this->apiRequest('GET', '/address/search', [
            'city'   => $city,
            'street' => $street,
            'house'  => $house,
        ]);
        $zip = $response[0]['zip'] ?? null;
        $cached->endDataCache(['zip' => $zip]);
    }

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

На сайті поле «Поштовий індекс» можна заповнювати автоматично: покупець вводить адресу, AJAX-запит визначає індекс. Кешуємо на тиждень — індекси змінюються рідко.

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

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

    $payload = [
        'mailType'       => 'PACKAGE',
        'weight'         => $this->getWeight($shipment),
        'declaredValue'  => (int)($order->getPrice() * 100), // в тиїнах
        'cashOnDelivery' => 0,
        'sender' => [
            'name'    => $this->getOption('SENDER_NAME'),
            'zip'     => $this->getOption('SENDER_ZIP'),
            'address' => $this->getOption('SENDER_ADDRESS'),
            'phone'   => $this->getOption('SENDER_PHONE'),
        ],
        'recipient' => [
            'name'    => $props->getItemByOrderPropertyCode('FIO')?->getValue(),
            'zip'     => $props->getItemByOrderPropertyCode('KAZPOST_ZIP')?->getValue(),
            'address' => $props->getItemByOrderPropertyCode('ADDRESS')?->getValue(),
            'phone'   => $props->getItemByOrderPropertyCode('PHONE')?->getValue(),
        ],
        'items' => $this->buildItems($order),
    ];

    $response = $this->apiRequest('POST', '/mail-items', $payload);
    $barcode = $response['barcode'] ?? '';

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

    return $barcode;
}

Оголошена цінність (declaredValue) передається в тиїнах (1 тенге = 100 тиїнів). Це типова особливість казахстанських API — враховуйте конвертацію.

Трекінг

public function track(string $barcode): array
{
    $response = $this->apiRequest('GET', '/tracking/' . $barcode);
    $events = $response['events'] ?? [];
    $last = end($events);

    return [
        'status'   => $last['statusName'] ?? '',
        'date'     => $last['eventDate'] ?? '',
        'location' => $last['locationName'] ?? '',
    ];
}

Терміни

Склад Термін
Розрахунок вартості + індекс за адресою 2–3 дні
+ Створення відправлень + трекінг +2 дні
+ Накладений платіж +1 день