Описание API 2.1

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

Запрос

Примеры запросов

Вы можете щелкнуть по ссылкам и посмотреть ответ сервера в читабельном виде.
Внимание! Обратите внимание, что ссылки должны иметь в начале протокол http://. Некоторые веб-браузеры принудительно подменяют http на https. В этом случае вы получите ошибку 403, т.к. API по https не работает. Создание шифрованного канала для API не имеет смысла, так как только существенно замедляет обмен данными и создаёт бесполезную нагрузку как на сервер, так и на клиента.
Пример 1. Минимальный запрос, указаны индексы почтовых отделений
Указаны почтовый индекс отправителя и получателя, вес - 1000 г, ценность - 0 рублей. Остальные параметры будут установлены по умолчанию.
http://api.postcalc.ru/?f=101000&t=190000&w=1000&v=0&key=test

Исчерпывающий список почтовых индексов, используемых Postcalc.RU в данный момент, можно: Примечание 1. В данном примере отсутствует переменная запроса p= (виды почтовых отправлений). Были подставленны значения по умолчанию - в текущей версии API это следующие 5 отправлений: ценная бандероль, ценная бандероль 1 класса, ценная посылка, ценная посылка 1 класса, курьерская доставка EMS. Настоятельно рекомендуется задавать список отправлений в явном виде, так как в последующих выпусках API переменная p= станет строго обязательной.

Примечание 2. Обратите внимание, что ценная бандероль и ценная бандероль 1 класса вернут ошибку расчета, так как их оценка не может быть менее 1 рубля.
Пример 2. Минимальный запрос, указаны ключи населенных пунктов
Минимальный запрос, вместо почтового индекса указаны ключи населенных пунктов на русском или английском языках, вес - 1000 г, ценность - 1000 рублей.
http://api.postcalc.ru/?f=Москва&t=Санкт-Петербург&w=1000&v=1000&key=test
http://api.postcalc.ru/?f=Сергиев_Посад,_50&t=Новокузнецк,_42&w=1000&v=1000&key=test
http://api.postcalc.ru/?f=Sergiyev_Posad,_50&t=Novokuznetsk,_42&w=1000&v=1000&key=test

Ключи населенных пунктов:
  • Для центров регионов состоят из названия населенного пункта: Москва, Самара, Благовещенск.
  • Для прочих населенных пунктов состоят из его названия и номера региона через запятую: Сергиев Посад, 50; Благовещенск, 2 (город в Башкортостане), Самара, 38 (село в Иркутской области); Самара, 79 (село в Еврейской АО).
  • Если в пределах одного региона находятся несколько населенных пунктов с одним названием, то через запятую добавляется район: Михайловка, 2, Абзелиловский; Михайловка, 2, Архангельский; Михайловка, 2, Бакалинский.
В ключе населенного пункта вместо номера региона можно указать его название (старый формат запроса), например: Сургут, Ханты-Мансийский-Югра автономный округ; Сергиев Посад, Московская область. Однако так делать не рекомендуется, так как это ухудшает читаемость и удлиняет строку запроса, кроме того, у регионов имеются альтернативные названия и они могут меняться.

Исчерпывающий список ключей населенных пунктов, используемых Postcalc.RU в данный момент, можно:
  • Посмотреть онлайн.
  • Скачать в формате дампа таблицы MySQL.
  • Скачать упрощенную версию в "старом" формате (вместо номера региона указано название) в виде текста или дампа MySQL для Postcalc Light (таблица postcalc_light_cities). "Старый" формат будет поддерживаться в течение 2021 года, далее поддержка не гарантируется.
Примечание. Если в переменной f= (или t=) указан не конкретный почтовый индекс, а населенный пункт, API самостоятельно ищет почтовые отделения, из которых/в которые можно отправить данный вид посылок. Это прежде всего относится к отправлениям для корпоративных клиентов, поскольку они принимаются и выдаются не во всех отделениях связи.
Например, если вы отправляете из московского отделения 105005 в отделение 190000 Посылку Онлайн, то запрос
http://api.postcalc.ru/?f=105005&t=190000&w=1000&v=1000&p=po&key=test
- вернет ошибку, так как в отделении 105005 приема Посылки Онлайн нет.
В то же время запрос
http://api.postcalc.ru/?f=Москва&t=190000&w=1000v=1000&p=po&key=test
- вернет корректный расчет, так как API самостоятельно найдет в пределах Москвы отделение связи, откуда можно отправить Посылку Онлайн.
Аналогично, запрос на доставку ЕКОМ в 190000 вернет ошибку, так как в 190000 ЕКОМ не выдается:
http://api.postcalc.ru/?f=105005&t=190000&w=1000&v=1000&p=ek&key=test
А запрос на доставку в Санкт-Петербург вернет правильный расчет:
http://api.postcalc.ru/?f=101000&t=Санкт-Петербург&w=1000v=1000&p=ek&key=test
Пример 3. Минимальный запрос на международную отправку
В параметре t= в этом случае задается название страны или код из 2 букв.
http://api.postcalc.ru/?f=Москва&t=DE&w=1000&v=0&key=test
http://api.postcalc.ru/?f=Москва&t=Германия&w=1000&v=0&key=test
Исчерпывающий список кодов и названий стран, используемых Postcalc.RU в данный момент, можно: Примечание. В предыдущих версиях API название страны задавалось в отдельной переменной c= в виде кода страны из 2 букв. Совместимость будет поддерживаться в течение 2021 года.
Пример 4. Расчет для физического лица без договора с Почтой России
http://api.postcalc.ru/?f=101000&t=190000&w=1000&v=1000&key=test&p=bv,pv,b1v,p1,em&co=0&d=now&ib=p&sv=fr,sm
Будут рассчитаны:
1. Отправления - ценная бандероль, посылка, ценная бандероль 1 класса, посылка 1 класса, EMS (p=bv,pv,b1v,p1,em).
2. Тарификация - для физического лица без договора с Почтой России (co=0). Это значит, что отправления для корпоративных клиентов не рассчитываются, даже если будут запрошены, а тарифы для ценной посылки, ценной посылки 1 класса и EMS Оптимальное будут несколько выше.
3. Расчет на сегодняшний день (d=now, по умолчанию, можно опустить).
4. База страховки - только объявленная ценность товарного вложения (ib=p, по умолчанию, можно опустить).
5. Дополнительные опции - хрупкое вложение и SMS получателю (sv=fr,sm).
Пример 5. Расчет для юридического лица или ИП, имеющего договор с Почтой России ("Корпоративный клиент").
http://api.postcalc.ru/?f=101000&t=191167&w=1000&v=1000&key=test&p=po,co,ek,emo,empt&co=1&d=10days&bo=m&sv=ko,op&pk=50&pr=25
Будут рассчитаны:
1. Отправления - Посылка Онлайн, Курьер Онлайн, ЕКОМ, EMS Оптимальное (p=po,co,ek,ekp,emo).
2. Тарификация - для юридического лица или ИП, имеющего договор с Почтой России ("Корпоративный клиент") (co=1). Доступны все тарифы, при этом тарифы для ценной посылки, посылки 1 класса и EMS Оптимальное несколько ниже, чем для физлиц.
3. Дата расчета: сегодня +10 дней (d=10days). Это полезная возможность для интернет-магазинов рассчитать тариф на предполагаемую дату отправки товара.
4. Дополнительные опции - проверка комплектности и опись вложения (sv=ko,op).
5. При расчете ЕКОМ и EMS использовать коробку размера "М" (bo=m).
6. Добавить на каждое отправление стоимость упаковки 50 рублей (pk=50).
7. Добавить 25 рублей на оформление заказа (pr=25).
Обратите внимание, что прием и выдача большинства отправлений для корпоративных клиентов возможен только в специальных отделениях связи. Список этих отделений можно посмотреть по ссылке.

Обязательные переменные запроса

Эти переменные обязательно должны присутствовать в запросе. Если их нет, либо они не проходят проверку - возвращается глобальная ошибка. Переменные v= и p= по состоянию на декабрь 2020 года имеют умолчания для упрощения перехода с предыдущих версий API, однако в течение 2021 года они также станут строго обязательными.
Мнемоника
(упрощает запоминание)
Переменная Описание
Key key Ключ доступа. Ключ необходимо получить в Личном кабинете. Возможно использование тестового ключа key=test (не более 50 запросов в сутки по московскому времени с одного IP).
Обязательное поле с 25 декабря 2019 года.
From f 2 варианта (распознаются автоматически):
1. 6-значный индекс отправителя.
Исчерпывающий список почтовых индексов, используемых Postcalc.RU в данный момент, можно: 2. Ключ населенного пункта отправителя на русском или английском языке. Кодировка - cp1251 или utf8, регистр букв значения не имеет, однако должны присутствовать все пробелы, скобки и дефисы.
Исчерпывающий список ключей населенных пунктов, используемых Postcalc.RU в данный момент, можно:
  • Посмотреть онлайн.
  • Скачать в формате дампа таблицы MySQL.
  • Скачать упрощенную версию в "старом" формате (вместо номера региона указано название) в виде текста или дампа MySQL для Postcalc Light (таблица postcalc_light_cities). "Старый" формат будет поддерживаться в течение 2021 года, далее поддержка не гарантируется.
Пробелы в запросах можно заменить на подчеркивание: Сергиев_Посад,_50.

Обновление баз данных происходит один раз в месяц.
To t 3 варианта (распознаются автоматически):
1. 6-значный индекс отправителя.
Исчерпывающий список почтовых индексов, используемых Postcalc.RU в данный момент, можно: 2. Ключ населенного пункта отправителя на русском или английском языке. Кодировка - cp1251 или utf8, регистр букв значения не имеет, однако должны присутствовать все пробелы, скобки и дефисы.
Исчерпывающий список ключей населенных пунктов, используемых Postcalc.RU в данный момент, можно:
  • Посмотреть онлайн.
  • Скачать в формате дампа таблицы MySQL.
  • Скачать упрощенную версию в "старом" формате (вместо номера региона указано название) в виде текста или дампа MySQL для Postcalc Light (таблица postcalc_light_cities). "Старый" формат будет поддерживаться в течение 2021 года, далее поддержка не гарантируется.
Пробелы в запросах можно заменить на подчеркивание: Сергиев_Посад,_50.

3. Код из 2 букв или название страны на русском или английском языке.
Список стран и кодов можно: Примечание. В предыдущих версиях API название страны задавалось в отдельной переменной c= в виде кода страны из 2 букв. Совместимость будет поддерживаться в течение 2021 года.

Обновление баз данных происходит один раз в месяц.
Weight w Вес отправления - число полных и неполных граммов (неполный грамм округляется в верхнюю сторону). Число от 1 до 31500. Рекомендуется проверять выход за допустимые пределы по таблице отправлений.
Valuation v Ценность отправления в рублях. Число от 0 до 100 000 для физических лиц и до 3 000 000 для корпоративных клиентов. Рекомендуется проверять выход за допустимые пределы по таблице отправлений.
Parcels p Список кодов отправлений через запятую. Для бесплатного доступа - не более 5 внутренних отправлений и не более 5 международных, для платного не более 8 внутренних и 8 международных. Коды международных отправлений начинаются с i.

Опциональное поле с 16 марта 2020 года, с 01 июня 2020 года - обязательное.

Полный список кодов можно: Внимание! Если переменная p= не задана, то в настоящее время это не вызовет ошибки, а по умолчанию в ответе будут:
  • Для расчетов внутренних отправлений - ценная бандероль, посылка, ценная бандероль 1 класса, посылка 1 класса, EMS (bv,pv,b1v,p1,em);
  • Для международных - мелкий пакет заказной авиа/наземный, посылка, авиапосылка, EMS с товарным вложением (isr,isar,ip,ipa,iem).
Это временная мера для облегчения перехода с предыдущих версий API; настоятельно рекомендуется задавать p= в явном виде.

Другие переменные запроса

У этих переменных есть умолчания, поэтому их можно опустить в запросе. Умолчания следующие:
  1. Корпоративный клиент, имеющий договор с Почтой России (co=1).
  2. Формат выдачи HTML (o=html).
  3. Отправление нельзя разделить на несколько, при превышении веса выдается ошибка (pa=0).
  4. Набор символов UTF-8 (cs=utf-8).
  5. Дата расчета - сегодня (d=now).
  6. НДС включен (vt=1).
  7. Коробка для ЕКОМ и EMS - размер "S" (bo=s).
  8. Дополнительных услуг нет (sv - пустая строка).
  9. Наценка за обработку заказа - нет (pr=0).
  10. Наценка за упаковку - нет (pk=0).
  11. База страховки - только товарное вложение (ib=p).
  12. Ставка наложенного платежа для корп. клиентов - нет (cod=0).
  13. Минимальная сумма комиссии наложенного платежа для корп. клиентов - нет (codm=0).
  14. Язык ответа - русский (la=ru).
  15. Валюта ответа - рубли (cu=rub).
Мнемоника
(упрощает запоминание)
Переменная По умолчанию Описание
Output o html Формат выдачи данных. Поддерживаются следующие форматы: php, json, wddx, html, arr, plain. Регистр букв значения не имеет.
1. HTML. Страница html в читабельном виде, кодировка определяется переменной cs, удобно для просмотра ответа сервера прямо из браузера. По умолчанию - UTF-8.
2. PHP. Массив PHP, обработанный функцией serialize(). Кодировка определяется переменной cs, по умолчанию - UTF-8. Удобно для использования напрямую в скриптах PHP, для чего на стороне клиента следует использовать функцию unserialize() - см. пример в конце страницы.
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. Кодировка UTF-8.
Для выдачи в формате JSONP просто добавьте в запрос переменную callback=[Название_функции_обратного_вызова].
6. PLAIN - простой текст; это единственный вариант ответа, который не сжимается gzip. Каждая строчка имеет 3 поля, разделенных пробелом: код отправления, доставка, срок доставки. Формат экспериментальный, может измениться в любой момент.
Callback callback нет Название функции обратного вызова JavaScript, применяется в сочетании с форматом o=json.
Если сервер обнаруживает такую переменную, то возвращает ответ в формате JSONP с заголовком content-type: application/javascript.
В названии функции допускаются: латиница в любом регистре, цифры, знак подчеркивания.
Charset cs utf-8 Кодировка для выходных форматов php, arr, html. В данный момент распознаются utf-8 и windows-1251 (можно задавать как cp1251).
По умолчанию - utf-8.
Внимание! Для форматов json и wddx кодировка - всегда UTF-8! (ограничение функций php)
Date d now Дата, на которую нужно рассчитать отправку, в любом формате, который распознается функцией PHP strtotime(). В частности, распознаются такие варианты: 2021-01-30 (предпочтительный вариант), 30.01.2021, 30-01-2021, now, +10days. По умолчанию - текущий момент времени (now).
VAT vt 1 Если 1, НДС включен в тариф, если 0 - НДС вычитается из тарифа.
Внимание! Следует различать вычитание НДС для целей бухгалтерского учета (возможно для всех отправлений) и отправку по более низким тарифам без НДС (возможно только при оплате марками письменных отправлений).
Corporative co 1 Если 1, расчет идет по тарифам для клиентов, имеющих договор с Почтой России ("корпоративные клиенты").
Eсли 0 - расчет по тарифам для "обычных" клиентов: физических лиц и индивидуальных предпринимателей без договора, при этом не рассчитываются отправления для корпоративных клиентов: Посылка и Курьер Онлайн, ЕКОМ, Бизнес-Курьер, Бизнес-Курьер Экспресс, EMS PT .
По состоянию на февраль 2021 года касается:
  • Расчета ценных посылок.
  • Расчета "EMS Оптимальное".
  • Некоторых дополнительных услуг.
Для "корпоративных клиентов" тарифы несколько ниже.
С 23 марта 2020 года по умолчанию - 1, до этого - 0.
Box bo s Тип коробки, определяет т.н. объемный вес. Если объемный вес больше реального, то при расчете тарифа применяется именно он.
Касается только расчета ЕКОМ и внутренного отправления EMS.
Значения: s (коробка "S", 260*170*80 мм), m (коробка "M", 300*200*150 мм), l (коробка "L", 400*270*180 мм), xl (коробка "XL", 530*360*220 мм), ng (негабаритная коробка, сумма сторон не более 1400 мм, одна сторона не более 600 мм).
Services sv пустая строка Опции отправки и дополнительные услуги . Список кодов через запятую, например: sv=sm,ko,cod.
КодУслуга
frХрупкая
ngНегабаритная
opПроверка соответствия вложения описи
koПроверка комплектности
ppПредпочтовая подготовка
smSMS получателю
sm2SMS отправителю
codОплата в момент доставки (COD)
uvПростое уведомление о вручении
uvrЗаказное уведомление о вручении
uveЭлектронное уведомление о вручении
iuvМеждународное уведомление о вручении
Примечание 1. Уведомление о вручении может быть только одно - либо простое, либо заказное, либо электронное. Если в запросе заданы несколько кодов уведомлений (uv, uvr, uve), то рассчитывается первый код, а остальные коды игнорируются.
Примечание 2. Не все виды отправлений имеют все виды услуг и опций.
  • Хрупкая и негабаритная - только для внутренних и международных посылок.
  • Проверка соответствия вложения описи - только для ценных внутренних отправлений: ценные письма, ценные бандероли, ценные письма и бандероли 1 класса, посылки, ЕMS, EMS Оптимальное, Бизнес-Курьер, Бизнес-Курьер Экспресс.
  • Проверка комплектности - ценная посылка, EMS Оптимальное, Посылка и Курьер Онлайн
  • Оплата в момент доставки - ценная посылка, EMS, EMS Оптимальное, ценная бандероль и посылка 1 класса, Посылка и Курьер Онлайн.
Примечание 3. Стоимость SMS для клиентов - физических лиц рассчитывается, как стоимость при единичном приеме (10 рублей с НДС), а для корпоративных клиентов - как при партионном приеме (7 рублей с НДС). Стоимость SMS для отправлений 1 класса, EMS Оптимальное, Бизнес-Курьер уже включена в тариф, т.е. они бесплатны. Для писем и бандеролей код sm - это "СМС-уведомление о вручении", код sm2 - это "СМС-уведомление о прибытии в отделение".
Partible pa 0 Отправление является делимым (можно распределить на несколько).
Если 0 (по умолчанию), используется логика официальных калькуляторов Почты России: отправление может быть только одно, при превышении допустимого веса и/или ценности расчет не производится.
Если 1, используется логика Postcalc.RU: отправление делится на несколько, контроль ценности не производится.
Например, для веса 20 кг при pa=0 расчет бандероли не производится, при pa=1 возвращается расчет для 4-х бандеролей весом по 5 кг каждая.
Аналогично: для ценности 100 тыс. рублей при pa=0 расчет ценной бандероли и EMS не производится (ограничение 10 тыс. и 50 тыс. рублей соответственно), при pa=1 - производится
Внимание! Для внутренних писем ограничение по весу действует в любом случае (так было в расчетах Postcalc.RU с самого начала): простое, заказное, ценное письмо рассчитываются при весе не более 100 г, заказное и ценное письмо 1 класса - не более 500 г.
ProcessingFee pr 0 Пользовательская наценка за обработку заказа в рублях. Добавляется к ключу Доставка (Total) и к ключу ОценкаПолная (Valuation).
PackingFee pk 0 Пользовательская наценка за упаковку одного отправления в рублях. Добавляется к ключу Доставка (Total) и к ключу ОценкаПолная (Valuation) для каждой единицы отправления. Отправлений может быть несколько, если ключ pa=1.
IBase ib p База для расчета страховки (только при оценке товарного вложения больше 0!).
Если ib=p или Partial, то страхуется только товарное вложение. Например, посылка с оценкой 1000 рублей будет застрахована на 1000 * 4% = 40 рублей независимо от стоимости доставки.
В случае пропажи отправления почта возместит только стоимость товара, а расходы на доставку и страховку придется списать в убыток.
Кроме того, при отправке наложенным платежом возникает проблема расчета суммы, которую адресат должен выплатить при получении отправления: ведь эта сумма больше оценки товара и должна покрывать расходы интернет-магазина на доставку и страховку
Если ib=f или Full, базой страховки будет Оценка Товара + Тариф + Страховка, и в случае пропажи отправления почта полностью возместит ущерб. Это самый оптимальный вариант для отправки наложенным платежом, а конечная сумма, которую должен заплатить адресат - это столбец "Ценность" на веб-странице или поле ОценкаПолная в ответе по API.
Ценность вычисляется по формуле: Ценность = Тариф + Оценка вложения + Страховка
Размер страхового сбора вычисляется по формуле: Страховка = ( Тариф + Оценка ) * СтавкаСбора / (1 - СтавкаСбора)
С 01 июня 2020 года - p, до этого - f.
COD cod 0 Ставка комиссии наложенного платежа для корпоративных клиентов Почты России, подписавших договор на специальную комиссию (в процентах). От 0.2 до 2%.
CODMinimal codm 0 Минимальный размер комиссии наложенного платежа для корпоративных клиентов Почты России, подписавших договор на специальную комиссию (в рублях).
Language la ru Новый параметр, только в версии 2.1+.
Язык ответа. Если en, то в ответе применяется английский язык. Входные данные на английском языке (ключи населенных пунктов, названия стран) интерпретируются корректно в любом случае, вне зависимости от этого параметра.
Currency cu rub Новый параметр, только в версии 2.1+.
Валюта ответа. Если отличается от rub, то рубли в ответе пересчитываются в соответствующую валюту по курсу Центробанка России. Входные данные (ценность, переменная v=) в любом случае задаются в рублях, вне зависимости от этого параметра.
Software sw нет Необязательный идентификатор плагина. Произвольная строка латиницей (не более 30 символов), подчеркивание, номер версии (например, MyBestPlugin_1.01).
Позволяет разработчикам плагинов получить доступ к списку доменов, которые используют их плагин, статистике обращений, ошибкам и журналам запросов пользователей в реальном времени. При этом никакая личная информация пользователей (включая ключ домена) разработчикам недоступна.
Для доступа к этой информации разработчикам следует написать в произвольной форме в техподдержку Postcalc.RU.
нет size нет Размер отправления в сантиметрах. Указывается как три целых числа, разделенные знаком “x”, например, 100x50x25. По состоянию на апрель 2025 года, учитывается для всех видов посылок, кроме Бизнес-Курьер Экспресс и EMS Оптимальное: Ценная посылка, Посылка 1 класс, Курьерская доставка EMS, Посылка Онлайн, Курьер Онлайн, ЕКОМ Маркетплейс, Бизнес-Курьер, EMS PT. Не учитывается для писем и бандеролей.
Если указан объем (переменная volume) и это не ноль, размеры отправления (переменная size) игнорируются!
нет volume нет Объем отправления в кубических метрах (метрах!). Если указан объем (переменная volume) и это не ноль, размеры отправления (переменная size) игнорируются! Десятичная дробь, разделитель - точка. Например: 0.100, 0.341, 2.43. Не более 25.0 куб.метров. По состоянию на апрель 2025 года, учитывается для всех видов посылок, кроме Бизнес-Курьер Экспресс и EMS Оптимальное: Ценная посылка, Посылка 1 класс, Курьерская доставка EMS, Посылка Онлайн, Курьер Онлайн, ЕКОМ Маркетплейс, Бизнес-Курьер, EMS PT. Не учитывается для писем и бандеролей.

Отправления: коды, ограничения по весу и ценности

Ответ

Декомпрессия ответа

Ответ сервера 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 не блокируется, однако после распаковки поток усекается на несколько байт.
Это связано с установкой PHP mbstring.func_overload. Поэтому проводите распаковку так:
if (substr($Response, 0, 3) ==  "\x1f\x8b\x08") {
  $funcOverload = ini_get("mbstring.func_overload");
  if (in_array($funcOverload, array(2, 3, 6, 7,))) {
    $Response = gzinflate( substr($Response, 10, -1) );
  } else {
    $Response = gzinflate( substr($Response, 10, -8) );
  }    
}
Если это не поможет, замените полностью вызов 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 = "?f=101000&t=190000&w=1000&c=RU&o=wddx&key=test" + 
    "&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С!

Глобальные ошибки и предупреждения

Ошибки и предупреждения при расчете отправления

Глобальные переменные ответа

Массив "Отправления" ("Shipments")

Реализация

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

Пример использует библиотеку 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 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://$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";

Библиотека Postcalc Light

Postcalc Light - это библиотека, простой веб-клиент на PHP с использованием jQuery и базы данных. Вы можете скачать их и опробовать в работе онлайн по ссылке.

Плагины

Список плагинов находится по ссылке. Также рекомендуется воспользоваться поисковиками.

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.