SUPEE-9767 Patch / CE 1.9.3.3 - One Page Checkout - Problem bei der Kundenregistrierung

19

Bei einer sauberen Vanilla-Installation von Magento 1.9.2.4, gepatcht mit SUPEE-8788, SUPEE-9652 und SUPEE-9767, und mit der neuen Einstellung 'Formularschlüsselüberprüfung beim Auschecken aktivieren', nachdem eine erfolgreiche Neukundenregistrierung beim Auschecken aktiviert wurde In der Standardeinstellung für One Page Checkout wird kein neuer Kunde erstellt und der Kunde ist nicht angemeldet, obwohl die Bestellung ordnungsgemäß ausgeführt wird.

Wenn Sie das Kontrollkästchen "Formularschlüsselüberprüfung beim Auschecken aktivieren" deaktivieren, funktioniert dies wieder. Hat jemand anderes dieses Problem gehabt? Es scheint keine Rolle zu spielen, welche Versand- / Zahlungsmethoden verwendet werden.

Ich habe dies seitdem mit einer neuen, unveränderten Installation von Magento 1.9.3.3 versucht und es scheint dasselbe Problem zu geben. Wenn Sie einen neuen Kunden über die einseitige Kaufabwicklung registrieren, wird kein Kunde erstellt, auch wenn die Bestellung erfolgreich abgeschlossen wurde, sofern die Einstellung "Bestätigung des Formularschlüssels bei Kaufabwicklung aktivieren" aktiviert ist.

RickyMage123
quelle

Antworten:

36

Ok, hier ist die eigentliche Fehlerbehebung, die ich mir ausgedacht habe.

Bearbeiten /skin/frontend/base/default/js/opcheckout.jsund bearbeiten Sie die setMethod()Methode, indem Sie Folgendes ersetzen:

setMethod: function(){
    if ($('login:guest') && $('login:guest').checked) {
        this.method = 'guest';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest'}}
        );
        Element.hide('register-customer-password');
        this.gotoSection('billing', true);
    }
    else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
        this.method = 'register';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register'}}
        );
        Element.show('register-customer-password');
        this.gotoSection('billing', true);
    }
    else{
        alert(Translator.translate('Please choose to register or to checkout as a guest').stripTags());
        return false;
    }
    document.body.fire('login:setMethod', {method : this.method});
},

Mit:

setMethod: function(){
    var formKey = $('checkout-step-login').select('[name=form_key]')[0].value;
    if ($('login:guest') && $('login:guest').checked) {
        this.method = 'guest';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest', form_key:formKey}}
        );
        Element.hide('register-customer-password');
        this.gotoSection('billing', true);
    }
    else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
        this.method = 'register';
        new Ajax.Request(
            this.saveMethodUrl,
            {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register', form_key:formKey}}
        );
        Element.show('register-customer-password');
        this.gotoSection('billing', true);
    }
    else{
        alert(Translator.translate('Please choose to register or to checkout as a guest').stripTags());
        return false;
    }
    document.body.fire('login:setMethod', {method : this.method});
},

Das wird es tun, während wir auf die Version 2 des Patches warten

Raphael beim digitalen Pianismus
quelle
Nett. Ich war zu faul, um den Prototyp zu erarbeiten und ein geeignetes Eingabefeld zu finden.
Peter O'Callaghan
@ PeterO'Callaghan ja Prototyp ist schmerzhaft zu arbeiten, wenn Sie an jQuery ^^
gewöhnt sind
1
Was passiert, wenn Sie zu diesem Zeitpunkt kein Element mit dem Namen "form_key" in Ihrer Kasse haben? Wie groß sind die Chancen, die eintreten werden?
Arjen Miedema
1
@ paj danke, dass du mich informiert hast. Implementierte es für mehrere Geschäfte jetzt ohne Probleme
Arjen Miedema
1
@RaphaelatDigitalPianism: Ich habe deinen Weg ausprobiert, aber das hat mir nicht geholfen, irgendeine Idee?
Anurag Khandelwal
15

Wenn Sie registrieren auswählen und fortfahren, ruft das JS-Skript auf checkout.setMethod(), das sich in befindet skin/frontend/base/default/js/opcheckout.js. Von dort aus können wir sehen, dass es eine AJAX POST-Anfrage this.saveMethodUrlanstellt, aber der einzige Parameter, den es übergibt, ist method. Wenn wir uns ansehen Mage_Checkout_OnepageController::saveMethodAction, welches das Ziel dieser AJAX-Anfrage ist, können wir sehen, dass der Patch hinzugefügt wurde:

if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
}

Da in der Anforderung _validateFormKeynach einem form_keyParameter gesucht wird und die JS- setMethodAnforderung diesen bei der Erstellung der AJAX-Anforderung nicht gesendet hat, kehrt sie einfach vorzeitig zurück und unternimmt nichts. Zurück zu der setMethodFunktion, und wir können sehen, dass nichts anderes passiert und die JS fortfährt, da sie nicht versucht, etwas mit einem Rückgabewert zu tun. Zu diesem Zeitpunkt hat die JS festgelegt, this.method = 'register'aber das Angebot wurde nicht aktualisiert, und dies checkout_methodist der Standard-Gast.

Da der JS das vom Kunden ausgewählte Register kennt, werden die Kennwortfelder angezeigt. Auf den ersten Blick sieht es also so aus, als würden Sie sich registrieren. Auf der PHP-Seite handelt es sich jedoch um eine Gast-Kaufabwicklung, sodass der Kunde nach Abschluss der Kaufabwicklung nicht mehr erstellt wird.

Bearbeiten: Die einfachste Lösung ist das Auskommentieren dieser drei Zeilen von saveMethodAction. Die korrektere / komplexere Lösung besteht darin, setMethodden form_key von der Seite zu holen und mit der AJAX-Anfrage zu senden.

Peter O'Callaghan
quelle
Geben Sie bitte den Pfad an, unter dem wir uns befinden: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon
skin / frontend / base / default / js / opcheckout.js enthält diese Funktion nicht.
Icon
2
Das Code-Snippet, das den form_key überprüft, stammt von app/code/core/Mage/Checkout/controllers/OnepageController.php. Dies wird dadurch verursacht, dass der JS die Anforderung erstellt, den form_key nicht zu senden. Es ist ein Fehler mit dem Patch. Ich vermute, dass es eine v2 geben muss.
Peter O'Callaghan
2
Oder deaktivieren Sie bis zum Patch v2 einfach die Einstellung System / Configuration / Admin -> Security -> "Enable Form Key Validation On Checkout" auf 0. Dies bringt einen Hinweis, aber nach dem Patch v2 können wir ihn wieder aktivieren
Jeroen
1
Danke, dass du ein bisschen tiefer gegraben hast, Peter. Hoffentlich wird jemand von Magento dies abholen oder den Fehlerbericht bemerken und wir werden eine v2 bekommen.
RickyMage123
3

Volle Credits gehen an Peter für die Lösung! Ich möchte Schritt für Schritt darauf hinweisen, was zu ändern ist.

Gehe zu app / code / core / Mage / Checkout / controller / OnepageController.php

Lokalisieren:

 public function saveMethodAction()
{
    if ($this->_expireAjax()) {
        return;
    }

    if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }

Kommentieren Sie die Zeile mit / * * / tags aus.

 public function saveMethodAction()
{
    if ($this->_expireAjax()) {
        return;
    }

    /*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }*/
Symbol
quelle
2
Das ist falsch, Sie kommentieren den Patch aus, der hinzugefügt wurde. Soweit mir dieser Patch bekannt ist, sollte form keystattdessen die Anfrage von js gesendet werden . Wir sollten diesen Fehler (Patch) dem Magento-Kernteam melden.
Adarsh ​​Khatri
@AdarshKhatri Das mag falsch sein, aber es funktioniert! und ja, das magento team sollte sich jetzt bewusst sein. Senden Sie ihnen eine doppelte Nachricht, wenn Sie können.
Icon
2
@AdarshKhatri Ich stimme dir zu. Das Kommentieren dieser beiden Zeilen behebt das Problem, entfernt jedoch auch das Patch-Ziel. Ich habe das gleiche Problem und kann es im Moment nicht richtig beheben ...
DarkCowboy
Anstatt das auszukommentieren, können isFormkeyValidationOnCheckoutEnabled()Sie die Einstellung im Admin einfach deaktivieren. Die beste Lösung ist jedoch Raphaels: magento.stackexchange.com/a/177125/2671
DanCarlyon
@DanCarlyon Was auch immer Raphael getan hat, es ist großartige Arbeit. Ich habe gerade Anweisungen für die von Peter vorgeschlagene kurzfristige Fehlerbehebung gegeben, Tage bevor Magento ein Problem erkannt hat. Ich bin damit einverstanden, dass es sich nicht um die ideale Lösung handelt, sondern um eine Lösung, die nur das Deaktivieren von Formularschlüsseln aus dem Back-End betrifft.
Icon
1

Ein guter Ausgangspunkt:

Sicherheitspatch SUPEE-9767 - Mögliche Probleme?

Sie müssen Ihre Vorlagendateien aktualisieren. Bitte beachte, dass es nur ein paar Stunden nach Veröffentlichung dieses Patches sind und wir uns im Moment mit dem befassen müssen, was öffentlich ist. Ich bin mir ziemlich sicher, dass die Dinge in den nächsten Tagen geklärt werden.

EDIT: Vielen Dank für die Abstimmung! Es tut mir leid, dass ich innerhalb von 8 Stunden nach Veröffentlichung dieses Patches keine Lösung geben kann.

ADDISON74
quelle
3
Ja, ich habe alle Vorlagendateien in der Installation durchgesehen, in denen ich das Problem festgestellt habe. Ich habe die Frage oben aktualisiert - bei einer Test-Vanilla-Installation von Magento 1.9.3.3 ohne Änderungen habe ich anscheinend das gleiche Problem. Bei der Installation von Test 1.9.2.4 wurde ebenfalls das Standardpaket / -thema (frisch, unverändert) verwendet.
RickyMage123
Ich habe es mit 1.7.0.2 versucht und das Gleiche gilt, Kunden werden nie registriert, wenn Forms-Schlüssel aktiviert sind.
Icon
1
Ich werde einige Untersuchungen durchführen, um 1.9.2.4 mit 1.9.3.3 zu vergleichen und die Unterschiede herauszufinden. Ich habe 1.9.3.3 noch nicht von Grund auf installiert. Ich werde den Bericht in dem oben genannten Link veröffentlichen.
ADDISON74
2
Wird aktualisiert, wenn ich das Problem finde; haben einen Fehlerbericht bei Magento veröffentlicht, da dies ein Problem mit einer nicht modifizierten 1.9.3.3-Installation zu sein scheint.
RickyMage123
1
Dieser Bug Tracker bei Magento ist nicht die Art zu melden, er ist nutzlos. Ich habe es vor vielen Jahren getan und Lösungen angegeben, und nichts hat sich am Code geändert. Niemand hört dort zu, aber sie hören in Magento 2! Immer fand ich Lösungen an anderen Orten als auf der Magento-Website. Ich rate Ihnen, einige Tests durchzuführen, bevor Sie Ihre Produktions-Websites aktualisieren. Ich denke, mit den neuen Ausgaben werden wir früher ein neues Update sehen, als wir denken. Das gleiche passierte zwischen 1.9.3.0 und 1.9.3.1.
ADDISON74
1

Danke für den Patch @ Raphael bei Digital Pianism.

Der Einfachheit halber habe ich ein Diff erstellt, damit Sie den Patch schnell anwenden können.

 skin/frontend/base/default/js/opcheckout.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/skin/frontend/base/default/js/opcheckout.js b/skin/frontend/base/default/js/opcheckout.js
index 8935793af..9ccbe61a9 100644
--- a/skin/frontend/base/default/js/opcheckout.js
+++ b/skin/frontend/base/default/js/opcheckout.js
@@ -165,20 +165,21 @@ Checkout.prototype = {
     },

     setMethod: function(){
+        var formKey = $('checkout-step-login').select('[name=form_key]')[0].value;
         if ($('login:guest') && $('login:guest').checked) {
             this.method = 'guest';
-            var request = new Ajax.Request(
+            new Ajax.Request(
                 this.saveMethodUrl,
-                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest'}}
+                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest', form_key:formKey}}
             );
             Element.hide('register-customer-password');
             this.gotoSection('billing', true);
         }
         else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
             this.method = 'register';
-            var request = new Ajax.Request(
+            new Ajax.Request(
                 this.saveMethodUrl,
-                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register'}}
+                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register', form_key:formKey}}
             );
             Element.show('register-customer-password');
             this.gotoSection('billing', true);
Brainski
quelle
1

Version 2 des SUPEE-9767-Patches wurde heute zusammen mit Magento CE 1.9.3.4 veröffentlicht . V2 behebt eine Reihe von Problemen, einschließlich dieses Fehlers bei der Checkout-Registrierung.

Sie können auf die neueste Version (1.9.3.4) aktualisieren oder V1 wiederherstellen und dann V2 des Patches anwenden. Beide Optionen lösen das Problem.

Die offizielle Änderung in V2 ist praktisch die gleiche wie die von Peter O'Callaghan beschriebene, wobei die drei hinzugefügten Zeilen entfernt werden Mage_Checkout_OnepageController::saveMethodAction.

Ryan Hoerr
quelle