Доставка Почта РФ

02 Марта 2020 17:38 (Редактировано: 16 Апреля 2020 21:45)

 Здесь будет рассмотрен пример расчета стоимости для Почта РФ.

Материалы:

  1. Ссылка на документацию - документация;
  2. Регистрация в системе - регистрация

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

  1. Токен пользователя;
  2. Ключ пользователя;
  3. Вес, ширина, высота, длина товара;
  4. Индексы городов отправки и получения посылки

Смысл заключается в отправке запросов на определенный адрес. Авторизируемся посредством заголовков, посылаем данные в формате json. Поулчаем ответ в формате json.

Вес передается в граммах. Ширина, длина, высота - в сантиметрах.

На стандартном тарифе подсчет ведется до 20кг

Нам отдельно придут 2 параметра - tax-rate (стоимость без НДС) и tax-vat - стоимость НДС. При окончательном вычислении их необходимо сложить

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

if(!empty($_POST['pochtaIndex'])) {
    
    $intIndexTo = trim(htmlspecialchars($_POST['pochtaIndex']));
    
    $order = &$_SESSION['shk_order'];
    $_SESSION['pochtaIndex'] = $intIndexTo;
    
    if(!empty($order)) {
        
        $intTotalWeight = 0;
        
        foreach($order as $k => $prod) {
            
            //Получаем данные товара
            $resChars = getChars($modx, $prod['id'], $arTvs);
            
            //Проверяем на заполненность, если не заполнено - заменяем их из настроек
            $order[$k]['weight'] = $resChars['weight'] ? $resChars['weight'] * $prod['count'] : $defChars['set-weight'] * $prod['count'];
            
            $intTotalWeight += $order[$k]['weight'];
        }
    }
    
    $q = $modx->newQuery('modTemplateVarResource', array('contentid' => 6, 'tmplvarid:IN' => array(52,57,58)));
    
    $obTv = $modx->getCollection('modTemplateVarResource', $q);
    
    $arValues = [];
    foreach($obTv as $res) {
        $res = $res->toArray();
        $arValues[] = $res['value'];
    }
    
    list($intIndexFrom, $strToken, $strPass) = $arValues;
    
    $protocol = "https://";
    $host = "otpravka-api.pochta.ru";
    $path = "/1.0/tariff";
    
    $destination = array(
    	"index-from" => $intIndexFrom,
    	"index-to" => $intIndexTo,
    	"mail-category" => "ORDINARY",
    	"mail-type" => "POSTAL_PARCEL",
    	"mass" => 5000,
    	"dimension" => [
        	"height" => $defChars['set-height'],
        	"length" => $defChars['set-length'],
        	"width" => $defChars['set-width']
    	],
    	"fragile" => "false"
    );
    
    $url = $protocol . $host . $path;
    $data = json_encode($destination, true);
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: AccessToken ' . $strToken,
        'X-User-Authorization: Basic ' . $strPass,
        'Content-Type: application/json;charset=UTF-8',
        'Accept: application/json;charset=UTF-8'
    ));
    
    $output = curl_exec($ch);
    $output = json_decode($output, true);
    curl_close($ch);
    
    if(isset($output['ground-rate'])) {
        echo ceil(($output['ground-rate']['rate'] + $output['ground-rate']['vat']) / 100);
    }else{
        echo 0;
    }
}