Полный рабочий пример кода
Пример использует библиотеку 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";
|