Скрыть меню * Версия для печати

API почтового калькулятора Postcalc.RU версии 1.1


Внимание!
Для тестов Ваших скриптов настоятельно прошу использовать тестовый сервер test.postcalc.ru.
Вы можете видеть Ваши запросы в реальном времени, как они доходят до сервера и что происходит. Для этого воспользуйтесь формой по адресу:
http://test.postcalc.ru/mystat.php

Тестовый сервер test.postcalc.ru полностью синхронизирован с рабочим сервером api.postcalc.ru, результаты расчетов совершенно одинаковые.
Внимание!
С 25 декабря 2015 года сервер переходит на версию 1.1: в запросах по API поддерживаются названия населенных пунктов из "Эталонного справочника Почты России", а названия регионов России в запросах ("Ленинградская область", "Ненецкий автономный округ" и т.п.) объявляются устарелыми. Они будут поддерживаться для совместимости в течение 2016 года, однако затем их поддержка не гарантируется.

Вы можете скачать последнюю версию базы населенных пунктов (postcalc_light_cities), стран (postcalc_light_countires) и почтовых индексов (postcalc_light_post_indexes) в следующих форматах:
http://www.postcalc.ru/download/PostcalcLight_UTF8_TXT.zip - формат TXT, кодировка UTF8, около 640 Кб.
http://www.postcalc.ru/download/PostcalcLight_cp1251_TXT.zip - формат TXT, кодировка cp1251, около 570 Кб.
http://www.postcalc.ru/download/PostcalcLight_SQL.zip - формат дампа MySQL, от кодировки не зависит, около 670 Кб.

Также вы можете просмотреть список используемых названий населенных пунктов, стран и почтовых индексов онлайн:
Внимание!
В разработке настоятельно рекомендуется использовать - полностью или частично - библиотеку PostcalcLight. Она имеет все необходимые средства для предварительной проверки аргументов на правильность, а также реализует кэширование и опрос всех доступных серверов по цепочке.
Декомпрессия в API 1.0+.

Ответ сервера Postcalc.RU всегда архивируется в gzip (за исключением экспериментального формата plain). Для декомпрессии добавьте строчку:
$Request = 'http://api.postcalc.ru/?'.$QueryString;
$Response = file_get_contents($Request) or die('Can not connect!');
// Добавляем распаковку:
if ( substr($Response,0,3) == "\x1f\x8b\x08" ) $Response=gzinflate(substr($Response,10,-8));
Внимание! На платформе Битрикс обнаружилось следующее нестандартное поведение: функция gzinflate не блокируется, однако после распаковки поток усекается на несколько байт (?).
Для обхода проводите распаковку так:
$Response=gzinflate(substr($Response,10,-1));
Если это не поможет, замените полностью вызов file_get_contents() с последующей декомпрессией функцией gzinflate() на аналогичный вызов fopen() с применением обработчиков компрессии:
$Request = 'http://api.postcalc.ru/?'.$QueryString;
$fp = fopen("compress.zlib://$Request", "rb");
$Response = stream_get_contents($fp);
fclose($fp);

Внимание! Для разархивации на платформе 1C можно применить вызов из командной строки внешней программы:
ПараметрыGET = "?st=mysite.ru&ml=my@mysite.ru&Person=Ivan_Ivanov&f=101000&c=RU&o=wddx" +
"&w=" + Формат(Вес,"ЧГ=0") +
"&v=" + Формат(Окр(Ценность),"ЧГ=0") +
"&t=" + Индекс;


ИмяФайлаАрхива = КаталогВременныхФайлов() + "postcalc_new.zip";
ХТМЛ = Новый HTTPСоединение("api.postcalc.ru");
ХТМЛ.Получить(ПараметрыGET,ИмяФайлаАрхива);
СтрокаКоманды = """C:\Program Files\WinRar\winrar.exe"" e -y """ +  ИмяФайлаАрхива + """ """ +  КаталогВременныхФайлов() + """";
Шелл=Новый COMОбъект("Wscript.Shell");
Шелл.run(СтрокаКоманды,1,True);
ИмяФайлаОтвета =  КаталогВременныхФайлов() + "postcalc_new";
А это полное решение другого программиста: 1c_postcalc_request.txt
Очень признателен авторам, которые поделились своими решениями для платформы 1С!

Отличия в обработке ошибок
Перед запросом ваш скрипт должен проверять параметры на формальную правильность, прежде всего - вес отправления и получателя. Скрипты, которые регулярно выдают более 50% ошибок, будут однозначно отключаться. Для тестирования прошу активнее использовать test.postcalc.ru - там формальная правильность не проверяется.
Также настоятельно рекомендую изучить библиотеку PostcalcLight. Она имеет все необходимые средства для предварительной проверки аргументов на правильность.
Внимание!
В запросе к api.postcalc.ru обязательно должны быть следующие поля:

st ('Site')- домен сайта, на котором работает скрипт (обратите внимание - только домен, без http://, слешей и www),
ml ('Email') - почтовый адрес человека, ответственного за работу скрипта (программист или системный администратор),

например:
st=shop.mysite.ru&ml=programmer@test.ru

Без этих переменных суточный лимит обращений уменьшается с 500 до 50 запросов в сутки!

Я гарантирую доверительное обращение с информацией, содержащейся в данных переменных. Она будет использоваться исключительно для извещения лиц, ответственных за скрипт, о проблемах с их скриптом.
Дополнительное необязательное поле запроса:

sw ('Software') - произвольная строка латиницей, которая идентифицирует ваш плагин, подчеркивание, номер версии (например, MyBestPlugin_1.01);
В перспективе я планирую создать "кабинет разработчика" - если вы зарегистрируетесь в нем, то получите доступ к логам сервера Postcalc.RU и статистику обращений для вашей разработки.
Внимание!
На сайте, который использует обращение к API Postcalc.RU, должна быть размещена ссылка на проект в произвольной форме, например:

Сайт использует в расчетах www.postcalc.ru

или:
Наш магазин использует технологию http://www.postcalc.ru

Подробнее здесь.

1. Запрос

Вы можете щелкнуть по ссылкам и посмотреть ответ сервера в читабельном виде.

Пример запроса:
http://api.postcalc.ru/?f=101000&c=RU&t=190000&w=1000&v=1000&s=0&d=15.05.2014

Этот же запрос с опущенными параметрами по умолчанию (оценка - 0 рублей, страна - Россия, расчет на настоящий момент):
http://api.postcalc.ru/?f=101000&t=190000&w=1000

Это то же самое, что и следующий запрос (отделение 101000 является ОПС по умолчанию для Москвы, а 190000 - для Санкт-Петербурга):
http://api.postcalc.ru/?f=Москва&t=Санкт-Петербург&w=1000

Уважаемыe коллеги!
Обратите внимание, что в строке запроса любые символы, не являющиеся латиницей, необходимо преобразовывать в "процентную" кодировку. Браузер делает эту работу за вас, а в скрипте нужно явно вызывать функцию rawurlencode().
При этом пробелы в запросе абсолютно недопустимы - для сервера такой запрос является ошибочным и вы получите ответ 400 Bad Request .
Если вы используете в запросе названия местоположений, обязательно преобразуйте их функцией rawurlencode.

Неправильный запрос:
$Request='http://test.postcalc.ru/?f=Москва&t=Сергиев Посад&w=1000&v=1000&o=php';

Правильный запрос:
$Request='http://test.postcalc.ru/?f='.rawurlencode('Москва').'&t='.rawurlencode('Сергиев Посад').'&w=1000&v=1000&o=php';

Описание полей запроса
Мнемоника
(упрощает запоминание)
Переменная По умолчанию Описание
Site st нет
Домен сайта, на котором работает ваш скрипт.
Обязательное поле для api.postcalc.ru и коммерческих версий API.
Email ml нет
Контактная электронная почта лица, ответственного за работу скрипта (программист или системный администратор).
Обязательное поле для api.postcalc.ru и коммерческих версий API.
From f нет

2 варианта (распознаются автоматически).

1. Название населенного пункта отправителя, как это определено в списке населенных пунктов. Кодировка - cp1251 или utf8, распознается автоматически, регистр букв значения не имеет, однако должны присутствовать все пробелы, скобки и дефисы. Индекс предприятия связи берется по умолчанию - это отделение связи с наименьшим номером. 

2. 6-значный индекс отправителя.

To t нет

2 варианта (распознаются автоматически).

1. Название населенного пункта адресата, как это определено в списке населенных пунктов. Кодировка - cp1251 или utf8, распознается автоматически, регистр букв значения не имеет, однако должны присутствовать все пробелы, скобки и дефисы. Индекс предприятия связи берется по умолчанию - это отделение связи с наименьшим номером. 

2. 6-значный индекс адресата.

Weight w нет Вес отправления в граммах. Не более 100 кг.
Valuation v 0 Оценка товарного вложения в рублях. Не более 100 тыс. рублей. 
Date d now Дата, на которую нужно рассчитать отправку, в любом формате, который распознается функцией PHP strtotime(). В частности, распознаются такие варианты: 30.01.2011, 30-01-2011, 2011-01-30, now, +10days. По умолчанию - текущий момент времени (now).
Step s 0 Если 0, выводится подробный расчет для данного отправления, с учетом веса и оценки. Если равно 100, 500 или 1000, выдается таблица тарифов для отправлений разного веса с шагом 100, 500 или 1000 граммов соответственно. Таблица содержит 20 строк. Параметр экспериментальный, поддержка может измениться в любой момент.
Country c RU Двузначный код страны (для международных доставок) из списка.
Output o html

Формат выдачи данных. Поддерживаются следующие форматы: php, json, wddx, html, arr, plain. Регистр букв значения не имеет.
1. HTML. Страница html в читабельном виде, кодировка определяется переменной cs, удобно для просмотра ответа сервера прямо из браузера. По умолчанию - UTF-8.
2. PHP. Массив PHP, обработанный функцией serialize(). Кодировка определяется переменной cs. Удобно для использования напрямую в скриптах PHP, для чего на стороне клиента следует использовать функцию unserialize() - см. пример в конце страницы. По умолчанию - UTF-8.
3. ARR. Массив PHP, выведенный функцией var_export(). Кодировка определяется переменной cs, удобно для контроля ответов сервера из браузера. По умолчанию - UTF-8.
4. WDDX (разновидность xml) - массив PHP, обработанный функцией wddx_serialize_value(). Кодировка UTF-8.
5. JSON - массив PHP, обработанный функцией json_encode(). Кодировка UTF-8 + JavaScript Object Notation (JSON). Удобно для использования в JavaScript.
Для выдачи в формате JSONP просто добавьте в запрос переменную callback=[Название_функции_обратного_вызова].
6. PLAIN - простой текст; это единственный вариант ответа, который не сжимается gzip. Каждая строчка имеет 3 поля, разделенных пробелом: код отправления, доставка, срок доставки. Формат экспериментальный, может измениться в любой момент.

- callback нет Название функции обратного вызова JavaScript, применяется в сочетании с форматом o=json. Если сервер обнаруживает такую переменную, то возвращает ответ в формате JSONP с заголовком content-type: application/javascript. В названии функции допускаются: латиница в любом регистре, цифры, знак подчеркивания.
Extended e 0 Детализация ответа. При e=0 выдаются основные данные (тариф, страховка, оценка, наложенный платеж, сроки доставки, адреса и телефоны отделений связи), при других значениях могут выдаваться некоторые недокументированные сведения. При разработке собственных модулей, обращающихся к API PostCalc.RU, настоятельно рекомендуется ограничиваться только основными данными, так как расширенные данные могут меняться без уведомления.
IBase ib f База для расчета страховки (только при оценке товарного вложения больше 0!).

Если IBase=p или Partial, то страхуется только товарное вложение. Например, посылка с оценкой 1000 рублей будет застрахована на 1000 * 4% = 40 рублей независимо от стоимости доставки.
В случае пропажи отправления почта возместит только стоимость товара, а расходы на доставку и страховку придется списать в убыток.
Кроме того, при отправке наложенным платежом возникает проблема расчета суммы, которую адресат должен выплатить при получении отправления: ведь эта сумма больше оценки товара и должна покрывать расходы интернет-магазина на доставку и страховку

Если IBase=f или Full, базой страховки будет Оценка Товара + Тариф + Страховка, и в случае пропажи отправления почта полностью возместит ущерб. Это самый оптимальный вариант для отправки наложенным платежом, а конечная сумма, которую должен заплатить адресат - это столбец "Ценность" на веб-странице или поле ОценкаПолная в ответе по API.
Ценность вычисляется по формуле: Ценность = Тариф + Оценка вложения + Страховка
Размер страхового сбора вычисляется по формуле: Страховка = ( Тариф + Оценка ) * СтавкаСбора / (1 - СтавкаСбора)
ProcessingFee pr 0 Пользовательская наценка за обработку заказа в рублях. Сюда можно также включить уведомление о вручении.
PackingFee pk 0 Пользовательская наценка за упаковку одного отправления в рублях.
Round r 0.01 Округление Ценности в верхнюю сторону до [Round] рублей. Рекомендуется задать Round=1 или 10, чтобы не путаться с копейками.
Все остальные данные расчета (Тариф, Страховка, Доставка) всегда выводятся с копейками.
VAT vt 1 Если 1, НДС включен в тариф, если 0 - НДС вычитается из тарифа.
Внимание! Следует различать вычитание НДС для целей бухгалтерского учета (возможно для всех отправлений) и отправку по более низким тарифам без НДС (невозможно для посылок и EMS). Подробнее см. вопрос Какие почтовые отправления можно посылать по тарифам без НДС?
Charset cs UTF-8 Кодировка для выходных форматов php, arr, html. Соответствует списку, который выводит функция php mb_list_encodings(). В частности, для русского языка доступны UTF-8, Windows-1251, KOI8-R, CP866, ISO-8859-5.
По умолчанию - UTF-8.
Внимание! Не рекомендуется использовать иные кодировки, кроме UTF-8 и Windows-1251.
Внимание! Для форматов json и wddx кодировка - всегда UTF-8! (ограничение функций php)

 

2. Ответ

Ответ - иерархический массив в одном из 5 форматов (см. описание ключа Output в запросе). Обратите внимание, что большинство ключей написано кириллицей - это, на мой взгляд, значительно упрощает работу русскоязычных программистов. 

А. Общие ключи - для всех видов отправлений.

Ключ Значение
Status Если ошибки нет, возвращает OK, иначе - код ошибки
API Версия сервера. "Старая" версия 2010-начала 2014 года обозначается как 0.9, поддерживает как "старое", так и "новое" API. Версия 2014 года обозначается как 1.0, поддерживает только новое АPI.
Message Сообщение об ошибке. Ключ устанавливается, только если возникла ошибка (Status!='OK').
_request

Эхо-массив переменных запроса, полученных сервером от клиента. Может быть полезно при отладке.

_server

Массив следующих переменных сервера: SERVER_ADDR, REMOTE_ADDR, HTTP_HOST, HTTP_USER_AGENT, HTTP_ACCEPT_ENCODING. Может быть полезно при отладке.

Дата Дата расчета тарифа в формате ДД.ММ.ГГГГ
ДатаСверкиТарифов Дата сверки тарифов с сайтами Почты России и EMS
Вес Вес отправления в граммах, использовавшийся при расчетах.
Оценка Оценка вложения в рублях, использовавшаяся при расчетах.
СрокДоставки Нормативный срок доставки в сутках. Для международных отправлений устанавливается только для EMS.
Международное Пункт международного обмена почтой - МОСКВА или САНКТ-ПЕТЕРБУРГ. Ключ устанавливается только для доставки за рубеж.

Ключи Откуда и Куда - устанавливаются для всех отправлений; для международных отправлений значения Куда следует игнорировать. 

Ключ1 Ключ2 Значение
Откуда
=или=
Куда
Индекс 6-значный индекс предприятия связи.
Название Название отделения связи, например, МОСКВА-523.
Адрес  Адрес отделения связи.
Телефон Телефоны отделения связи.
МестоположениеEMS Название центра региона или субъекта федерации (см. список Местоположений EMS).
ЦентрРегиона Название центра региона.

Ключ Ограничения устанавливается только для внутренних отправлений и только если для данного почтового индекса имеются ограничения по доставке. 

Ключ1 Ключ2 Ключ3 Значение
Ограничения Откуда
=или=
Куда
Тип Буквенное обозначение типа ограничения, используется во внутренних процедурах PostCalc.RU. Варианты: 
1. Запрет - установлен только период(ы) полного запрета доставки, в остальное время доставка наземная.
2. АвиаВесьГод-Авиа - авиадоставка от центра региона круглый год, установлен период(ы), когда возможна только авиадоставка.
3. АвиаВесьГод-Наземный - комбинированная доставка от центра региона круглый год; установлен период(ы), когда возможна только комбинированная доставка. 
4. АвиаСезонно - установлен период, когда возможна только авиадоставка, в остальное время доставки нет вообще.
5. Запрет* - особая ситуация, связанная с ошибкой в Эталонном справочнике ограничений: установлены периоды запрета доставки, однако имеется сноска, что доставка авиа разрешена. Для этих ОПС точный расчет тарифа в периоды закрытия для наземной доставки невозможен (в основном Якутия).
Действует Действует ли ограничение на момент расчета. Если действует, принимает значение 'ЗАПРЕТ' или 'АВИА'.
АвиаДоставка Период доставки только авиатранспортом в формате ДД.ММ-ДД.ММ;ДД.ММ-ДД.ММ...
ЗапретДоставки Период полного запрета доставки в формате ДД.ММ-ДД.ММ;ДД.ММ-ДД.ММ...

Ключ Магистраль - устанавливается только для внутренних отправлений, и только если имеется доставка по магистрали (между центрами регионов). 

Ключ1 Ключ2 Значение
Магистраль Описание Описание маршрута, например, МОСКВА=>САНКТ-ПЕТЕРБУРГ
Расстояние  Тарифицируемое расстояние между городами магистрали в км по железной дороге. Для регионов, куда железнодорожной доставки нет - примерное расстояние.
ДоставкаСтандарт  Нормативный срок доставки посылки наземным (водным) транспортом в сутках, не считая дня подачи отправления.
ДоставкаАвиа Нормативный срок доставки письменной корреспонденции, он же установлен и для доставки посылок авиатранспортом. 
ДоставкаКласс1 Нормативный срок доставки 1-м классом.

 

Б. Ключи и значения для внутренних отправлений (Country=RU или параметр в запросе опущен):

Ключ Описание
ПростаяБандероль Простая бандероль
ЗаказнаяБандероль

Заказная бандероль

ЗаказнаяБандероль1Класс Заказная бандероль 1 класс
ЦеннаяБандероль Ценная бандероль
ЦеннаяПосылка Ценная посылка
ЦеннаяАвиаБандероль Ценная авиабандероль
ЦеннаяАвиаПосылка Ценная авиапосылка
ЦеннаяБандероль1Класс Ценная бандероль 1 класс
EMS Курьерская доставка EMS
ПосылкаОнлайн Услуга "Посылка Онлайн" для корпоративных клиентов
КурьерОнлайн Услуга "Курьер Онлайн" для корпоративных клиентов
ПростоеПисьмо Простое письмо
ЗаказноеПисьмо Заказное письмо
ЦенноеПисьмо Ценное письмо
ПростойМультиконверт Простой мультиконверт
ЗаказнойМультиконверт Заказной мультиконверт

Ключи и значения для внутренних отправлений на примере ценной бандероли:

Верхний уровень Ключ1 Ключ2 Значение
$arrReply["Отправления"]   ["ЦеннаяБандероль"]   ["Название"] Название почтового отправления
["Количество"] Число почтовых отправлений с учетом максимального разрешенного веса.
["Тариф"] Почтовый тариф в рублях (без учета страховки).
["Страховка"] Только для ценных отправлений с оценкой больше 0: страховка в рублях.
["Доставка"] Для ценных отправлений с оценкой больше 0: тариф+страховка в рублях. Для остальных отправлений - то же самое, что тариф.
["Проверено"] Если 1, расчет полностью основан на документально подтвержденных тарифах. Если 0, возможны неточности. В частности, при расчете ценных отправлений для большинства городов используются магистральные пояса не из официальных документов Почты России, а вычисленные на основе расстояний по железной дороге, то же относится к авиатарифам и т.п. Обычно неточность невелика и находится в пределах нескольких рублей на килограмм веса.
Простые и заказные бандероли, а также EMS, всегда имеют в этом поле 1.
["ОценкаПолная"] Только для ценных отправлений: сумма оценки в рублях, которую необходимо дать почтовому отправлению, чтобы получить на расчетный счет сумму, равную оценке товарного вложения. Равна: Оценка товарного вложения + Тариф + Страховка.
["НаложенныйПлатеж"] Только для ценных отправлений: сумма в рублях, которую платит адресат на почте при наложенном платеже.
["НаложенныйПлатеж2"] Только для ценных отправлений в Томской и Иркутской областях, Красноярском крае, Якутии: наложенный платеж в районах, приравненных к Крайнему Северу. В остальных регионах равно 0.
["НаложенныйПлатеж3"] Только для ценных отправлений в Красноярском крае: наложенный платеж в районах Крайнего Севера. В остальных регионах равно 0.
["НетРасчета"]

Ключ устанавливается, если тариф для данного отправления не может быть достоверно рассчитан. Содержит описание причины. Следующие варианты:
1. Авиабандероль и авиапосылка, если в базе данных нет магистрального авиатарифа (тарифа на перелет между центрами регионов).
2. Простая и заказная бандероль по маршруту, который включает отрезки с авиадоставкой (возможен только расчет ценных отправлений).
3. Отделение отправителя или получателя временно закрыто.
4. Ошибка в Эталонном справочнике ограничений по доставке.

["ВычетНДС"]

Флаг. Если 1, вычет НДС возможен. Если 0 - НДС вычитаться не будет, даже если в запросе vt=0.

["Ценное"]

Флаг. Если 1 - допускает оценку и, соответственно, расчет страховки и наложенного платежа. Если 0 - оценка отправления невозможна.

["Товарное"]

Флаг. Если 0 - таким отправлением можно посылать только книжно-журнальную продукцию и документы. Если 1 - возможно товарное вложение.

["КлассДоставки"]

Класс доставки. Если 0 - наземная доставка, если 1 - премиум (авиа и 1-й класс), если 2 - курьерская.

 

В. Ключи и значения для международных отправлений:

Ключ Описание
МждМешокМ Международный мешок М
МждМешокМАвиа

Международный мешок М авиа

МждМешокМЗаказной Международный мешок М заказной
МждМешокМАвиаЗаказной Международный мешок М авиа заказной
МждБандероль Международная бандероль
МждБандерольАвиа Международная авиабандероль
МждБандерольЗаказная Международная бандероль заказная
МждБандерольАвиаЗаказная Международная авиабандероль заказная
МждМелкийПакет Международный мелкий пакет
МждМелкийПакетАвиа Международный мелкий пакет авиа
МждМелкийПакетЗаказной Международный мелкий пакет заказной
МждМелкийПакетАвиаЗаказной Международный мелкий пакет авиа заказной
EMS_МждДокументы ЕMS международное - документы
EMS_МждТовары ЕMS международное - товары

Ключи и значения для международных отправлений на примере международного отправления EMS с товарным вложением:

Ключ1 Ключ2 Значение
ЕMS международное - товары
 
Название Название почтового отправления
Количество Число почтовых отправлений с учетом максимального разрешенного веса.
Тариф Почтовый тариф в рублях (без учета страховки).
Страховка Только для ценных отправлений с оценкой больше 0: страховка в рублях.
Доставка Для ценных отправлений с оценкой больше 0: тариф+страховка в рублях. Для остальных отправлений - то же самое, что тариф.
ОценкаПолная Только для ценных отправлений: сумма оценки в рублях, которую необходимо дать почтовому отправлению, чтобы получить на расчетный счет сумму, равную оценке товарного вложения. Равна: Оценка товарного вложения + Тариф + Страховка.
ВычетНДС

Флаг. Если 1, вычет НДС возможен. Если 0 - НДС вычитаться не будет, даже если в запросе vt=0.

Ценное

Флаг. Если 1 - допускает оценку и, соответственно, расчет страховки. Если 0 - оценка отправления невозможна.

Товарное

Флаг. Если 0 - таким отправлением можно посылать только книжно-журнальную продукцию и документы. Если 1 - возможно товарное вложение.

КлассДоставки

Класс доставки. Если 0 - наземная доставка, если 1 - премиум (авиа), если 2 - курьерская.

3. Полный пример запроса на PHP к Postcalc.RU:

Полный текст примера можно скачать здесь . Настоятельно рекомендуется использовать библиотеку PostcalcLight.
<?php
 
// === Исходные данные
$From='101000';
$To='190000';
$Weight=1000;
$Valuation=500;
$Country='RU';
$Site='shop.mysite.ru';
$Email='admin@mysite.ru';
// ==========
header('Content-Type: text/html; charset=utf-8');
 
// Формируем запрос со всеми необходимыми переменными
$QueryString  = 'f=' .rawurlencode($From);
$QueryString .= '&t=' .rawurlencode($To);
$QueryString .= "&w=$Weight&v=$Valuation&c=RU&o=php&cs=utf-8";
$QueryString .= "&st=$Site&ml=$Email";
 
// Формируем URL запроса.
$Request="http://api.postcalc.ru/?$QueryString";
 
// Формируем опции запроса. Это необязательно, однако упрощает контроль и отладку
$arrOptions = array('http' =>
array( 'header'  => 'Accept-Encoding: gzip','timeout' => 5, 'user_agent' => phpversion() )
);
 
// Соединяемся с сервером
if ( !$Response=file_get_contents($Request, false , stream_context_create($arrOptions)) )
die('Не удалось соединиться с api.postcalc.ru!');
 
 
// Разархивируем ответ
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]!");
 
// Выводим значение тарифа для бандероли
echo 'Тариф на бандероль: '. $arrResponse['Отправления']['ПростаяБандероль']['Тариф'];
 
//  Выводим в цикле все доступные тарифы 
echo "<pre>\n";
foreach  ( $arrResponse['Отправления'] as $parcel )
echo "$parcel[Название]\t$parcel[Доставка]\n";
 
echo "</pre>\n";
 

(c) PostCalc.RU 2010-16



Яндекс.Метрика

Time elapsed: 0.00234