Блог Николая Семенцова

Партнер компании 1с-битрикс

Почта России, доставка - обезопасимся

Почта России, доставка - обезопасимся

С недавнего времени в моих интернет-магазинах где идет подсчет стоимости доставки с помощью сервера почты России и их калькулятора, пошло снижение количества заказов, связанное с тем что сервер просто на просто лежит, люди не могут оформить заказ этой службой. Эту ситуацию надо было исправлять, я решил обезопасится, стал запрашивал данные для доставки на другом сервисе с бесплатным 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

Вот и все, теперь  если сервер почты россии под каким либо предологом не хочет давать нам данные мы попробуем взять их с другого места, обезопасились.


Решение в MarketPlace: http://marketplace.1c-bitrix.ru/solutions/sotbit.postcalc/?sphrase_id=3692344


Опубликовано: 5 сентября 2012




Помогла заметка? Жмите кнопки ниже


ВКонтакт Facebook Google Plus Одноклассники Twitter Яндекс Livejournal Liveinternet Mail.Ru





comments powered by Disqus