Інтеграція 1С-Бітрікс зі службою доставки Яндекс Доставка
Яндекс Доставка доступна як самостійний B2B-сервіс для інтернет-магазинів. Основні сценарії: експрес-доставка в межах міста (1–3 години), кур'єрська доставка день у день або наступного дня, доставка через ПВЗ. Інтеграція з 1С-Бітрікс — через Delivery API v2.
Структура API
Авторизація: OAuth-токен з Яндекс Паспорта в заголовку Authorization: Bearer <token>. Базовий URL: https://b2b.taxi.yandex.net/b2b/cargo/integration/v2.
Основні операції:
-
POST /check-price— попередній розрахунок вартості -
POST /claims— створення заявки -
GET /claims/info— статус заявки -
POST /claims/accept— підтвердження заявки (без цього кроку кур'єр не призначається)
Розрахунок вартості
class YandexDeliveryHandler extends \Bitrix\Sale\Delivery\Services\Base
{
protected function calculateConcrete(
\Bitrix\Sale\Shipment $shipment
): \Bitrix\Sale\Delivery\CalculationResult {
$result = new \Bitrix\Sale\Delivery\CalculationResult();
$order = $shipment->getOrder();
$props = $order->getPropertyCollection();
$address = $props->getItemByOrderPropertyCode('ADDRESS')?->getValue();
if (!$address) {
$result->addError(new \Bitrix\Main\Error('Адресу доставки не вказано'));
return $result;
}
$payload = [
'items' => $this->buildItems($shipment),
'route_points' => [
['coordinates' => $this->getOption('FROM_COORDS'), 'type' => 'source', 'visit_order' => 1],
['address' => ['fullname' => $address], 'type' => 'destination', 'visit_order' => 2],
],
];
$response = $this->apiPost('/check-price', $payload);
if (!empty($response['price'])) {
$result->setDeliveryPrice((float)$response['price']);
}
return $result;
}
}
Особливість: check-price — орієнтовна вартість. Реальна ціна фіксується при створенні заявки. При розбіжності більше 20% рекомендується показувати «ціна від».
Двоетапне створення заявки
Яндекс Доставка вимагає явного підтвердження після створення:
public function createAndAcceptClaim(\Bitrix\Sale\Shipment $shipment): string
{
$order = $shipment->getOrder();
$claim = $this->apiPost('/claims?request_id=' . uniqid(), [
'items' => $this->buildItems($shipment),
'route_points' => $this->buildRoutePoints($shipment),
'comment' => 'Замовлення #' . $order->getId(),
'callback_properties' => ['callback_url' => $this->getOption('WEBHOOK_URL')],
]);
$claimId = $claim['id'];
// Без цього виклику кур'єр не буде призначений
$this->apiPost('/claims/accept?claim_id=' . $claimId, [
'version' => $claim['version'],
]);
return $claimId;
}
request_id — ідемпотентний ключ: повторний запит з тим самим значенням поверне вже існуючу заявку.
Вебхуки статусів
Яндекс Доставка підтримує push-сповіщення на callback_url. Статуси життєвого циклу:
| Статус | Значення |
|---|---|
new |
Заявку створено |
accepted |
Підтверджено |
performer_found |
Кур'єра знайдено |
pickuped |
Вантаж забрано зі складу |
delivery_arrived |
Прибув до отримувача |
delivered |
Доставлено |
returning |
Повернення |
cancelled |
Скасовано |
Кейс: експрес-доставка в Москві
Магазин косметики, завдання — показувати «доставимо через 2 години» для замовлень до 15:00. Реалізували два методи: стандартний (наступного дня) та експрес (2–3 години, доплата 350 руб.). Експрес доступний при оформленні до 15:00 МСК та сумі від 1500 руб. Перевірка в методі isCompatible() обробника. При статусі cancelled у вебхуку сповіщаємо менеджера і пропонуємо клієнту найближчий доступний слот.
Терміни
| Склад | Термін |
|---|---|
| Розрахунок + створення заявки + підтвердження | 3–4 дні |
| + Вебхуки статусів | +1 день |
| + Експрес/стандарт з часовими умовами | +1–2 дні |
| + Інтерфейс відстеження для покупця | +2 дні |







