Обработчики Почты России и СДЭК отдают несколько расчётов одновременно

#
Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
Использую стандартные обработчики расчёта стоимости доставки из шаблона.
Для справки приведу их полностью.
Результат видим на принтскрине.
У тестового товара стоит вес 1 кг и гавариты 10х10х10
Это как такое получается и что делать?



Обработчик Почты России
Цитата:
<?php

/**
* Доставка почтой
*/
class Shop_Delivery_Handler7 extends Shop_Delivery_Handler
{
   // тестовый режим
   private $_testMode = FALSE;

   // весовой коэффициент (расчет ведется в граммах)
   private $_coefficient = 1;

   // ограничение доставки в 100 кг
   private $_maxWeight = 100000;

   // местоположение магазина (отправки), почтовый индекс, Ростов-на-Дону
   private $_from='344000';

   private function getData($aParams)
   {
      $aParams['o'] = 'json';

      if(!$this->_testMode)
      {
         $url = "http://api.postcalc.ru?";
         $aParams['site'] = 'site';
         $aParams['email'] = 'email';
         $aParams['person'] = 'person';
      }
      else
      {
         $url = "http://test.postcalc.ru?";
      }

      $url = $url . http_build_query($aParams);
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, 156, 5000);
      curl_setopt($ch, CURLOPT_ENCODING , "";
      $data = curl_exec($ch);
      curl_close($ch);
      
      $oResponse = json_decode($data);

      if(!is_object($oResponse) || (is_object($oResponse) && $oResponse->Status != 'OK')
      {
         if(is_object($oResponse))
         {
            throw new Exception($oResponse->Status . " ({$oResponse->Message})";
         }
         else
         {
            throw new Exception("Ошибка";
         }
      }
      return $oResponse;
   }

   public function execute()
   {
      $fOrderWeight = $this->_weight * $this->_coefficient;

      if($fOrderWeight == 0 || $fOrderWeight > $this->_maxWeight)
      {
         $errorDescription = ($fOrderWeight == 0 ? "Вес равен нулю" : "Вес превышает максимально допустимые 100 кг.";
         throw new Exception("Неправильный вес ({$fOrderWeight}) [{$errorDescription}]";
      }
   
      if(is_null($this->_postcode) || $this->_postcode==''
      {
         throw new Exception("Индекс места назначения не указан";
      }

      if(!is_null($this->_shopCountry->id) && $this->_shopCountry->id == 175)
      {
         $oResponse = $this->getData(array('From'=>$this->_from,'Country' => 'RU','To'=>$this->_postcode,'Weight'=>$fOrderWeight));

         $aRetObjs = array();
         foreach($oResponse->Отправления as $oDeliveryType)
         {
            if(is_object($oDeliveryType) && property_exists($oDeliveryType, 'Название' && property_exists($oDeliveryType, 'Тариф'  && !property_exists($oDeliveryType, 'НетРасчета')
            {
               $oCurrentDeliveryType = new StdClass();
               $oCurrentDeliveryType->price = floatval($oDeliveryType->Тариф);
               $oCurrentDeliveryType->description = strval($oDeliveryType->Название);
               $aRetObjs[] = $oCurrentDeliveryType;
            }
         }
         
         return $aRetObjs;
      }
      else
      {
         $oResponse = $this->getData(array('From'=>$this->_from,'Country'=>$this->_shopCountry->alpha2,'Weight'=>$fOrderWeight));
         
         $aRetObjs = array();
      
         foreach($oResponse as $oDeliveryType)
         {
            if(is_object($oDeliveryType) && property_exists($oDeliveryType, 'Название' && property_exists($oDeliveryType, 'Тариф'  && !property_exists($oDeliveryType, 'НетРасчета')
            {
               $oCurrentDeliveryType = new StdClass();
               $oCurrentDeliveryType->price = floatval($oDeliveryType->Тариф);
               $oCurrentDeliveryType->description = strval($oDeliveryType->Название);
               $aRetObjs[] = $oCurrentDeliveryType;
            }
         }
         
         return $aRetObjs;
      }
   }
}


Обработчик СДЭК
Цитата:
<?php
class Shop_Delivery_Handler6 extends Shop_Delivery_Handler
{
   // местоположение магазина (отправки), почтовый индекс, Ростов-на-Дону
   private $_from='344000';
   // весовой коэффициент (расчет ведется в килограммах)
   private $_coefficient = 0.001;
   // список тарифов
   private $_tariffList = array(
      1=>'Экспресс лайт дверь-дверь',
      3=>'Супер-экспресс до 18',
      4=>'Рассылка',
      5=>'Экономичный экспресс склад-склад',
      7=>'Международный экспресс документы',
      8=>'Международный экспресс грузы',
      10=>'Экспресс лайт склад-склад',
      11=>'Экспресс лайт склад-дверь',
      12=>'Экспресс лайт дверь-склад',
      15=>'Экспресс тяжеловесы склад-склад',
      16=>'Экспресс тяжеловесы склад-дверь',
      17=>'Экспресс тяжеловесы дверь-склад',
      18=>'Экспресс тяжеловесы дверь-дверь',
      57=>'Супер-экспресс до 9',
      58=>'Супер-экспресс до 10',
      59=>'Супер-экспресс до 12',
      60=>'Супер-экспресс до 14',
      61=>'Супер-экспресс до 16',
      62=>'Магистральный экспресс склад-склад',
      63=>'Магистральный супер-экспресс склад-склад',
      66=>'Блиц-экспресс 01',
      67=>'Блиц-экспресс 02',
      68=>'Блиц-экспресс 03',
      69=>'Блиц-экспресс 04',
      70=>'Блиц-экспресс 05',
      71=>'Блиц-экспресс 06',
      72=>'Блиц-экспресс 07',
      73=>'Блиц-экспресс 08',
      74=>'Блиц-экспресс 09',
      75=>'Блиц-экспресс 10',
      76=>'Блиц-экспресс 11',
      77=>'Блиц-экспресс 12',
      78=>'Блиц-экспресс 13',
      79=>'Блиц-экспресс 14',
      80=>'Блиц-экспресс 15',
      81=>'Блиц-экспресс 16',
      82=>'Блиц-экспресс 17',
      83=>'Блиц-экспресс 18',
      84=>'Блиц-экспресс 19',
      85=>'Блиц-экспресс 20',
      86=>'Блиц-экспресс 21',
      87=>'Блиц-экспресс 22',
      88=>'Блиц-экспресс 23',
      89=>'Блиц-экспресс 24'
   );
   
   private function _getData($aParams)
   {
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, 'http://api.edostavka.ru/calculator/calculate_price_by_json.php';
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json');
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($aParams));
      curl_setopt($ch, 156, 5000);
      $oResponse = curl_exec($ch);
      curl_close($ch);
      return json_decode($oResponse);
   }
   
   public function execute()
   {
      $fOrderWeight = $this->_weight * $this->_coefficient;

      if($fOrderWeight == 0)
      {
         throw new Exception("Неправильный вес (Вес равен нулю)";
      }
      
      if($this->_postcode == ''
      {
         throw new Exception("Индекс места назначения не указан";
      }
      
      $aRetObjs = array();
      
      if(!is_null($this->_shopCountry->id) && $this->_shopCountry->id == 175)
      {
         foreach($this->_tariffList as $tariffId => $tariffDescription)
         {
            $oResponse = $this->_getData(array('version'=>'1.0','tariffId'=>$tariffId,'senderCityPostCode'=>$this->_from,'receiverCityPostCode'=>$this->_postcode,'goods'=>array(0=>array('weight'=>$fOrderWeight,'volume'=>(($this->_volume) ? $this->_volume * pow(10, -9) : 1)))));

            if(is_object($oResponse) && property_exists($oResponse, 'result')
            {
               $oCurrentDeliveryType = new StdClass();
               $oCurrentDeliveryType->price = floatval($oResponse->result->price);
               $oCurrentDeliveryType->description = $tariffDescription . " Минимальный срок доставки: {$oResponse->result->deliveryPeriodMin}, максимальный: {$oResponse->result->deliveryPeriodMax} дней";
               $aRetObjs[] = $oCurrentDeliveryType;
            }
         }
      }
      
      return $aRetObjs;
   }
}
https://www.beregusha.com https://www.coffemol.ru
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
Со СДЭКом разобрался!
https://www.beregusha.com https://www.coffemol.ru
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
Как получается уже понятно. Отображаются расчёты по всем способам отправки, которые рассчитывает сервис postcalc.ru
Кто знает как хотя бы описание отправления добавить? А то только "Доставка Почтой России" выводится.
https://www.beregusha.com https://www.coffemol.ru
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
Barbaros,
здравствуйте! А не поделитесь решением? та же проблема... Еще, есть ли возможность осуществлять расчет без указания индекса, просто выбрав область и город не в курсе?
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
tory писал(а):
Barbaros,
здравствуйте! А не поделитесь решением? та же проблема... Еще, есть ли возможность осуществлять расчет без указания индекса, просто выбрав область и город не в курсе?

Почтовое отправление по почтовому индексу + вес заказа считает.
ЕМС почты, кажется, только по городу.
Решение - стандартное в самой CMS уже есть.
https://www.beregusha.com https://www.coffemol.ru
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
Barbaros,
я про почту,  получилось решить проблему с выводом нескольких доставок?
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
tory писал(а):
Barbaros,
я про почту,  получилось решить проблему с выводом нескольких доставок?

Не получилось. Знаний маловато. Занес вручную усредненные цены в зависимости от веса. Но по регионам еще надо довнести, так как получается 1 кг товара стоит 300 рублей и до Ярославля и до Владивостока...
А Экспресс почта и СДЭК нормально считает обработчиком!
https://www.beregusha.com https://www.coffemol.ru
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
оставляем два варианта доставки почтой (ценная бандероль и ems экспресс доставка)

<?php

/**
* Доставка почтой
*/
class Shop_Delivery_Handler12 extends Shop_Delivery_Handler
{
   // тестовый режим
   private $_testMode = FALSE;

   // весовой коэффициент (расчет ведется в граммах)
   private $_coefficient = 1;

   // ограничение доставки в 100 кг
   private $_maxWeight = 100000;

   // местоположение магазина (отправки), почтовый индекс, Москва
   private $_from = 'Ваш индекс';

   private function getData($aParams)
   {
      $aParams['o'] = 'json';

      if(!$this->_testMode)
      {
         $url = "http://api.postcalc.ru?";
         $aParams['site'] = 'site';
         $aParams['email'] = 'email';
         $aParams['person'] = 'person';
      }
      else
      {
         $url = "http://test.postcalc.ru?";
      }

      $url = $url . http_build_query($aParams);

      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, 156, 5000);
      curl_setopt($ch, CURLOPT_ENCODING , "";
      $data = curl_exec($ch);
      curl_close($ch);

      $oResponse = json_decode($data);

      if(!is_object($oResponse) || (is_object($oResponse) && $oResponse->Status != 'OK')
      {
         if(is_object($oResponse))
         {
            throw new Exception($oResponse->Status . " ({$oResponse->Message})";
         }
         else
         {
            throw new Exception("Ошибка";
         }
      }
      return $oResponse;
   }

   public function execute()
   {
      $fOrderWeight = $this->_weight * $this->_coefficient;

      if($fOrderWeight == 0 || $fOrderWeight > $this->_maxWeight)
      {
         $errorDescription = ($fOrderWeight == 0 ? "Вес равен нулю" : "Вес превышает максимально допустимые 100 кг.";
         throw new Exception("Неправильный вес ({$fOrderWeight}) [{$errorDescription}]";
      }

      if(is_null($this->_postcode) || $this->_postcode==''
      {
         throw new Exception("Индекс места назначения не указан";
      }

      if(!is_null($this->_shopCountry->id) && $this->_shopCountry->id == 175)
      {
         $oResponse = $this->getData(array('From'=>$this->_from,'Country' => 'RU','To'=>$this->_postcode,'Weight'=>$fOrderWeight));

         /*
         echo "<pre>";
         var_dump($oResponse); // варианты доставок
         echo "</pre>";
         */
         
         $aRetObjs = array();
         foreach($oResponse->Отправления as $oDeliveryType)
         {
            $name_delivery = $oDeliveryType->Название; // выдергиваем название доставки из массива
            $num_delivery = array("Ценная посылка", "Курьерская доставка EMS"; // массив нужных нам вариантов доставок
            if (in_array($name_delivery, $num_delivery)) { // сравниваем названия из массива с нужными для нас
             // если совпали названия, то показываем вариант доставки
            } else {
               continue; // если не совпали перебираем массив дальше и ищем совпадения
            }
            
            if(is_object($oDeliveryType) && property_exists($oDeliveryType, 'Название' && property_exists($oDeliveryType, 'Тариф'  && !property_exists($oDeliveryType, 'НетРасчета')
            {
               $oCurrentDeliveryType = new StdClass();
               $oCurrentDeliveryType->price = floatval($oDeliveryType->Тариф);
               $oCurrentDeliveryType->description = strval($oDeliveryType->Название);
               $aRetObjs[] = $oCurrentDeliveryType;
            }
         }

         return $aRetObjs;
      }
      else
      {
         $oResponse = $this->getData(array('From'=>$this->_from,'Country'=>$this->_shopCountry->alpha2,'Weight'=>$fOrderWeight));

         $aRetObjs = array();

         foreach($oResponse as $oDeliveryType)
         {
            if(is_object($oDeliveryType) && property_exists($oDeliveryType, 'Название' && property_exists($oDeliveryType, 'Тариф'  && !property_exists($oDeliveryType, 'НетРасчета')
            {
               $oCurrentDeliveryType = new StdClass();
               $oCurrentDeliveryType->price = floatval($oDeliveryType->Тариф);
               $oCurrentDeliveryType->description = strval($oDeliveryType->Название);
               $aRetObjs[] = $oCurrentDeliveryType;
            }
         }

         return $aRetObjs;
      }
   }
}

#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
qaswed,
спасибо большое! все работает!
а как бы добавить к стоимости доставки стоимость страховки? в последнее время она почти ровна стоимости доставки...
#
Re: Обработчики Почты России и СДЭК отдают несколько расчётов одновременно
никто не знает как добавить к стоимости доставки,  3,5% от суммы заказа? это и есть страховка...
Авторизация