API 2.1 description

Запрос
Примеры запросов
Обязательные переменные запроса
Другие переменные запроса
Отправления: коды, ограничения по весу и ценности
Ответ
Декомпрессия ответа
Глобальные ошибки и предупреждения
Ошибки и предупреждения при расчете отправления
Глобальные переменные ответа
Массив "Отправления" ("Shipments")
Реализация
Полный рабочий пример кода
Библиотека Postcalc Light
Плагины

Полный рабочий пример кода

Пример использует библиотеку php-curl, которую настоятельно рекомендуется использовать в разработке, так как функция PHP file_get_contents() имеет ряд архитектурных недостатков.

Полный текст примера можно скачать здесь . Если пакет php-curl не установлен и нет возможности его установить, вы можете скачать аналогичный пример без применения функций curl.

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

<?php
/*
Пример обращения к API сервиса расчета почтовых тарифов Postcalc.RU.
Реализованы переключение на резервный сервер и кэширование ответов.
Кэшировать можно в любом каталоге, который доступен для записи веб-сервером.
Пример требует библиотеки php-curl.
*/

// === ИСХОДНЫЕ ДАННЫЕ
// = Данные запроса
$From      '101000';
$To        '190000';
$Weight    1000;
$Valuation 500;
$Country   'RU';
$Charset   'utf-8';    // Набор символов.
$Key       'test';     // Тестовый ключ, не более 50 запросов в сутки. Рабочий ключ необходимо получить в личном кабинете.
$Parcels   'bv,pv,p1'// Запросить расчеты по ценной бандероли, ценной посылке, ценной посылке 1-го класса.
$Corp      0;          // Расчеты для физ. лиц, не имеющих договора с Почтой России
$Services  'sm,uv';    // Опции: пакет SMS получателю и простое уведомление
$Partible  0;          // Неделимое отправление (товар нельзя отправить в нескольких посылках). 

// = Данные для подключения
$PostcalcServer1 'api.postcalc.ru';  // Рабочий сервер Postcalc.RU
$PostcalcServer2 'test.postcalc.ru'// Резервное зеркало Postcalc.RU
$Timeout 3// При недоступности рабочего сервера переключиться на резервный через 3 сек.

// = Данные для кэширования
$CacheDir sys_get_temp_dir(); // Каталог для хранения кэшированных данных.
$CacheValid 600// Кэш действителен в течение 600 сек.

// === СОБСТВЕННО РАСЧЕТ 
header("Content-Type: text/html; charset=$Charset");

// Формируем строку запроса со всеми необходимыми переменными
// Функция rawurlencode обязательна, если в качестве $From и $To выступают названия населенных пунктов. 
$QueryString  'f='  .rawurlencode$From );
$QueryString .= '&t=' .rawurlencode$To );
$QueryString .= "&w=$Weight&v=$Valuation&c=RU&o=php&cs=$Charset&key=$Key";
$QueryString .= "&p=$Parcels&co=$Corp&sv=$Services&pa=$Partible";

// Очищаем кэш от устарелых данных - все файлы старше $CacheValid сек.
$TimestampNow time();
foreach ( 
glob("$CacheDir/postcalc_*.txt") as $CacheFile 
    if ( (
$TimestampNow filemtime($CacheFile) )  > $CacheValid unlink$CacheFile );

// Проверяем в кэше, не было ли уже такого запроса
$CacheFile $CacheDir'/postcalc_' .md5($QueryString) .'.txt';

if ( 
file_exists$CacheFile ) ) {
    echo 
"Найдено в кэше!<br>\n";
    
$arrResponse unserializefile_get_contents($CacheFile) );
} else {
    
// Инициализируем curl
    
if ( function_exists('curl_init') ) {
        
$curl curl_init();
        
curl_setopt_array($curl
            array( 
                
CURLOPT_RETURNTRANSFER => 1,
                
CURLOPT_CONNECTTIMEOUT => $Timeout,
                
CURLOPT_HTTPHEADER => array('Connection: close''Accept-Encoding: gzip'),
                
CURLOPT_USERAGENT => phpversion()
            )
        );
    } else {
        die(
"Не установлен пакет php-curl!");
    }
    
    
// Соединяемся с рабочим сервером
    
curl_setopt($curlCURLOPT_URL"http://$PostcalcServer1/?$QueryString");
    
$Response curl_exec($curl);
    if ( !
$Response curl_exec($curl) ) {
       
// Если по какой-то причине рабочий сервер недоступен, переходим на резервное зеркало
       
curl_setopt($curlCURLOPT_URL"http://$PostcalcServer2/?$QueryString");
       if ( !
$Response curl_exec($curl) ) {
           die(
"Не удалось соединиться с $PostcalcServer1 и $PostcalcServer2 в течение $Timeout сек.!");
       }    
    }
    
curl_close($curl);
    
    
// Разархивируем ответ
    
if ( substr($Response,0,3) == "\x1f\x8b\x08" )  $Response=gzinflate(substr($Response,10,-8));
    
    
// Переводим ответ в массив PHP
    
$arrResponse unserialize($Response);
    
    
// Обработка ошибки
    
if ( $arrResponse['Status'] != 'OK' ) die("Сервер вернул ошибку: $arrResponse[Status]!");

    
// Если ошибки не было, сохраняем ответ в кэше
    
file_put_contents($CacheFile$Response);

}

// === ВЫВОД РЕЗУЛЬТАТОВ

// Выводим значение тарифа для ценной посылки
echo 'Тариф на ценную посылку: '$arrResponse['Отправления']['ЦеннаяПосылка']['Тариф'];
//  Выводим в цикле стоимость доставки для всех доступных отправлений:
echo "\n<pre>Полная стоимость доставки\n";
foreach  ( 
$arrResponse['Отправления'] as $parcel )
                          echo 
"$parcel[Название]\t$parcel[Доставка]\n";

echo 
"</pre>\n";