Magento Rundungsfehler / Paypal
PayPal Problem in aktuellen Versionen
In der aktuellen Version wurden die Fehler von der Version 1.4.1 beseitigt. Die komplette Neuinstallation von PayPal und Magento sollte Rundungsfehler an dieser Stelle aus dem Weg geräumt haben. Bei Update-Systemen kommt es ab und an trotzdem zu Rundungsfehlern, da Magento die Preise intern teilweise auf 2 Nachkommastellen rundet und nicht auf 4. Beispiel konfigurierbare Produkte mit Preisen inklusive Mehrwertsteuer.
Ein Weg zur Problembeseitigung ist die folgende:
Datei: /app/code/core/Mage/Core/Model/Store.php
1 2 3 4 | public function roundPrice($price) { return round($price, 2); } |
ersetzen durch:
1 2 3 4 | public function roundPrice($price) { return round($price, 4); } |
Wenn das den Fehler nicht behoben hat, ist eine genaue Fehlerbestimmung sehr schwierig, eventuell können auch „Konfigurationsfehler“ verantwortlich sein. Mit folgender Methode können die an PayPal übergebenen Werte einfach auslesen werden, ohne eine Bestellung zu erzeugen.
1. öffnen Sie folgende Datei:
1 | /app/code/core/Mage/Paypal/Model/Standard.php |
2. suchen Sie in der Datei folgende Funktion
1 | public function getStandardCheckoutFormFields() |
3. lassen Sie sich die Werte ausgeben und blockieren Sie den Bestellvorgang durch „exit;“
1 2 | $result = $api->getStandardCheckoutRequest(); return $result; |
ändern in:
1 2 3 4 5 | $result = $api->getStandardCheckoutRequest(); echo "<pre>"; print_r($result); exit; return $result; |
In der Version 1.4 muss folgende Zeile verändert werden:
1 | list($items, $totals, $discountAmount, $shippingAmount) = Mage::helper('paypal')->prepareLineItems($quote, false, true); |
ändern in:
1 2 3 4 | list($items, $totals, $discountAmount, $shippingAmount) = Mage::helper('paypal')->prepareLineItems($quote, false, true); echo "<pre>"; print_r($items); exit; |
PayPal Problem bei Magento 1.4.1
Die Tage bin ich jedoch auf ein weiteres Problem in Verbindung mit PayPal gestoßen. Bei einem Betrag von Bsp: 12.50€ im Warenkorb wird ein falsch gerundeter Betrag an PayPal übergeben. Das Problem ist die Delta Rounding Funktion in der Quote/Tax. Die Lösung des Problems ist wie folgt:
1 2 | \app\code\core\Mage\Tax\Model\Sales\Total\Quote\Tax.php Zeile 600-625 |
1 2 3 4 5 6 7 8 9 10 11 | /** * "Delta" rounding */ $delta = isset($this->_roundingDeltas[$rateKey]) ? $this->_roundingDeltas[$rateKey] : 0; $baseDelta = isset($this->_baseRoundingDeltas[$rateKey]) ? $this->_baseRoundingDeltas[$rateKey] : 0; $rowTax += $delta; $baseRowTax += $baseDelta; $this->_roundingDeltas[$rateKey] = $rowTax - $this->_calculator->round($rowTax); $this->_baseRoundingDeltas[$rateKey] = $baseRowTax - $this->_calculator->round($baseRowTax); $rowTax = $this->_calculator->round($rowTax); $baseRowTax = $this->_calculator->round($baseRowTax); |
ändern in
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * "Delta" rounding */ $delta = 0; $baseDelta = 0; //$delta = isset($this->_roundingDeltas[$rateKey]) ? $this->_roundingDeltas[$rateKey] : 0; //$baseDelta = isset($this->_baseRoundingDeltas[$rateKey]) ? $this->_baseRoundingDeltas[$rateKey] : 0; $rowTax += $delta; $baseRowTax += $baseDelta; $this->_roundingDeltas[$rateKey] = $rowTax - $this->_calculator->round($rowTax); $this->_baseRoundingDeltas[$rateKey] = $baseRowTax - $this->_calculator->round($baseRowTax); $rowTax = $this->_calculator->round($rowTax); $baseRowTax = $this->_calculator->round($baseRowTax); |
Es gibt noch eine weitere Lösung für das PayPal Problem bei noch älteren Versionen als 1.4:
Das Problem mit Paypal lässt sich lösen, wenn man die Datei Abstract.php in app/code/core/Mage/Shipping/Model/Carrier/ (Zeile 262) folgendermaßen anpasst:
1 | return round($finalMethodPrice,2); |
1 | vorher: return $finalMethodPrice; |
Magento 1.4 und älter
In Magento 1.4 und älter wurden Beträge oft auf 2 Kommastellen gerundet und somit kam es zu unerwünschten Rundungsfehlern, die Lösung dazu ist in vielen Foren zu lesen und im folgenden noch mal kurz aufgeführt.
Leider gibt es einen derben Rundunsfehler in Magento, was bei größeren Beträgen einige Euros ausmachen kann. Hier die Lösung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | In: /app/code/core/Mage/Core/Model/Store.php Zeile 740 return round($price, 2); ändern in: return round($price, 4); In: \app\design\adminhtml\default\default\template\catalog\product\edit\price\tier.phtml Zeile 161 ändern in: In: app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Price.php Zeile 86 return number_format($value, 2, null, ‘’); ändern in: return number_format($value, 4, null, ‘’); In: app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php Zeile 285 if ($type == ‘percent’) { return number_format($value, 2, null, ‘’); } elseif ($type == ‘fixed’) { return number_format($value, 2, null, ‘’); ändern in: if ($type == ‘percent’) { return number_format($value, 4, null, ‘’); } elseif ($type == ‘fixed’) { return number_format($value, 4, null, ‘’); |
Tags: Magento, PayPal, PHP, Programmierung, Rundungsfehler
Jan 23, 2012
Hi, hast Du evtl. irgend eine Ahnung, wie sich die Lösung für das Paypal-Problem in Magento 1.6.x gestalten würde? Die o.g. Codezeilen finde ich leider in dieser Version nicht in der Datei Tax.php.
Danke Dir und schöne Grüße!
Jan 24, 2012
Ab der Version 1.5 wurden einiges an den Rundungsproblemen von Magento beseitigt. Der core hat sich in Folge dessen etwas verändert.
Ab 1.5 befindet sich die deltaRound in einer Funktion in der selben Datei:
\app\code\core\Mage\Tax\Model\Sales\Total\Quote\Tax.php
Die Rundung übernimmt nun die folgende Funktion:
protected function _deltaRound($price, $rate, $direction, $type=’regular‘) (etwa Zeile 588)
Hier müsste nun die Zeile
$delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0;
ersetzt werden durch:
$delta = 0;
Leider konnte ich den Fall nicht testen und würde um ein kurzes Feetback bitten.
Jan 31, 2012
Leider funktioniert diese Lösung nicht. Vielleicht hat noch jemand eine andere Idee?
Jan 24, 2012
Vielen Dank erstmal für Deine Hilfe! Habe das mal ausprobiert – leider hatte es bei uns jetzt keine Veränderung gebracht. Aber das kann durchaus auch an einigen anderen Einstellungen bzgl. Berechnung liegen.
Paypal bekommt einen Nettowert mit zwei Nachkommastellen übergeben (z.B. 10,19 € für ein Produkt anstatt korrekten 10,1869 €). Aus diesen (bereits aufgerundeten) 10,19 € (netto) und den 4,96 € Versandkosten (netto) berechnet Paypal die Bruttosumme 16,8057 €. Und dann wird von Paypal schwups auf 16,81 € aufgerundet.
Wir haben es jetzt so gelöst, dass wir für die Versandkosten einen glatten Nettobetrag nehmen (5 €). Das macht brutto dann Versandkosten von 5,95 € anstatt 5,90 €. Aber dafür kann Paypal jetzt schlicht nichts mehr falsch rechnen.
Beste Grüße!
Feb 13, 2012
Ich habe festgestellt, dass es zu Problemen beim Bestellabschluss kommt, wenn man folgenden Code-Fix anwendet:
public function roundPrice($price)
{
return round($price, 4);
}
Dadurch werden zwar die teilweise auftretenden 1-Cent Probleme im Frontend gelöst, im Checkout allerdings entsteht dadurch ein Fehler.
Mit den Fix (Fehler im Checkout tritt auf):
Brutto Artikel: 17,50
Brutto Versand: 3,90
Netto Artikel: 16,36
Netto Versand: 3,28
Netto Summe: 19,63 <– da fehlt ein Cent!!!
Steuern: 1,77
Summe Brutto: 21,40 <– das stimmt zwar, wenn man Brutto Artikel und Brutto Versand addiert, allerdings rechnet Paypal 16,36 + 3,28 + 1,77 und kommt somit auf 21,41!!! Betrugsverdacht.
Man sieht allein schon, dass die Summe der Netto-Beträge nicht passt.
Wendet man den Fix nicht an (also lässt es bei Round ,2):
Brutto Artikel: 17,50
Brutto Versand: 3,90
Netto Artikel: 16,36
Netto Versand: 3,28
Netto Summe: 19,64 <– jetzt passt die Netto-Summe
Steuern: 1,76 <– macht jetzt auch Sinn
Summe Brutto: 21,40 <– Summe Brutto stimmt weiterhin und Paypal rechnet jetzt auch richtig: 16,36 + 3,28 + 1,76 = 21,40
Bei dem Rundungsfix werden im Checkout einfach so gerundet, dass 1 Cent des Netto-Betrages auf die Steuern übertragen wird. Dies wird sicherlich nicht immer auftreten (aufgrund der verschiedenen Einzelartikel-Nettopreisen … aber ich bin der festen Überzeugung, dass der Fix ein großes Problem darstellt)
Sep 16, 2012
Der Rundungsfehler, der bei manchen Zahlungen über Paypal auftritt, lässt sich nicht in Magento beheben. Die Bestellungen müssen nachträglich angepasst werden. Der Fehler entsteht dadurch, dass die/der Nettopreis/e nur mit zwei Nachkommastellen nach Paypal übertragen werden und Paypal nicht richtig runden kann. Mehr dazu in diesem Blogartikel: http://fabiankrueger.de/blog/?p=5
Dez 17, 2012
Hallo,
leider gibt es das Problem noch in Magento 1.7.
Hat jemand dazu nun eine Lösung oder musss man die fehlerhaften (betrügerischen) Paypal-Zahlungen manuell bearbeiten?
Da muss es doch irgendwie eine Lösung geben 🙁
lg Marc
Okt 07, 2013
Übrigens der Hinweis von Fabian Bestellungen nachträglich anzupassen verwundert mich ein wenig – die Bestellungen gehen aufgrund der Ablehnung ja gar nicht ein befinden sich so weder im Backend noch im PayPal Admin, wie soll ich eine nicht existierende Bestellung anpassen?
Okt 10, 2013
In Magento 1.8 ist der Rundungsfehler behoben. Für alle, die nicht updaten können/wollen, könnte diese Erweiterung helfen:
http://www.magentocommerce.com/magento-connect/catalog/product/view/id/20012/
Okt 14, 2013
In Magento 1.8 wurde der Fehler behoben:
http://magento.xonu.de/fehlerbehebung/magento-1-8-rundungsfehler-behoben/
Für Magento 1.7.x.x gibt es von uns Lösung als Extension auf Magento Connect:
http://www.magentocommerce.com/magento-connect/catalog/product/view/id/20012/