Ok, oto prawdziwa poprawka, którą wymyśliłem.
Edytuj /skin/frontend/base/default/js/opcheckout.js
i 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
Po wybraniu opcji Zarejestruj się i kontynuuj, wywołania skryptu JS
checkout.setMethod()
, które znajdują się wskin/frontend/base/default/js/opcheckout.js
. Stamtąd widzimy, że wysyła żądanie AJAX POSTthis.saveMethodUrl
, ale jedyny przekazywany parametr tomethod
. Jeśli spojrzymy naMage_Checkout_OnepageController::saveMethodAction
, który jest celem tego żądania AJAX, możemy zobaczyć, że poprawka została dodana:Ponieważ
_validateFormKey
szukaform_key
parametru 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óć dosetMethod
funkcji 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
setMethod
pobranie klucza form_ ze strony i wysłanie go wraz z żądaniem AJAX.źródło
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.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ź:
Skomentuj wiersz za pomocą tagów / * * /.
źródło
form key
zamiast tego należy wysłać żądanie js . Powinniśmy zgłosić tę usterkę (łatkę) zespołowi podstawowemu magento.isFormkeyValidationOnCheckoutEnabled()
możesz po prostu wyłączyć ustawienie w adminie,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.
źródło
Dzięki za łatkę @ Raphael w Digital Pianism.
Dla wygody stworzyłem diff, abyś mógł szybko zastosować łatkę.
źródło
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
.źródło