☰
   

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

Запрос
Ответ
Реализация

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

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

Полный текст примера можно скачать здесь .

В целом настоятельно рекомендуется использовать бесплатную библиотеку 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;          // Неделимое отправление (товар нельзя отправить в нескольких посылках). 

// = Данные для подключения
$PostcalcServer = 'api.postcalc.ru';  // Рабочий сервер Postcalc.RU
$Timeout = 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 = unserialize( file_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($curl, CURLOPT_URL, "http://$PostcalcServer/?$QueryString");
    if ( !
$Response = curl_exec($curl) ) 
           die(
"Не удалось соединиться с $PostcalcServer в течение $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";

We use cookies to analyze website traffic and improve the performance of our site. By continuing to use this website, you agree to our Personal Data Processing Policy.