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