Быстрый расчет доставки посылок почтой РФ

Приветствую.
На одном сайте понадобилось считать стоимость доставки посылок почтой РФ из г. Благовещенск в г. Москва. Решил с помощью API сайта postcalc.ru



Делюсь. Конструктивная критика и советы приветствуются.

1. Создаем сниппет postCalc
<?php
// Инициализируем curl
$curl = curl_init();
curl_setopt_array($curl, 
    array( 
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_HTTPHEADER => array('Connection: close', 'Accept-Encoding: gzip'),
        CURLOPT_USERAGENT => phpversion()
    )
);

//Значения по умолчанию
if (!$from) $from = "675011";       //индекс отправителя (г.Благовещенск Амурской обл.)
if (!$to) $to = "101000";           //индекс получателя (г.Москва)
if (!$weight) $weight = "1000";     //вес в граммах
if (!$val) $val = "0";              //ценность посылки в рублях
if (!$post_type) $post_type = 0;    //тип отправления

//Формируем запрос
curl_setopt($curl, CURLOPT_URL, "http://api.postcalc.ru/?f=".$from."&t=".$to."&w=".$weight."&v=".$val."&o=php");

//Отправляем запрос на сервер
$Response = curl_exec($curl);
curl_close($curl);

// Разархивируем ответ сервера api.postcalc.ru
if (substr($Response,0,3) == "\x1f\x8b\x08") {
    $Response = gzinflate(substr($Response,10,-8));
}

//Преобразуем ответ в массив
$arrResponse = unserialize($Response);  

switch ($post_type){
    case 0: $post_type = "ЦеннаяПосылка";break;
    case 1: $post_type = "Посылка1Класс";break;
    case 2: $post_type = "EMS";break;
};

//Массив плейсхолдеров
$placeholders = array(
    'from_index' => $from,
    'to_index' => $to,
    'weight' => $weight,
    'val_price' => $val,
    'type' => $arrResponse['Отправления'][$post_type]['Название'],
    'price' => $arrResponse['Отправления'][$post_type]['Тариф'],
    'insurance' => $arrResponse['Отправления'][$post_type]['Страховка'],
    'cost' => $arrResponse['Отправления'][$post_type]['Доставка'],
    'time' => $arrResponse['Отправления'][$post_type]['СрокДоставки']
);
// Устанавливаем плейсхолдеры с префиксом
$modx->setPlaceholders($placeholders, 'postcalc.');

2. Создаем ресурс Расчет доставки
[[!postCalc? 
    &from=`675011`
    &to=`101000`
    &weight=`1000`
    &val=`100`
    &post_type=`1`
]]

<p>Тип отправления: <b>[[+postcalc.type]]</b></p>
<p>Индекс отправителя: <b>[[+postcalc.from_index]]</b></p>
<p>Индекс получателя: <b>[[+postcalc.to_index]]</b></p>
<p>Вес отправления: <b>[[+postcalc.weight]] г.</b></p>
<p>Ценность отправления: <b>[[+postcalc.val_price]] р.</b></p>
<p>Тариф: <b>[[+postcalc.price]] р.</b> <br />(Почтовый тариф в рублях без учета страховки)</p>
<p>Страховка: <b>[[+postcalc.insurance]] р.</b> <br />(Только для ценных отправлений с оценкой больше 0: страховка в рублях)</p>
<p>Полная стоимость: <b>[[+postcalc.cost]] р.</b> <br />(Для ценных отправлений с оценкой больше 0: тариф + страховка в рублях. Для остальных отправлений - то же самое, что тариф)</p>
<p>Срок доставки: <b>[[+postcalc.time]] дн.</b> <br />(Сроки примерные, но ориентироваться можно, как показала практика)</p>

Здесь параметры:
&from — индекс города отправителя
&to — индекс города получателя
&weight — вес посылки в граммах
&val — ценность посылки в рублях
&post_type — тип отправления (0 — ценная посылка, 1 — отправление первым классом, 2 — отправление ЕМС)

Сумма наложенного платежа в районах Крайнего Севера отличается, смотри документацию к API.

Ссылки:
http://postcalc.ru/api.html — документация к API
Василий Stepanov
05 июня 2018, 20:20
modx.pro
3
1 393
+6
Поблагодарить автора Отправить деньги

Комментарии: 1

Пётр Молчанов
06 июня 2018, 09:39
+1
Раньше тоже их использовал, но у почты есть собственный калькулятор otpravka.pochta.ru/specification#/nogroup-rate_calculate
100% актуальность данных + был момент, что postcalc.ru не передавал данные, что доставка до указанного пункта не доступна (из-за погоды было)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1