Blog

How-To

Magento – doppelte Bestellung vermeiden

Bei Magento gibt es eine Unschönheit beim Checkout. Diese kann zu doppelten Bestellungen führen.
Wenn ein Kunde beim Durchlaufen des Checkouts im letzten Schritt angekommen ist, wird beim Drücken, des Buttons „Bestellung abschicken“, der Request per Ajax absetzt und der Button deaktiviert. Dies ist erst mal genau so wie es sein soll.
Sobald aber dieser Request an den Browser mit der Bitte, den Kunden weiter auf die Seite des externen Zahlungsanbieters zu leiten zurückgeleitet wird, wird der Button wieder aktiviert. Wenn der Kunde jetzt nochmals klickt, dann wird der Kaufprozess noch mal angestossen und in Magento zwei Bestellungen erzeugt. Dies sollte aber vermieden werden, weil der Kunde mit hoher Wahrscheinlichkeit nur eine Bestellung tatsächlich absetzen wollte. Die Überraschung und vermutlich auch das Ärgernis beim Kunden ist im Ergebnis groß, falls diese doppelt verschickt und entsprechend auch abgerechnet werden sollte. Außerdem steigt der Verwaltungsaufwand auf Seite des Anbieters natürlich völlig unnötig.

Dieses Problem in Magento lässt sich nur beheben, wenn man sein Template anpasst. Nachfolgend hierzu eine kurze Anleitung (im Falle von Magento 1.7).

Hierfür muss man das eigene Template im Checkout anpassen, dafür kopiert man die Dateien:

  • app/design/frontend/base/default/template/checkout/onepage/review.phtml
  • app/design/frontend/base/default/template/checkout/onepage/review/button.phtml

an die selbe Stelle des eigenen Templates, falls diese noch nicht vorhanden ist.

In der review.phtml ändert man:

<script type="text/javascript">// <![CDATA[
review = new Review('<?php echo $this->getUrl('checkout/onepage/saveOrder') ?>', '<?php echo $this->getUrl('checkout/onepage/success') ?>', $('checkout-agreements'));
// ]]></script>

zu:

<script type="text/javascript">// <![CDATA[
var btnActive=true;
        review = new Review('<?php echo $this->getUrl('checkout/onepage/saveOrder') ?>', '<?php echo $this->getUrl('checkout/onepage/success') ?>', $('checkout-agreements'));
        function activateButton() {
			btnActive = true;
			$("submitBtn").update("<?php echo $this->__('Place Order') ?>");
        }
// ]]></script>

in der button.phtml ändert man von:

 

nach:

 

Abschließend muss man noch eine Änderung im JS machen, damit der Button im Fall eines Fehlers wieder aktiviert wird. Hierfür in der Datei:
/skin/frontend/base/default/js/opcheckout.js (bzw. angepasste Version im Template) in der Zeile 887 nach:

    if (msg) {
        alert(msg);
    }

folgendes einfügen ( Review.nextStep() ):

    if(typeof(activateButton) == typeof(Function)){
        activateButton();
    }

Achtung: Man sollte hier wissen was man tut, da bei Fehlern in der Umsetzung der ganze Kaufprozess nicht funktioniert, das heißt man muss gründlich testen. Wir übernehmen daher natürlich keine Verantwortung für die vorgestellte Lösung ‚-).

Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 Unported License.

Interessieren auch Sie sich für technische Anwendungssysteme? Dann informieren Sie sich doch einfach über unser Schulungsangebot. Oder Sie melden Sie sich bei uns, entweder telefonisch unter +49 4105 56156-99, per Mail an info@initos.com oder über unser Kontaktformular.

zurück zur Übersicht