首页 > 解决方案 > 使用 paypal rest payment api 减一美分

问题描述

我已经为一些客户开发了一个 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();

我需要一些有关如何进一步解决此问题的建议。我无法在我的沙盒环境中重现它;它只发生在客户的真实账户上。

标签: phppaypal

解决方案


您很可能会遇到困扰电子商务开发的经典“由于浮点二进制数近似导致的计算错误”问题。换句话说,尽管编写了看起来很漂亮的加法、乘法和除法运算,但由于数字的二进制浮点表示,您正在累积非常小的值漂移。

关于这个问题有很多文章/问题/博客/见解。通过搜索调用非常简单。例如:为什么不使用 Double 或 Float 来表示货币?(对此答案有 800 多张赞成票)

传统的解决方案是使用“适当的”十进制数处理类。还要祈祷你正在学习的课程在一定程度上正确地进行了所有计算。一个 PHP 示例类是https://github.com/moneyphp/money - 而且,我记得 PHP 中的某个“Money/Money”类在将 $ 分配到切片时出错(发生 +/- 0.01 美元);它实际上可能是链接到这里的那个库,所以请注意这一点。我相信只是私下而不是公开地修复了这个错误。


推荐阅读