Проблема с модулем PayPal. Вопрос программистам.

Byteman

Мой дом здесь!
Регистрация
18 Мар 2008
Сообщения
484
Реакции
242
Здравствуйте.

Думаю, решение проблемы не только мне пригодилось бы.
На разных форумах некоторые товарищи утверждают, что эта проблема не только у меня встречается, что проблема чисто в модуле, но автор не торопится её решать.
Я авторам модуля писал, но прошло прилично времени и я пока не получил ответа.

Протестировано на Prestashop версий от 1.6.1.9 до 1.6.1.14.
Модуль PayPal из стандартного комплекта Prestashop, включённый в режим PayPal Plus Для просмотра ссылки Войди или Зарегистрируйся.
На данный момент это модуль PayPal v3.11.4 - by PrestaShop из комплекта Prestashop 1.6.1.14: Для просмотра ссылки Войди или Зарегистрируйся

ПРОБЛЕМА:
При некоторых сочетаних товаров или их количества, при выборе PayPal в качестве метода оплаты,
всплывает ошибка типа "По техническим причинам в данный момент невозможна обработка платежа"

paypal_error.png

Например, я добавляю в корзину какой-то товар, открываю корзину, жму на оплату по PayPal
и всё в порядке - открывается окно PayPal. Иду снова в корзину с тем же товаром, увеличиваю количество с 1 на 2 или добавляю другой товар в корзину,
жму снова PayPal и на этот раз выскакивает ошибка. Ошибка выскакивает не с каждым товаром и не с каждым сочетанием товаров в корзине.

Создал саппорт-тикет на техпортале PayPal и через полтора месяца получил следующий ответ (в переводе:(

Предполагаю, что „Create Payment“ API Call, исходящий из Вашего магазина, в момент, когда клиент хочет произвести оплату, в некотрых случаях передаёт неправильные параметры.

К таким выводам я пришёл при просмотре наших лог-файлов. Из них я вижу, что Ваш модуль вызывает некоторые ошибки в „Renate Payment“ API Call.

Я вижу многократно следующую ошибку:

transactions[0]:
Item amount must add up to specified amount subtotal (or total if amount details not specified)
(Перевожу литературно: сложение цен товаров должно соответствовать указанной (переданной) общей промежуточной сумме).

Эта ошибка вызвана следующим:

"amount": {
"total": "18.41",
"currency": "EUR",
"details": {
"subtotal": "5.21",
"tax": "1.21",
"shipping": "11.99",
"unknown_property_map": {},
"handling_fee": "0.00"
},
  • SubTotal в этом примере равен 5.21 (евро), хотя сумма отдельных товаров равна 1.86 + 3.36 = 5.22 EUR.
Похоже, что Ваш магазин округляет суммы при передаче их в PayPal, однако внутри себя продолжает расчёты и далее с неокруглёнными числами. Например, 1.855 + 3.355 = 5.21

Это единственная ошибка, которую я нашёл.

Для решения данной проблемы, обратитесь к разработчикам, которые должны позаботиться о том, чтобы цены только один раз округлялись и после этого сумма составлялась из этих округлённых цен.

Я это так понимаю, что то ли модуль PayPal, то ли сам престашоп (я не знаю проводятся вычисления передаваемых в PayPal сумм в модуле или в ядре претсшопа) перед тем, как отправить в PayPal цены отдельных товаров, округляет их, затем отсылает в „Create Payment“ API. Далее преста (или модуль?) складывает НЕОКРУГЛЁННЫЕ цены товаров и только после этого после этого округляет получившеюся сумму и её также отправляет в „Create Payment“ API. В результате переданная сумма НЕокруглённых цен, в некоторых случаях отличается от суммы округлённых цен. „Create Payment“ API видит несовпадение и выдаёт ошибку!

И на самом деле. Изначально у меня в настройках магазина была установлена опция "Округлять итоги". После данного ответа сотрудника PayPal, я поменял опцию на "Округление каждого элемента", то есть округление цен отдельных товаров (вместо округления итоговой суммы) и ошибка больше не появляется.

upload_2017-6-8_15-13-36.png

Но я не могу оставить округление по каждому товару, так как в данном случае, при большом количестве разных товаров, общая цена будет отличаться от той, которая была бы при округлении только конечной суммы. Это не понравится клиентам, а главное, запрещено законодательством.

И вот на данном этапе я пока не могу сообразить даже логически как выйти из ситуации.

Казалось бы, логически, чтобы итоговая сумма была точней, то лучше делать не так, как сотрудник PayPal предлагает, а наоборот: передавать в „Create Payment“ API неокруглённые цены отдельных товаров и неокруглённую сумму неокруглённых цен отдельных товаров. Тогда API увидит, что переданные цены отдельных товаров и их сумма правильны. И пусть уже PayPal сам округлит и выдаст итоговую сумму с двумя знаками после запятой. В таком случае я могу в престашопе снова установить опцию "Округлять итоги" и тогда итоговая сумма в счёте (инвойсе) престашопа и в оповещёниях PayPal будет совпадать и будет достоверной, независимо от количества купленных товаров.

Но.....
1) Я не знаю будет ли PayPal принимать неокруглённые цифры и будет ли итоговую сумму сам округлять. Я сделаю запрос в PayPal, но они могут и не ответить или снова через 2 месяца.
2) Я не знаю как сделать, чтобы все цифры в „Create Payment“ API передавались неокруглёнными.

Тут нужен бы опытный программист, который имел дело с интеграцией PayPal в магазины не через готовые модули:

Для просмотра ссылки Войди или Зарегистрируйся
 

Вложения

  • upload_2017-6-8_15-32-41.png
    upload_2017-6-8_15-32-41.png
    17,5 KB · Просмотры: 9
Здравствуйте.

Думаю, решение проблемы не только мне пригодилось бы.
На разных форумах некоторые товарищи утверждают, что эта проблема не только у меня встречается, что проблема чисто в модуле, но автор не торопится её решать.
Я авторам модуля писал, но прошло прилично времени и я пока не получил ответа.

Протестировано на Prestashop версий от 1.6.1.9 до 1.6.1.14.
Модуль PayPal из стандартного комплекта Prestashop, включённый в режим PayPal Plus Для просмотра ссылки Войди или Зарегистрируйся.
На данный момент это модуль PayPal v3.11.4 - by PrestaShop из комплекта Prestashop 1.6.1.14: Для просмотра ссылки Войди или Зарегистрируйся

ПРОБЛЕМА:
При некоторых сочетаних товаров или их количества, при выборе PayPal в качестве метода оплаты,
всплывает ошибка типа "По техническим причинам в данный момент невозможна обработка платежа"

Посмотреть вложение 85962

Например, я добавляю в корзину какой-то товар, открываю корзину, жму на оплату по PayPal
и всё в порядке - открывается окно PayPal. Иду снова в корзину с тем же товаром, увеличиваю количество с 1 на 2 или добавляю другой товар в корзину,
жму снова PayPal и на этот раз выскакивает ошибка. Ошибка выскакивает не с каждым товаром и не с каждым сочетанием товаров в корзине.

Создал саппорт-тикет на техпортале PayPal и через полтора месяца получил следующий ответ (в переводе:(



Я это так понимаю, что то ли модуль PayPal, то ли сам престашоп (я не знаю проводятся вычисления передаваемых в PayPal сумм в модуле или в ядре претсшопа) перед тем, как отправить в PayPal цены отдельных товаров, округляет их, затем отсылает в „Create Payment“ API. Далее преста (или модуль?) складывает НЕОКРУГЛЁННЫЕ цены товаров и только после этого после этого округляет получившеюся сумму и её также отправляет в „Create Payment“ API. В результате переданная сумма НЕокруглённых цен, в некоторых случаях отличается от суммы округлённых цен. „Create Payment“ API видит несовпадение и выдаёт ошибку!

И на самом деле. Изначально у меня в настройках магазина была установлена опция "Округлять итоги". После данного ответа сотрудника PayPal, я поменял опцию на "Округление каждого элемента", то есть округление цен отдельных товаров (вместо округления итоговой суммы) и ошибка больше не появляется.

Посмотреть вложение 85964

Но я не могу оставить округление по каждому товару, так как в данном случае, при большом количестве разных товаров, общая цена будет отличаться от той, которая была бы при округлении только конечной суммы. Это не понравится клиентам, а главное, запрещено законодательством.

И вот на данном этапе я пока не могу сообразить даже логически как выйти из ситуации.

Казалось бы, логически, чтобы итоговая сумма была точней, то лучше делать не так, как сотрудник PayPal предлагает, а наоборот: передавать в „Create Payment“ API неокруглённые цены отдельных товаров и неокруглённую сумму неокруглённых цен отдельных товаров. Тогда API увидит, что переданные цены отдельных товаров и их сумма правильны. И пусть уже PayPal сам округлит и выдаст итоговую сумму с двумя знаками после запятой. В таком случае я могу в престашопе снова установить опцию "Округлять итоги" и тогда итоговая сумма в счёте (инвойсе) престашопа и в оповещёниях PayPal будет совпадать и будет достоверной, независимо от количества купленных товаров.

Но.....
1) Я не знаю будет ли PayPal принимать неокруглённые цифры и будет ли итоговую сумму сам округлять. Я сделаю запрос в PayPal, но они могут и не ответить или снова через 2 месяца.
2) Я не знаю как сделать, чтобы все цифры в „Create Payment“ API передавались неокруглёнными.

Тут нужен бы опытный программист, который имел дело с интеграцией PayPal в магазины не через готовые модули:

Для просмотра ссылки Войди или Зарегистрируйся


Напишите пож. Как решили проблему

upload_2020-10-28_3-8-2.png
разница 0,11 Е
 
проверьте в базе данных - возможно там просто округление...

например цена в базе данных содержит тысячные доли (возможно модулями импорта или перерасчёта пользуетесь)

на 27-ми товарах вот и набежало -11 центов, так как цена вашего товара не 5.92, а 5,916


поможет или ручная простановка-корректировка цен с точностью до цента или в базе данных MYSQL запросом округление делать и т.п.
 
клиент
проверьте в базе данных - возможно там просто округление...

например цена в базе данных содержит тысячные доли (возможно модулями импорта или перерасчёта пользуетесь)

на 27-ми товарах вот и набежало -11 центов, так как цена вашего товара не 5.92, а 5,916


поможет или ручная простановка-корректировка цен с точностью до цента или в базе данных MYSQL запросом округление делать и т.п.

без округления нельзя обойтись ? суму в корзине считает правильно, а на оплату дает не точно.... зачем вообще перещитывать второй раз Ведь сумма уже готова :)
 
клиент


без округления нельзя обойтись ? суму в корзине считает правильно, а на оплату дает не точно.... зачем вообще перещитывать второй раз Ведь сумма уже готова :)
Ладно, раз на вопрос не ответили, то придется рассказать подробнее. Товар в базе (если посмотреть в таблице), скорее всего имеет цену 5.915925 , т.к. по-умолчанию преста хранит цены с 6 знаками после запятой как написал _sashok. Судя по финальной сумме у вас в магазине настроено ОТОБРАЖАТЬ (не путать с ОКРУГЛЯТЬ, они могут совпадать, а могут и нет, зависит от настроек) цены с 2 цифрами после запятой, что логично, т.к. так принято у людей. И судя по ситуации у вас настроено ОКРУГЛЯТЬ конечную сумму (что плохо в вашем случае).

Когда преста считает СУММУ товара в корзине, то она делает 5.915925 х 27 = 159.729975 и затем округляет до 159.73. Эта часть думаю понятна.

Теперь переходим к корзине. Цена за единицу ОТОБРАЖАЕТСЯ с 2 знаками после запятой, т.к. так принято у людей и так настроено :) Именно в корзине у каждого товара помимо отображения преста вынуждена при расчете еще дополнительно округлить до 5.92 и потом умножить на 27 и получается 159.84, что расходится с суммой корзины. Для чего это делается? Для того, что у вас цена 5.92 видна покупателю, а не 5.915925 и как вы ему объясните, что при 5.92 х 27 должно равняться 159.73? Это же нелогично и неправильно математически, т.к. 5.92 х 27 равно именно 159.84, а не 159.73, как написано внизу в сумме товаров в корзине, где работает округление конечной суммы. Преста вынуждена это делать, чтобы арифметика выполнялась в каждой строчке корзины.

Для этого и сделаны варианты настроек (что округлять - каждую позицию, каждую строки или сумму). В странах с отмененными копейками/ценами настройки одни, в других странах другие. В вашем случае лучшим вариантом является округление каждой позиции. Если вы каталоге и в карточке товара везде указываете 5.92, до с какого бодуна стоит округление финальной суммы? Указали покупателю, что товар стоит 5.92 и именно эту сумму умножайте на 27, но никак не 5.915925 как настроено сейчас. Это намного быстрее чем исправлять код престы.
 
Назад
Сверху