Особенности национальной доставки

Для интернет-аукциона stavkazolota.ru в начале прошлого года нам потребовалось сделать сначала расчет стоимости доставки. Две почтовые службы: СПСР, EMS, ну и чтоб считал в любой хутор страны. Начал смотреть сервисы и возможные API. Самый адекватный: edost.ru, интегрируется во все CMS, куча курьерских служб и транспортных компаний доступно. Начинаю смотреть куда они посчитать доставку - нереально найти информацию на сайте. Через гугл кое как находится ссылка (http://www.edost.ru/kln/bitrix_city.zip) на архив городов для Битрикса. А там всего 1100 городов по России. Ну это совсем несерьезно. Только крупные населенные пункты. Как люди используют - непонятно.

Не очень-то и надеялся найти готовое. Самый полный справочник населенных пунктов конечно у Почты России. Но как его найти в онлайне - неясно. Нужно же не просто загрузить, а еще и обновлять его. Было найдено решение от SPSR: http://www.spsr.ru/ru/service/calculator?q=/spsr/cc_autocomplete/%D0%92%D0%BE%D0%BB Ну как решение. Расковырял их калькулятор на сайте и воспользовался ajax поиском города. Пришлось пару дней попарсить их список, чтобы не забанили, но в результате имеем базу из 34000 населенных пунктов!

Города есть. Теперь нужно считать доставку. У EMS для этого есть API: http://emspost.ru/api/rest?method=ems.calculate&from=Москва&to=Волгоград&weight=0.5

Названия городов нежно передавать в win1251, деятели блин. Рашн спискинг. У SPSR тоже свой API: http://www.cpcr.ru/cgi-bin/postxml.pl?TariffCompute&FromRegion=40|0&FromCityName=Мос... Ну также, названия городов им нужны в win1251, это болезнь российских разработчиков - игнорирование дивного utf8 говорящего мира вокруг. IDшники регионов можно брать из спарсенного ранее справочника или отсюда: http://www.cpcr.ru/cgi-bin/postxml.pl?Regions

Считать умеем. Теперь кэшируем все это дело на месяц, чтобы чужие API лишний раз не трогать, ставим на ежемесячное автооновление справочник, и цены доставки в каждый города. В результате в корзине заказов при оформлении доставки мы можем сразу сказать человеку сколько будет стоить доставка, а не писать всякую ерунду, что "наш менеджер свяжется с вами для уточнения стоимости". А также появилась возможность сделать свою страницу расчета стоимости доставки: http://stavkazolota.ru/delivery

Теперь интереснее. Нужно следить за посылкой и при ее доставке менять статус заказа на "доставлен", а также "оплачен" при принятии денег наложенным платежом. Опять же, из самого адекватного найденного gdeposylka.ru не получилось ничего сделать. Ну не понимает он треки SPSR.

Самостоятельный трекинг оказался сложнее. Не торопятся сервисы делать публичные API. Например, SPSR просит ключ для доступа к API, а дают его после регистрации (или даже заключения договора) http://www.cpcr.ru/cgi-bin/post10.pl?ExtMonitoring&ContrNum=1111&Passw=password&... То есть он выдает треки отправленных по договору посылок. Нам подходит.

Далее - EMS. Тут  пришлось серчить. Но мир не без добрых людей и кто-то с Хабра уже решал эту задачу на Ruby, а тут и на ZF есть решение: https://github.com/kkamkou/ZF-Russian-Post-SDK/ Кстати, неплохо работает, все треки показывает быстро и подробно. Вот пример отображения в кабинете пользователя:

del.png

Что в итоге: много кода, но зато точный расчет и автоматическая смена статусов заказа в зависимости от доставки. В сфере доставки для интернет-магазинов бардак. Это мы еще не заморачивались с транспортными компаниями, с опциями расчета стоимости. К сожалению нет сервисов с API, покрывающих все населенные пункты России и все крупные службы доставки. Но уже лучше, чем лет 5 назад, когда вообще приходилось парсить XLS файлы с тарифами.



Самое интересное