Magento 和 Paypal 税务四舍五入问题

Posted

技术标签:

【中文标题】Magento 和 Paypal 税务四舍五入问题【英文标题】:Magento & Paypal tax rounding issue 【发布时间】:2012-08-05 19:50:31 【问题描述】:

我在使用 Paypal 和 Magento 1.7.0.2 时遇到一些舍入问题 - 网站上的所有价格均含税,税费按 20% (VAT) 计算。

我去结账,一切都正确:

然后我会点击下订单,Paypal 会是这样,这是不正确的,因为现在总计少了 1 便士。这似乎是税收四舍五入造成的。

在某些情况下,它可以正常工作,但在其他情况下,税收四舍五入不正确。我已经尝试在 app/code/core/Mage/Tax/Model/Calculation.php

中更改税收计算方法 calcTaxAmount()

我将此添加到似乎可以修复它的 calcTaxAmount 方法中,但它会导致产品页面上的价格不正确(少 1 便士)。

$amount = $this->roundUp($amount);

我很确定这是一个错误,但我没有想法。如果有人以前遇到过这种情况并有解决方案,我会很高兴听到它。非常感谢任何帮助。

编辑:这是我在 Magento 中的税务设置

【问题讨论】:

您在后台的税务计算设置是什么? 我会将税务设置的屏幕截图添加到我的帖子中。 尝试根据单价更改税收计算。我认为它会更符合英国的税法。如果没有帮助,我会指出可以改变的地方。 是否可以阻止 Paypal 自行计算税款?相反,我希望它只使用发送给它的数据。 @IvanChepurnyi - 将税收计算方式更改为单位或行意味着我的购物车中的总金额现在增加了 1 便士,所以我的购物车总金额为 55.41 英镑 - 看起来我无法使用这个方法.. 【参考方案1】:

我想我已经找到了解决这个困扰社区的问题的方法。

如果您的价格含税,则税款计算错误。

这里是修复 - 在 Mage_Tax_Model_Calculation::calcTaxAmount():

改变条件:

if ($priceIncludeTax)...

到:

if ( ! $priceIncludeTax ) ...

所以条件看起来像:

if ( ! $priceIncludeTax )  
    $amount = $price*(1-1/(1+$taxRate)); 
 else  
    $amount = $price*$taxRate; 

详情请查看我的cmets:http://www.magentocommerce.com/boards/viewthread/247201/P45/

记住不要修改核心文件-在本地创建一个副本

【讨论】:

感谢 Mike 的贡献,我试试看。 这是行不通的。我建议关注magentocommerce.com/boards/viewthread/247201/P45/#t415016 这有时可以修复它,但并非总是如此。此外,一旦您从 PayPal 返回/将订单标记为欺诈,它也会显示错误。搜索继续..【参考方案2】:

我今天为我的客户“修复”了这个问题,但对解决方案并不满意。但它有效。

最好将此文件复制到本地文件夹: app/code/core/Mage/Paypal/Model/Api/Nvp.php

我在第 606 行添加了这段代码(仅用于快速结帐),所以它看起来像这样。

$request['SHIPPINGAMT'] = ($request['AMT'] - ($request['TAXAMT'] + $request['ITEMAMT']));

$response = $this->call(self::SET_EXPRESS_CHECKOUT, $request);
$this->_importFromResponse($this->_setExpressCheckoutResponse, $response);

您需要在后端的 paypal moule 中打开 Transfer Cart Line Items

如果有人知道更好的解决方案,那么只需覆盖运费让我知道

【讨论】:

【参考方案3】:

这个问题一直困扰着我(从外观上看,magento 社区已经很久了),感谢 ShopWorks 朝着正确的方向推进(包括他的代码 sn-p,谢谢伙计!但是如果回去它会出错从快速结帐到购物车,添加了一个签入以防止这种情况发生。)$request 参数我想出了以下修复(/hack):

在 Nvp.php 的第 606 行放置以下内容:

$totalValue = $request['TAXAMT'] + $request['ITEMAMT'];
$finalValue = $totalValue - $request['AMT'];

if($request['SHIPPINGAMT'] > 0) 
    $request['SHIPPINGAMT'] = ($request['AMT'] - ($request['TAXAMT'] + $request['ITEMAMT']));
    $totalValue = $request['TAXAMT'] + $request['ITEMAMT'] + $request['SHIPPINGAMT'];
    $finalValue = $totalValue - $request['AMT'];


if($request['AMT'] != $totalValue) 
    if($totalValue > $request['AMT']) 
        $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
     elseif($totalValue < $request['AMT']) 
        $request['TAXAMT'] = $request['TAXAMT'] + $finalValue;
     else 
        $request['AMT'] = $request['TAXAMT'] + $request['ITEMAMT'];
    

此外,还需要在 call() 函数中放置以下内容(Nvp.php 的第 938 行):

$totalValue = $request['TAXAMT'] + $request['ITEMAMT'] + $request['SHIPPINGAMT'];
$finalValue = $totalValue - $request['AMT'];

if($request['AMT'] != $totalValue) 
    if($totalValue > $request['AMT']) 
        if($finalValue > 0) 
            // its preferable that we change the tax amount over the grand total amount
            $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
         else 
            $request['AMT'] = $totalValue;
        
     elseif($totalValue < $request['AMT']) 
        if($finalValue > 0) 
            // its preferable that we change the tax amount over the grand total amount
            $request['TAXAMT'] = $request['TAXAMT'] + $finalValue;
         else 
            $request['AMT'] = $totalValue;
        
     else 
        $request['AMT'] = $totalValue;
    

这是一个 hack,请照此处理。我的同事目前正在测试,但目前似乎还可以,按单价设置计税方法也很有帮助(我们的会计师对这种安排很满意,但这是针对英国的,我不确定是否其他国家会不赞成这种特定的税收计算方法)。

我操纵 $request['AMT'] 的原因是因为有时 $finalValue 变量的计算会产生一个 -0.9999 重复整数,这对任何人都没有用,我的数学很烂,所以如果有人想改进在此,请这样做!

一如既往,不要覆盖核心目录中的 nvp.php,创建一个单独的重写模块或在 app/local/mage 中执行此操作。首选首选! :-)

【讨论】:

这解决了我在 1.8.1.0 中的问题(转移购物车订单项必须设置为否!)只测试了几个小时,但到目前为止看起来不错... 刚刚升级到 1.9.1.0,你瞧,这仍然是个问题!没有将此覆盖移至 1.9 代码库,以为他们会修复它,我错了! 这对我来说有点用,但是当我们从 PayPal Express 返回到 Magento 确认页面时仍然出现问题,说“购物车项目的总金额与订单金额不匹配”。这些交易也可以被 PayPal 标记为欺诈。【参考方案4】:

在 Magento 模块中的 Paypal 上有一个“错误”(至少在我的 Magento 1.8.0 上); 它位于Mage_Paypal_Model_Cart 类中。

为了验证金额是否正确,第 381 行的 _validate() 方法将订单中的所有商品价格相加,加上运费和税费,并将结果与​​订单的总价值进行比较(从订单方法获得getBaseGrandTotal())

但有时,金额之间存在0.009999999999999999的差异(它必须来自不同的舍入方法,我不知道);所以项目无效,第 146 行的方法 getItems() 返回 false。

在我的情况下,这导致客户支付不同的金额并在他们的订单上显示“欺诈嫌疑”标志。

我通过更改比较方法(第 404 行)来修复它:

if (sprintf('%.4F', $sum) == sprintf('%.4F', $referenceAmount)) 
    $this->_areItemsValid = true;

$diff = abs(sprintf('%.4F', $sum) - sprintf('%.4F', $referenceAmount));

if ($diff < 0.01) 
     $this->_areItemsValid = true;

我还是希望以后的diff不要超过0.009999999...

希望这会有所帮助。

【讨论】:

【参考方案5】:

我正在使用 CE1.7.0.2 并且已经被这个问题困扰了好几天,尝试了几种解决方案,最后找到了 Adam Hall 的修复/破解。理想对我来说看起来很合理,所以我把它应用到我的网站上,一切都很顺利,直到今天早上,我意识到税额调整不适合我们的情况。

我们在加利福尼亚州并在全州销售商品,加利福尼亚州的客户将被收取销售税,而其他人则不会。因此,当税额为零并且必须减去差额时,它将产生一个负税额,这显然会被贝宝拒绝。所以在减去税额差额的时候,我加了一个条件语句

if ($request['TAXAMT'] > 0) 
    $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
 else 
    $request['SHIPPINGAMT'] = $request['SHIPPINGAMT'] - $finalValue;

如果税额为零,我将调整运费而不是税额。 (当然如果税费和运费都是免费的,这是行不通的,但我认为这不会发生在实际业务中。)希望这可以帮助那些和我们有同样问题的人。

【讨论】:

【参考方案6】:

我只是将转移购物车行项目更改为“否”,而没有更改上述代码.. 它有效。

Magento 1.9.0.1

仅供参考 - 测试它是否适合您。

Dmytro

【讨论】:

以上是关于Magento 和 Paypal 税务四舍五入问题的主要内容,如果未能解决你的问题,请参考以下文章

Magento 和 Paypal 问题

Magento 1.9 (PayPal) 代理认证

PayPal 在 PayPal 方面向 Magento 购物车添加额外的税收

Magento 2:来自印度以外的Paypal付款问题

Magento 和 PayPal 网站付款专业版错误

Magento paypal 快递评论页面和协议