—крыть меню * ¬ерси€ дл€ печати

API - устарела€ верси€ 0.9


ƒо 01 июл€ 2014 года сервер поддерживает обе версии, затем она будет доступна некоторое врем€ по api09.postcalc.ru, затем ее поддержка будет окончательно прекращена.
¬нимание!
URL бесплатного сервиса изменилс€ на api.postcalc.ru!
— 15 августа 2013 года нынешний URL www.postcalc.ru/get.php перестанет функционировать!
—рочно замените URL в ваших скриптах!
ќстальное API остаетс€ без изменений!

¬нимание!
ƒл€ тестов ваших скриптов создан отдельный сервис test.postcalc.ru!
≈сли вам нужно просто протестировать скрипт, используйте "http://test.postcalc.ru?<ѕеременные>".
¬ этом случае примен€ть переменные Site, Email, Person об€зательно только в том случае, если вы планируете обращатьс€ ко мне за технической поддержкой.

¬нимание!
— 1 августа 2013 года дл€ обращени€ к api.postcalc.ru ввод€тс€ следующие об€зательные пол€ запроса:

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

например:

Site=shop.mysite.ru&Email=programmer@test.ru&Person=Ivan_Petrov
st=shop.mysite.ru&ml=programmer@test.ru&pn=Ivan_Petrov

Ѕез этих переменных любой скрипт, обращающийс€ к api.postcalc.ru, может быть заблокирован в любой момент!

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

Software или sw - произвольна€ строка латиницей, котора€ идентифицирует ваш плагин (например, my_best_plugin);
Version или ver - номер версии, разделитель - точка (например, 1.2 или 1.2.3.4).

¬ ближайшее врем€ € планирую создать "кабинет разработчика" - если вы зарегистрируетесь в нем, то получите доступ к логам сервера Postcalc.RU и статистику обращений дл€ вашей разработки.
¬нимание!
Ќа сайте, который использует обращение к API Postcalc.RU, должна быть размещена ссылка на проект в произвольной форме, например:

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

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

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

1. «апрос

»меет 2 формы - краткую и полную. ¬ы можете щелкнуть по ссылкам и посмотреть ответ сервера в читабельном виде.

ѕример полной формы запроса:
http://api.postcalc.ru/?From=101000&Country=RU&To=190000&Weight=1000&Valuation=1000&Step=0&Date=10.02.2011

“от же запрос в краткой форме:
http://api.postcalc.ru/?f=101000&c=RU&t=190000&w=1000&v=1000&s=0&d=10.02.2011

«апрос в краткой форме с опущенными параметрами по умолчанию (вес - 1000 г, оценка - 0 рублей, расчет на насто€щий момент):
http://api.postcalc.ru/?f=101000&t=190000

Ёто то же самое, что и следующий запрос (отделение 101000 €вл€етс€ ќѕ— по умолчанию дл€ ћосквы, а 190000 - дл€ —анкт-ѕетербурга):
http://api.postcalc.ru/?f=ћосква&t=—анкт-ѕетербург

”важаемыe коллеги! ќбратите внимание, что в строке запроса можно использовать кириллицу, однако пробелы в запросе недопустимы - дл€ сервера такой запрос €вл€етс€ ошибочным и вы получите ответ 400 Bad Request .
»спользуйте функции rawurlencode или (PHP 5+) http_build_query.

Ќеправильный запрос:
$Request='http://test.postcalc.ru/?f=ћосква&t=Ћенинградска€ область&w=1000&v=1000&o=php';

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

ѕравильный запрос 2 (предпочтительный вариант в PHP 5+):
$Request=http_build_query(array(
"f"=>"ћосква",
"t"=>"Ћенинградска€ область",
"w"=>"1000",
"v"=>"1000",
"o"=>"php"
));
$Request="http://test.postcalc.ru/?$Request";


ќписание полей запроса
ѕолна€ форма  ратка€ форма ѕо умолчанию ќписание
Site st нет
ƒомен сайта, на котором работает ваш скрипт.
ќб€зательное поле дл€ api.postcalc.ru и коммерческих версий API.
Email ml нет
 онтактна€ электронна€ почта лица, ответственного за работу скрипта (программист или системный администратор).
ќб€зательное поле дл€ api.postcalc.ru и коммерческих версий API.
Person pn нет
»м€_‘амили€ латиницей лица, ответственного за работу скрипта (программист или системный администратор).
ќб€зательное поле дл€ api.postcalc.ru и коммерческих версий API.
From f ћосква
=или=
101000

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

1. Ќазвание пункта отправлени€, как это определено в списке местоположений EMS. Ёто может быть город ('ћосква', 'ќрел', '¬ладивосток' и т.п.) или регион ('ћосковска€ область', '—еверна€ ќсети€-јлани€ республика' и т.п.) .  одировка - cp1251 или utf8, разпознаетс€ автоматически, регистр букв значени€ не имеет, однако должны присутствовать все пробелы и дефисы. »ндекс предпри€ти€ св€зи беретс€ по умолчанию - это первое по номеру отделение св€зи, принимающее почту дл€ населени€. 

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

To t —анкт-ѕетербург
=или=
190000

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

1. Ќазвание пункта назначени€, как это определено в списке местоположений EMS. Ёто может быть город ('ћосква', 'ќрел', '¬ладивосток' и т.п.) или регион ('ћосковска€ область', '—еверна€ ќсети€-јлани€ республика' и т.п.) .  одировка - cp1251 или utf8, разпознаетс€ автоматически, регистр букв значени€ не имеет, однако должны присутствовать все пробелы и дефисы. »ндекс предпри€ти€ св€зи беретс€ по умолчанию - это первое по номеру отделение св€зи, принимающее почту дл€ населени€. 

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

Weight w 1000 ¬ес отправлени€ в граммах. Ќе более 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, xml, html, arr. –егистр букв значени€ не имеет.
1. HTML. —траница html в читабельном виде, кодировка windows-1251, удобно дл€ просмотра ответа сервера пр€мо из браузера.
2. PHP. ћассив PHP, обработанный функцией serialize(). ”добно дл€ использовани€ напр€мую в скриптах PHP, дл€ чего на стороне клиента следует использовать функцию unserialize() - см. пример в конце страницы.  одировка windows-1251.
3. ARR. ћассив PHP, выведенный функцией print_r().  одировка windows-1251, удобно дл€ контрол€ ответов сервера из браузера.
4. XML или WDDX - массив PHP, обработанный функцией wddx_serialize_value().  одировка UTF-8.
5. JSON - массив PHP, обработанный функцией json_encode().  одировка UTF-8 + JavaScript Object Notation (JSON). ”добно дл€ использовани€ в JavaScript.

Extended e 0 ƒетализаци€ ответа. ѕри e=0 выдаютс€ основные данные (тариф, страховка, оценка, наложенный платеж, сроки доставки, адреса и телефоны отделений св€зи), при других значени€х могут выдаватьс€ некоторые недокументированные сведени€. ѕри разработке собственных модулей, обращающихс€ к API PostCalc.RU, насто€тельно рекомендуетс€ ограничиватьс€ только основными данными, так как расширенные данные могут мен€тьс€ без уведомлени€.
IBase ib f Ѕаза дл€ расчета страховки (только при оценке товарного вложени€ больше 0!).

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

≈сли IBase=f или Full, базой страховки будет ќценка “овара + “ариф + —траховка, и в случае пропажи отправлени€ почта полностью возместит ущерб. Ёто самый оптимальный вариант дл€ отправки наложенным платежом, а конечна€ сумма, которую должен заплатить адресат - это столбец "ќценка" на веб-странице или поле ќценкаѕолна€ в ответе по API.
ProcessingFee pr 0 ѕользовательска€ наценка за обработку заказа в рубл€х. —юда можно также включить уведомление о вручении.
PackingFee pk 0 ѕользовательска€ наценка за упаковку одного отправлени€ в рубл€х.
Round r 0.01 ќкругление итоговых чисел в верхнюю сторону до [Round] рублей. –екомендуетс€ задать Round=1 или 10, чтобы не путатьс€ с копейками.
VAT vt 1 ≈сли 1, Ќƒ— включен, если 0 - Ќƒ— вычитаетс€.
Ќƒ— вычитаетс€ только в том случае, если дл€ данного вида отправлений на сайте russianpost.ru имеютс€ опубликованные тарифы без Ќƒ—. ÷енные отправлени€ (посылки, ценные бандероли, авиабандероли) и EMS всегда рассчитываютс€ с Ќƒ—.
Charset cs Windows-1251  одировка дл€ выходных форматов php, arr, html. —оответствует списку, который выводит функци€ php mb_list_encodings(). ¬ частности, дл€ русского €зыка доступны UTF-8, Windows-1251, KOI8-R, CP866, ISO-8859-5.
¬нимание! Ќе рекомендуетс€ использовать иные кодировки, кроме 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 «начение
÷енна€Ѕандероль
 
Ќазвание Ќазвание почтового отправлени€
 оличество „исло почтовых отправлений с учетом максимального разрешенного веса.
“ариф ѕочтовый тариф в рубл€х (без учета страховки).
—траховка “олько дл€ ценных отправлений с оценкой больше 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:

¬нимание! ¬ версии 2014 г. (1.0) кодировка по умолчанию UTF-8 и будет включено принудительное сжатие по gzip!

ј. ѕолный пример дл€ "старой" версии 0.9.
<?php
// «аголовок с указанием набора символов.
// ƒл€ форматов php, arr, html кодировка определ€етс€ переменной cs и по умолчанию это Windows-1251.
// ƒл€ форматов json, wddx кодировка всегда UTF-8
header('Content-Type: text/html; charset=windows-1251');

// ‘ормируем запрос со всеми необходимыми переменными
$Request=http_build_query(array(
'st'='shop.mysite.ru','ml'='programmer@test.ru',pn='Ivan_Petrov',
'f'=>'ћосква','t'=>'Ћенинградска€ область',
'w'=>'1000','v'=>'1000',
'o'=>'php'
));
$Request="http://api.postcalc.ru/?$Request";

$Response=file_get_contents($Request) or die('Could not connect!');

$arrResponse=unserialize($Response);

// ќбработка ошибки
if ( $arrResponse['Status'] != 'OK'; ) die("—ервер вернул ошибку: $arrResponse[Status]!");

// ¬ыводим значение тарифа дл€ бандероли
echo $arrResponse['ѕроста€Ѕандероль']['“ариф'];
?>
B. ѕолный пример дл€ "новой" версии 1.0, включа€ кэширование.
–абочие файлы можно скачать здесь.
<?php
// «аголовок с указанием набора символов.
// ƒл€ форматов php, arr, html кодировка определ€етс€ переменной cs и по умолчанию в версии 1.0 это UTF-8.
// ƒл€ форматов json, wddx кодировка всегда UTF-8
header('Content-Type: text/html; charset=UTF-8');
//  расивости - таблица стилей
echo '
<style>
BODY {font-family: sans-serif;}
TABLE {font-family: sans-serif;background-color:#EEE}
TR:nth-child(2n+1){background-color:#DDF}
TD {padding:0.2em}
.error {background-color:#FDD; color:red}
</style>
';
// === »сходные данные
$From='101000';
$To='190000';
$Weight=1000;
$Valuation=500;
$Country='RU';
// ==========

// ќбращаемс€ к функции getPostcalc
$arr=getPostcalc($From,$To,$Weight,$Valuation,$Country);

// ≈сли вернулась строка - это сообщение об ошибке.
if ( !is_array($arr) ) {
echo "<span class='error'>ѕроизошла ошибка:</span><br> $arr";
} else {
// ¬ернулс€ массив, Status=='OK'. ¬ыводим таблицу отправлений
echo "<table>\n<tr><th>Ќазвание</th><th>ƒоставка</th><th>—роки</th></tr>\n";
// ¬ыводим список тарифов
foreach ( $arr['ќтправлени€'] as $parcel )
echo "<tr><td>$parcel[Ќазвание] </td><td>$parcel[ƒоставка] руб.</td><td>$parcel[—рокƒоставки]</td></tr>\n";
echo "</table>\n";
}

// ===== ќсновна€ функци€ опроса сервера Postcalc.RU =====
function getPostcalc($From,$To,$Weight,$Valuation=0,$Country='RU'){
// ќб€зательно! ѕровер€ем данные - больше всего ошибочных запросов из-за неверных значений веса и оценки,
// из-за пропущенного пол€ " уда".
if ( !($Weight>0 && $Weight<=100000) ) return "Bec - от 1 г до 100000 г!";
if ( !($Valuation>=0 && $Valuation<=100000) ) return "ќценка - от 0 руб. до 100000 руб.!";
if ( !preg_match('/[1-9][0-9]{5}/',$From) ) return "ѕоле 'ќткуда' - может быть только 6-значным индексом!";
if ( !preg_match('/[1-9][0-9]{5}/',$To) ) return "ѕоле ' уда' - может быть только 6-значным индексом!";
if ( !preg_match('/\w{2}/',$Country) ) return "ѕоле '—трана' - 2 буквы латиницей!";

// ‘ормируем запрос со всеми необходимыми переменными. Ќе забудьте помен€ть переменные st, ml, pn!
$QueryString = "st=shop.mysite.ru&ml=programmer@test.ru&pn=Ivan_Petrov";
$QueryString.= "&f=$From&t=$To&w=$Weight&v=$Valuation&c=$Country";
$QueryString.= "&o=php&cs=UTF-8";

//  эширование.  аталог - любой, в который веб-сервер имеет право записи.
$CacheDir=sys_get_temp_dir();
// Ќазвание файла - префикс postcalc_ плюс хэш строки запроса
$CacheFile="$CacheDir/postcalc_".md5($QueryString).'.txt';
// —борка мусора. ”дал€ем все файлы, которые подход€т под маску, старше 600 секунд
$arrCacheFiles=glob("$CacheDir/postcalc_*.txt");
$Now=time();
foreach ($arrCacheFiles as $fileObj) {
if ( $Now-filemtime($fileObj) > 600 ) unlink($fileObj);
}
// ≈сли существует файл кэша дл€ данной строки запроса, просто зачитываем его
if ( file_exists($CacheFile) ) {
echo "«апрос из кэша!<br>\n";
return  unserialize(file_get_contents($CacheFile));
} else {
// ‘ормируем URL запроса.
$Request="http://api.postcalc.ru/?$QueryString";

// ‘ормируем опции запроса. Ёто _необ€зательно_, однако упрощает контроль и отладку
$arrOptions = array('http' =>
array( 'header'  => 'Accept-Encoding: gzip','timeout' => 5, 'user_agent' => phpversion() )
);

// «апрос к серверу. —охран€ем ответ в переменной $Response
if ( !$Response=file_get_contents($Request, false , stream_context_create($arrOptions)) )
return 'Ќе удалось соединитьс€ с сервером postcalc.ru!';

// ≈сли поток сжат, разархивируем его
if ( substr($Response,0,3) == "\x1f\x8b\x08" ) $Response=gzinflate(substr($Response,10,-8));

// ѕереводим ответ сервера в массив PHP
if (!$arrResponse=unserialize($Response)) return "ѕолучены странные данные. ќтвет сервера:\n$Response";

// ќбработка возможной ошибки
if ( $arrResponse['Status'] != 'OK' ) return "—ервер вернул ошибку: $arrResponse[Status]!";

// ”спешный ответ пишем в кэш
file_put_contents($CacheFile,$Response);

return $arrResponse;
}

}

 






(c) PostCalc.RU 2010-17



яндекс.ћетрика

Time elapsed: 0.00206