С недавнего времени в моих интернет-магазинах где идет подсчет стоимости доставки с помощью сервера почты России и их калькулятора, пошло снижение количества заказов, связанное с тем что сервер просто на просто лежит, люди не могут оформить заказ этой службой. Эту ситуацию надо было исправлять, я решил обезопасится, стал запрашивал данные для доставки на другом сервисе с бесплатным API называется он www.postcalc.ru.
Начнем , для начала вам надо скопировать обработчик почты россии delivery_russianpost.php из папки /bitrix/modules/sale/ru/delivery/ в папку /bitrix/php_interface/include/sale_delivery/ если папок нет то создайте их, это нужно для того что бы при обновлении наши правки не исчезли.
Далее находим в файле где то на 360 строчке код
else return array( "RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_RESPONSE'), );
условие это от if на 319 строчке
if (strstr($data, DELIVERY_RUSSIANPOST_VALUE_CHECK_STRING)) {
Оно необходимо для того что бы написать пользователю о том что ответ от сервера не получен.
Давайте сейчас замес-то этого напишем обработчик который будет все таки пытаться взять еще где либо данный о доставке а будем брать мы их не сайте www.postcalc.ru.
//если почта России отсутствует то возьмем данные с другого места $CategorName = GetMessage('SALE_DH_RUSSIANPOST_CONFIG_CATEGORY_'.$arConfig['category']['VALUE']); $CategorName = str_replace(" ", "", $CategorName); $CategorName = strtolower($CategorName); if(!empty($arOrder['LOCATION_ZIP'])) { $ZipTo = $arOrder['LOCATION_ZIP'] ; } else { $ZipTo = $arLocationTo['ZIP'][0]; } $Response = QueryGetData( 'www.postcalc.ru', 80, '/get.php?', 'f='.$zip.'&t='.$ZipTo.'&w='.$arOrder['WEIGHT'].'&v='.$arOrder['PRICE'].'&o=php', $error_number = 0, $error_text = '', 'GET' ); $arrResponse = unserialize($Response); // если кодировка сайта UTF-8 if(LANG_CHARSET == 'UTF-8') { encoding($arrResponse,"WINDOWS-1251","UTF-8"); $arrResponse = encodingKey($arrResponse,"WINDOWS-1251","UTF-8"); } $pricePost = $arrResponse[$CategorName]['доставка']; if(!empty($pricePost)) { return array( "RESULT" => "OK", "VALUE" => $pricePost, ); } else { return array( "RESULT" => "ERROR", "TEXT" => GetMessage('SALE_DH_RUSSIANPOST_ERROR_RESPONSE'), ); }
Если вы обратили внимание тут есть две функции encoding() и encodingKey() они срабатывают в том случае если наш сайт в кодировке utf-8 , дело в том что ответ от сервиса на русском языке, в итого получаем не читаемые строки без этой обработки. Добавим эти функции в начале файла до class CDeliveryRUSSIANPOST
function encoding(&$data,$in,$to) { if (is_array($data)) { foreach($data as $key => $value) { if ( is_array($data[$key]) ) { encoding($data[$key],$in,$to); } else { $data[$key] = iconv($in,$to,$value); } } } else { $data = iconv($in,$to,$value); } } function encodingKey($data,$in,$to) { foreach($data as $k=>$v) { unset($data[$k]); $k = iconv($in,$to,$k); $k = strtolower($k); $data[$k] = $v; foreach($data[$k] as $k2=>$v2) { unset($data[$k][$k2]); $k2 = iconv($in,$to,$k2); $k2 = strtolower($k2); $data[$k][$k2] = $v2; } } return $data; } class CDeliveryRUSSIANPOST
Вот и все, теперь если сервер почты россии под каким либо предологом не хочет давать нам данные мы попробуем взять их с другого места, обезопасились.
Опубликовано: 5 сентября 2012
|
|