Перейти к содержимому


Правила форума

Внимание!!! Если не можете скачать, пожалуйста ознакомьтесь с условиями получения доступа с файлам форума. Правила форума


Штатные ошибки ShopCMS, из коробки :).


Сообщений в теме: 42

#41 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 26 марта 2018 - 20:50

"Перестала работать оплата через Яндекс.Кассу!"

В ShopCMS в переменной $_POST['lang'] теоретически можно передавать номер (числовой!) элемента массива с описанием языковых файлоы.
Никто это никогда не использовал (я не сталкивался), но код есть.

Код в index.php выглядит так:

  //select a new language?
  if (isset($_POST["lang"])) $_SESSION["current_language"] = $_POST["lang"];

  //current language session variable
  if (!isset($_SESSION["current_language"]) || $_SESSION["current_language"] < 0 || $_SESSION["current_language"] >
	  count($lang_list)) $_SESSION["current_language"] = 0; //set default language
  //include a language file
  if (isset($lang_list[$_SESSION["current_language"]]) && file_exists("core/languages/".$lang_list[$_SESSION["current_language"]]->
	  filename))
  {
	  //include current language file
	  include ("core/languages/".$lang_list[$_SESSION["current_language"]]->filename);
  }
  else
  {
	  die("<font color=red><b>ERROR: Couldn't find language file!</b></font>");
  }  


Все эти проверки нафиг не нужны, т.к. языковой файл один единственный - русский (иногда украинский) и всегда выбирается и грузится именно он.

Но в POST-массиве яндекс-кассы, передаваемом на сервер сайта при оплате заказа появился (23-го марта?) элемент POST-массива $_POST['lang'] с содержимым 'ru'. И код загрузки языкового файла срабатывает так, что вместо подгрузки файла core/languages/russian.php и дальнейшего нормального выполнения скрипт завершается с сообщением "ERROR: Couldn't find language file!". Оплата, естественно, не проходит, т.к. завершение должно быть с кодом 0.

Для возврата к нормальной работе достаточно в index.php закомментировать строку

if (isset($_POST["lang"])) $_SESSION["current_language"] = $_POST["lang"];


http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#42 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 12 апреля 2018 - 14:20

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

Если цена товара содержит "копейки" (дробную часть, к примеру, 11.11руб), то, скорее всего, в сумме заказа тоже будет число с дробной частью. А если по какой-то причине заказ попадает под скидку, то дробная часть может увеличиться до четырех знаков. Например, 11.11 при трех процентах скидки превратится в 10.7767.

Пересчет стоимости заказа в зависимости от скидки происходит в функции oaGetOrderAmountExShippingRate и выглядит так:
$clearPrice = oaGetClearPrice( $cartContent );
$d = oaGetDiscountPercent( $cartContent, $log );
$res = $clearPrice - ($clearPrice/100)*$d;

Т.е никакого округления не производится и именно эта "не округленная" сумма попадает в ORDERS_TABLE.
Это не критично ровно до тех пор, пока не используются онлайновые модули оплаты.
Туда передается информация о заказе (в том числе сумма), обратно сообщается информация об оплате (в том числе сумма).
Естественно, ни один сервис не примет в работу запрос, где сумма 10.7767 рублей, т.к. оплатить дробную часть копейки невозможно.
На этапе запроса округлять тоже не получится, т.к. вернется информация о том, что оплачена округленная сумма и она не совпадет с суммой заказа.
Решение - округлять на этапе создания заказа, т.е. в функции ordOrderProcessing
#( (float) $order_amount ).", ".
round((float)$order_amount,2).", ".

Теоретически надо бы округлять как-то по умному, т.е. не тупо "до двух знаков", а зависимо от валюты заказа.
Но это лишний SQL-запрос, а я не припоминаю валют, где "копейка" (если она есть) была бы не сотней от "рубля".
Доллар, евро, рубли, гривны, белрубли - везде "копейка" это одна сотая" рубля".
Исключение только фунт/шиллинг/пенс, но ShopCMS с фунтами мне не попадался.
Так что "до двух знаков" вполне подойдет.

PS. Отдельно прикольно, зачем в формуле скобки :)
$res = $clearPrice - ($clearPrice/100)*$d;


http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#43 R.Sergey

    Администратор

  • Администраторы
  • 2 771 сообщений
Репутация: 329
Мастер

Отправлено 12 апреля 2018 - 14:51

 badisoft сказал:

Так что "до двух знаков" вполне подойдет.

Забыл про биткоин у которого может быть и 0,00010 к примеру.
Хотя ShopCMS с биткоинами я тоже не встречал ну а вдруг. )))