Интеграция 1С-Битрикс со службой доставки Boxberry Беларусь
Boxberry работает в Беларуси через партнёрскую сеть — пунктов выдачи в стране значительно меньше, чем в России, но для городов-миллионников (Минск, Гомель, Брест, Витебск) покрытие достаточное. Технически это тот же Boxberry API, что и для России, с отдельными credentials для белорусского сегмента.
API Boxberry Беларусь
Boxberry использует один API для всех рынков: https://api.boxberry.ru/json.php. Авторизация через токен в параметре запроса. Белорусский сегмент работает с теми же эндпоинтами, но возвращает другие данные по ПВЗ и тарифам при указании страны Беларусь.
Ключевые методы:
-
PointList— список ПВЗ с фильтром по стране (CountryCode=BY) -
DeliveryCosts— расчёт стоимости доставки -
ParselCreate— создание посылки -
ParselCheck— статус посылки по трекинг-номеру
Расчёт стоимости
class BoxberryByHandler extends \Bitrix\Sale\Delivery\Services\Base
{
private string $apiUrl = 'https://api.boxberry.ru/json.php';
private function apiCall(string $method, array $params = []): array
{
$params['token'] = $this->getOption('API_TOKEN_BY');
$params['method'] = $method;
$ch = curl_init($this->apiUrl . '?' . http_build_query($params));
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
return $result ?? [];
}
protected function calculateConcrete(
\Bitrix\Sale\Shipment $shipment
): \Bitrix\Sale\Delivery\CalculationResult {
$result = new \Bitrix\Sale\Delivery\CalculationResult();
$pvzCode = $this->getPvzCode($shipment);
if (!$pvzCode) {
$result->addError(new \Bitrix\Main\Error('ПВЗ Boxberry не выбран'));
return $result;
}
$response = $this->apiCall('DeliveryCosts', [
'weight' => max((int)ceil($shipment->getWeight() / 1000), 1),
'aim' => $pvzCode,
'sumd' => round($shipment->getOrder()->getPrice()),
'fromCity' => $this->getOption('FROM_CITY_CODE_BY'),
]);
if (!empty($response['price'])) {
$result->setDeliveryPrice((float)$response['price']);
$period = $response['deliveryPeriod'] ?? '3–7';
$result->setPeriodDescription("{$period} дней");
}
return $result;
}
private function getPvzCode(\Bitrix\Sale\Shipment $shipment): ?string
{
$props = $shipment->getOrder()->getPropertyCollection();
return $props->getItemByOrderPropertyCode('BOXBERRY_PVZ_BY')?->getValue() ?: null;
}
}
Список ПВЗ для Беларуси
public function getBelarusPvz(): array
{
$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(3600 * 12, 'boxberry_pvz_by', '/boxberry/')) {
return $cache->getVars();
}
$pvzList = $this->apiCall('PointList', [
'CountryCode' => 'BY',
'prepaid' => 1,
]);
$cache->startDataCache();
$cache->endDataCache($pvzList);
return $pvzList;
}
На фронте выводим карту с ПВЗ. Через Boxberry нет официального JS-виджета для белорусского рынка — реализуем собственный на Яндекс Картах или Google Maps, передавая список ПВЗ с координатами из API.
Создание посылки
public function createParcel(\Bitrix\Sale\Shipment $shipment): string
{
$order = $shipment->getOrder();
$props = $order->getPropertyCollection();
$response = $this->apiCall('ParselCreate', [
'updateByTrack' => '0',
'order_id' => 'bitrix_' . $order->getId(),
'PalletNumber' => '',
'price' => round($order->getPrice()),
'payment_sum' => $this->getCodAmount($order), // 0 при предоплате
'delivery_sum' => 0,
'vid' => 1,
'aim' => $props->getItemByOrderPropertyCode('BOXBERRY_PVZ_BY')?->getValue(),
'name' => $props->getItemByOrderPropertyCode('FIO')?->getValue(),
'phone' => $props->getItemByOrderPropertyCode('PHONE')?->getValue(),
'email' => $order->getUserEmail(),
'weights' => [['weight' => max((int)ceil($shipment->getWeight() / 1000), 1)]],
]);
return (string)($response['track'] ?? '');
}
Трекинг
public function checkParcel(string $trackCode): array
{
return $this->apiCall('ParselCheck', ['ImId' => $trackCode]);
}
Вебхуков нет. Агент Битрикс проверяет статус раз в 4 часа.
Сроки
| Состав | Срок |
|---|---|
| Расчёт + создание посылки | 3–4 дня |
| + ПВЗ на карте | +2–3 дня |
| + Трекинг + уведомления | +2 дня |







