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


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


  • Вы не можете ответить в тему
Сообщений в теме: 42

#41 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 26 March 2018 - 08:50 PM

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

В 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"];

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

#42 badisoft

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

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 12 April 2018 - 02:20 PM

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

Если цена товара содержит "копейки" (дробную часть, к примеру, 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;

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

#43 R.Sergey

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

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

Отправлено 12 April 2018 - 02:51 PM

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


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