Интеграция 1С-Битрикс со службой доставки Яндекс Доставка
Яндекс Доставка доступна как самостоятельный B2B-сервис для интернет-магазинов. Основные сценарии: экспресс-доставка в пределах города (1–3 часа), курьерская доставка день-в-день или на следующий день, доставка через ПВЗ. Интеграция с Битрикс — через 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 дня |







