Доставка CDEK

02 Марта 2020 17:37

Для CDEK есть несколько сопособов расчета доставки:

  1. Калькулятор - ссылка;
  2. Виджет - ссылка;
  3. Интеграция - ссылка.

Виджет

Виджет представляет из себя карту с расставленными точками пунктов выдачи. Выбрав любой из пунктов, мы получаем цену курьером или самовывозом и адрес.

Действия:

  1. Качаем дистрибутив (актуальный по состоянию на 02.03.2020).
  2. Распаковываем в удобном месте на сайте;
  3. Инициализируем на странице с оформлением доставки.

Пример кода инициализации:

var cdekWidget = new ISDEKWidjet({
    defaultCity: 'Москва',
    cityFrom: 'Москва',
    country: 'Россия',
    link: 'js_cdek_delivery_block',
    path: 'assets/components/cdek/widget/scripts/',
    servicepath: 'http://sitename.ru/assets/components/cdek/widget/scripts/service.php',
    apikey: '47402f77-9ece-411f-b0ab-39177b4a5e84',
    onChoose: function(reply) {
        var address = reply.PVZ.City + ', ' + reply.PVZ.Address + ', ' + reply.PVZ.AddressComment;
        setSelectedAddress(address, reply.id, 'cdek');
    }
});

Интеграция

Здесь мы отправляем запрос на адрес СДЭК в формате json с указанием данных.

Понадобится:

  1. ID города из базы CDEK;
  2. База CDEK
  3. Вес, длина, ширина, высота продукта;

Материалы:

  1. База CDEK (актуальная на 02.03.2020) - ссылка
  2. Сервис для конвертации xls в SQL - ссылка

База в формате xls, поэтому лучше всего ее перевести в SQL и импортировать в MySQL

Пример кода для ajax-коннектора:

if(!empty($_POST['city'])) {
    $city = trim(htmlspecialchars($_POST['city']));
    $id = trim(htmlspecialchars($_POST['id']));
    
    $resChars = getChars($modx, $id, $arTvs);
    
    $weight = !empty($resChars['weight']) ? $resChars['weight'] / 1000 : $defChars['weight'] / 1000;
    $length = !empty($resChars['length']) ? $resChars['length'] : $defChars['length'];
    $width = !empty($resChars['width']) ? $resChars['width'] : $defChars['width'];
    $height = !empty($resChars['height']) ? $resChars['height'] : $defChars['height'];
    
    $q = "SELECT `ID` FROM modx_cdek_addresses WHERE `FullName` LIKE '%{$city}%'";
    $stmt = $modx->query($q);
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    $id = $result['ID'];
    
    header('Content-Type: application/json');

    $post_data = '{
        "version":"1.0",
        "senderCityId":"44",
        "receiverCityId":"' . $id . '",
        "tariffId":"1",
        "goods":
            [
                {
                    "weight":"' . $weight . '",
                    "length":"' . $length . '",
                    "width":"' . $width . '",
                    "height":"' . $height . '"
                }
            ]
    }';
    
    $url = 'http://api.cdek.ru/calculator/calculate_price_by_json.php';
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json'
    ));
    
    $output = json_decode(curl_exec($ch), true);
    
    curl_close($ch);
    $output['result']['city'] = $city;
    echo $modx->parseChunk('cdek_tpl', $output['result']);
}

В документации как для интеграции так и для виджета упоминаются данные пользователя (логин и пароль), Но без них работает!