php - 使用 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();
我需要一些有关如何进一步解决此问题的建议。我无法在我的沙盒环境中重现它;它只发生在客户的真实账户上。
解决方案
您很可能会遇到困扰电子商务开发的经典“由于浮点二进制数近似导致的计算错误”问题。换句话说,尽管编写了看起来很漂亮的加法、乘法和除法运算,但由于数字的二进制浮点表示,您正在累积非常小的值漂移。
关于这个问题有很多文章/问题/博客/见解。通过搜索调用非常简单。例如:为什么不使用 Double 或 Float 来表示货币?(对此答案有 800 多张赞成票)
传统的解决方案是使用“适当的”十进制数处理类。还要祈祷你正在学习的课程在一定程度上正确地进行了所有计算。一个 PHP 示例类是https://github.com/moneyphp/money - 而且,我记得 PHP 中的某个“Money/Money”类在将 $ 分配到切片时出错(发生 +/- 0.01 美元);它实际上可能是链接到这里的那个库,所以请注意这一点。我相信只是私下而不是公开地修复了这个错误。
推荐阅读
- python - Ode 集成器 Python TypeError 'float' 对象不可下标
- ruby-on-rails - 使用涉及嵌套标签和命名空间的 Nokogiri 生成 XML
- matlab - vecnorm 的广义版本 - Matlab
- vb.net - 在 Windows 窗体 Vb.net 上调整面板大小
- java - 在不知道 Firebase 实时数据库中的键值的情况下检索子值
- javascript - 获得行动结果的最佳方式是什么?
- c# - 如何使用 EF6 为 Web API 创建域模型的可选日志记录属性?
- twitter - 基本 Twitter 数据挖掘导致问题
- activemq - 使用 .Net 的套接字连接 ActiveMQ
- mysql - VB.NET MySQL 应用程序将无法在客户端 Windows 10 64 位 PC 上连接