SUPEE-9767 Patch / CE 1.9.3.3 - Zamówienie jednej strony - Problem z rejestracją klienta

19

W czystej, waniliowej instalacji Magento 1.9.2.4, z poprawkami SUPEE-8788, SUPEE-9652 i SUPEE-9767 oraz z włączonym nowym ustawieniem „Włącz sprawdzanie poprawności klucza formularza przy kasie ”, po pomyślnym zakończeniu rejestracji nowego klienta na domyślna kasa z jedną stroną, żaden nowy klient nie jest tworzony i klient nie jest zalogowany, chociaż zamówienie jest prawidłowe.

Wyłączenie ustawienia „Włącz sprawdzanie poprawności klucza formularza przy kasie” powoduje, że działa to ponownie. Czy ktoś jeszcze miał ten problem? Wydaje się, że nie ma znaczenia, jakie metody wysyłki / płatności są używane.

Od tego czasu próbowałem tego ze świeżą, niezmienioną instalacją Magento 1.9.3.3 i wydaje się, że ma ten sam problem. Podczas rejestrowania nowego klienta przy kasie jednostronicowej żaden klient nie jest tworzony, nawet jeśli zamówienie przechodzi prawidłowo, o ile włączone jest ustawienie „Włącz sprawdzanie klucza formularza przy kasie”.

RickyMage123
źródło

Odpowiedzi:

36

Ok, oto prawdziwa poprawka, którą wymyśliłem.

Edytuj /skin/frontend/base/default/js/opcheckout.jsi edytuj setMethod()metodę, zastępując:

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});
},

Z:

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});
},

To zrobi, gdy będziemy czekać na wersję v2 łatki

Raphael at Digital Pianism
źródło
Ładny. Byłem zbyt leniwy, aby opracować prototyp, aby znaleźć odpowiednie pole wejściowe.
Peter O'Callaghan
@ PeterO'Callaghan tak prototyp jest bolesny w pracy, gdy jesteś przyzwyczajony do jQuery ^^
Raphael at Digital Pianism
1
Co się stanie, gdy nie będziesz mieć w tym momencie elementu o nazwie „form_key” w kasie? Jak duże są szanse, które się pojawią?
Arjen Miedema
1
@paj dzięki za poinformowanie mnie. Wdrożono go dla kilku sklepów teraz bez problemów
Arjen Miedema
1
@RaphaelatDigitalPianism: Próbowałem swoich sił, ale to nie pomogło mi, jakiś pomysł?
Anurag Khandelwal
15

Po wybraniu opcji Zarejestruj się i kontynuuj, wywołania skryptu JS checkout.setMethod(), które znajdują się w skin/frontend/base/default/js/opcheckout.js. Stamtąd widzimy, że wysyła żądanie AJAX POST this.saveMethodUrl, ale jedyny przekazywany parametr to method. Jeśli spojrzymy na Mage_Checkout_OnepageController::saveMethodAction, który jest celem tego żądania AJAX, możemy zobaczyć, że poprawka została dodana:

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

Ponieważ _validateFormKeyszuka form_keyparametru w żądaniu, a ponieważ setMethodżądanie JS nie wysłało tego, gdy wykonało żądanie AJAX, po prostu wraca wcześnie i nic nie robi. Wróć do setMethodfunkcji i widzimy, że ponieważ nie próbuje nic zrobić z wartością zwracaną, nic innego się nie dzieje i JS kontynuuje działanie. W tym momencie JS ustawił, this.method = 'register'ale cytat nie został zaktualizowany, więccheckout_method jak domyślny „gość”.

Ponieważ JS zna rejestr wybrany przez klienta, wyświetla pola hasła, więc na pierwszy rzut oka wygląda na to, że się rejestrujesz. Ale jeśli chodzi o stronę PHP, jest to kasa gościa, więc nie tworzy klienta po jej zakończeniu.

Edycja: najprostszym rozwiązaniem jest skomentowanie tych trzech wierszy z saveMethodAction. Bardziej poprawnym / złożonym rozwiązaniem jest setMethodpobranie klucza form_ ze strony i wysłanie go wraz z żądaniem AJAX.

Peter O'Callaghan
źródło
Czy możesz podać ścieżkę, w której możemy znaleźć: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon
skin / frontend / base / default / js / opcheckout.js nie zawiera tej funkcji.
Ikona
2
Fragment kodu sprawdzający klucz form_ pochodzi z app/code/core/Mage/Checkout/controllers/OnepageController.php. Jest to spowodowane tym, że JS nie wysyła żądania form_key. Jest to błąd związany z łatką. Podejrzewam, że będzie musiał być v2.
Peter O'Callaghan
2
Lub do łaty v2, po prostu wyłącz System / Konfiguracja / Administrator -> Bezpieczeństwo -> „Włącz sprawdzanie poprawności klucza formularza przy kasie” na 0 Spowoduje to powiadomienie, ale po łatce v2 możemy ją ponownie włączyć
Jeroen
1
Dzięki za głębsze kopanie, Peter. Mam nadzieję, że ktoś z Magento to zauważy lub zauważy raport o błędzie i otrzymamy v2.
RickyMage123
3

Pełne podziękowania dla Peter za rozwiązanie! Chciałbym wskazać instrukcje krok po kroku, co zmienić.

Przejdź do app / code / core / Mage / Checkout / controllers / OnepageController.php

Znajdź:

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

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

Skomentuj wiersz za pomocą tagów / * * /.

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

    /*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }*/
Ikona
źródło
2
To źle, komentujesz ten, który dodała łatka. O ile wiem o tej łatce, form keyzamiast tego należy wysłać żądanie js . Powinniśmy zgłosić tę usterkę (łatkę) zespołowi podstawowemu magento.
Adarsh ​​Khatri
@AdarshKhatri To może być źle, ale działa! i tak, zespół magento powinien być już tego świadomy. Wyślij im wiadomość, jeśli możesz.
Ikona
2
@AdarshKhatri Zgadzam się z tobą. Komentowanie tych 2 wierszy usuwa problem, ale usuwa również cel poprawki. Mam ten sam problem i na razie nie mogę zrozumieć, jak to naprawić ...
DarkCowboy
Zamiast komentować, isFormkeyValidationOnCheckoutEnabled()możesz po prostu wyłączyć ustawienie w adminie,
DanCarlyon
@DanCarlyon To, co Raphael zrobił, to świetna robota. Właśnie dostarczyłem instrukcję dotyczącą krótkoterminowej poprawki zaproponowanej przez Petera, na kilka dni zanim Magento uznał, że jest problem. Zgadzam się, że nie jest to idealne rozwiązanie, ale raczej poprawka, podobnie jak wyłączenie klawiszy formularzy z zaplecza.
Ikona
1

Warto zacząć:

Poprawka bezpieczeństwa SUPEE-9767 - Możliwe problemy?

Musisz zaktualizować pliki szablonów. Pamiętaj, że jest tylko kilka godzin od wydania tej łatki i na razie musimy poradzić sobie z tym, co jest publiczne. Jestem całkiem pewien, że w ciągu najbliższych dni wszystko się wyjaśni.

EDYCJA: Dziękujemy za głosowanie w dół! Przykro mi, że nie mogę rozwiązać problemu w ciągu 8 godzin od opublikowania tej poprawki.

ADDISON74
źródło
3
Tak, przejrzałem wszystkie pliki szablonów podczas instalacji, w których zauważyłem problem. Zaktualizowałem powyższe pytanie - na testowej waniliowej instalacji Magento 1.9.3.3 bez modyfikacji wydaje mi się, że mam ten sam problem. Testowa instalacja 1.9.2.4 również używała domyślnego (świeżego, niezmodyfikowanego) pakietu / motywu.
RickyMage123
Próbowałem z wersją 1.7.0.2 i to samo, klienci nigdy się nie rejestrują, gdy klucze formularzy są włączone.
Ikona
1
Zrobię kilka badań porównujących 1.9.2.4 z 1.9.3.3 i zobaczę, jakie są różnice. Nie instalowałem jeszcze od podstaw 1.9.3.3. Raport opublikuję we wspomnianym powyżej linku.
ADDISON74
2
Zaktualizuje się, jeśli znajdę problem; zgłosił błąd w Magento, ponieważ wydaje się, że jest to problem z niezmodyfikowaną instalacją 1.9.3.3.
RickyMage123
1
Śledzenie błędów w Magento nie jest sposobem na zgłaszanie, jest bezużyteczne. Robiłem to przez wiele lat, dając rozwiązania i nic nie zmieniło się w kodzie. Nikt tam nie słucha, ale słuchają w Magento 2! Zawsze znajdowałem rozwiązania w miejscach innych niż strona Magento. Radzę zrobić kilka testów przed aktualizacją stron produkcyjnych. Z nowymi problemami myślę, że zobaczymy nową aktualizację wcześniej niż nam się wydaje. To samo wydarzyło się między 1.9.3.0 a 1.9.3.1.
ADDISON74
1

Dzięki za łatkę @ Raphael w Digital Pianism.

Dla wygody stworzyłem diff, abyś mógł szybko zastosować łatkę.

 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
źródło
1

Wersja 2 poprawki SUPEE-9767 została wydana wcześniej, wraz z Magento CE 1.9.3.4 . Wersja 2 rozwiązuje wiele problemów, w tym błąd rejestracji w kasie.

Możesz zaktualizować do najnowszej wersji (1.9.3.4) lub przywrócić V1, a następnie zastosować V2 poprawki. Każda z opcji rozwiąże problem.

Oficjalna zmiana w V2 jest faktycznie taka sama, jak opisał Peter O'Callaghan, usuwając trzy dodane linie Mage_Checkout_OnepageController::saveMethodAction.

Ryan Hoerr
źródło