Off on ONE Cent используя api остаток оплаты PayPal - PullRequest
0 голосов
/ 01 октября 2018

Я разработал интеграцию PayPal для нескольких клиентов, однако у одного из них возникла эта проблема, когда возвращаемая сумма уменьшается на один цент (короткий 0,01 доллара США).

Я использую последнюю версию paypal/rest-api-sdk-php пакетов композитора, и общая сумма к оплате, отображаемая на этапах оплаты PayPal, представляется правильной.Я получаю оплаченную сумму, используя следующий код:

$ppPayId = $_REQUEST['paymentId'];
$payment = PP\Payment::get($ppPayId, $this->apiCtx);
$amount = $payment->transactions[0]->amount->getTotal();

Мне нужен совет по дальнейшему устранению этой проблемы.Я не могу воспроизвести это в моей среде песочницы;это происходит только на реальном счете клиента.

1 Ответ

0 голосов
/ 02 октября 2018

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

Существует много статей / вопросов / блогов / идейпо этой проблеме.Очень просто вызвать с помощью поиска.Пример: Почему бы не использовать Double или Float для представления валюты? (800+ голосов за этот ответ)

Традиционным решением является использование "правильного" класса обработки десятичных чисел.Также помолитесь, чтобы класс, который вы выбираете, в определенной степени правильно выполнял все свои вычисления.Один пример класса PHP - https://github.com/moneyphp/money - и, я помню, у определенного класса "Деньги / Деньги" в PHP возникла ошибка с распределением $ на кусочки (происходит +/- $ 0.01);и на самом деле это может быть ссылка на эту библиотеку, поэтому, пожалуйста, остерегайтесь этого.Я считаю, только исправил эту ошибку в частном порядке, а не публично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...