Хорошо, вот настоящее исправление ошибки, которое я придумала.
Отредактируйте /skin/frontend/base/default/js/opcheckout.js
и отредактируйте setMethod()
метод, заменив:
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});
},
С:
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});
},
Это будет сделано, пока мы ждем v2 патча
Рафаэль в цифровом пианизме
источник
Когда вы выбираете зарегистрироваться и продолжить, JS-скрипт вызывает
checkout.setMethod()
, который находится вskin/frontend/base/default/js/opcheckout.js
. Оттуда мы можем видеть, что он отправляет запрос AJAX POSTthis.saveMethodUrl
, но единственный параметр, который он передает, этоmethod
. Если мы посмотримMage_Checkout_OnepageController::saveMethodAction
, что является целью этого AJAX-запроса, мы увидим, что патч добавлен:Так как
_validateFormKey
ищетform_key
параметр в запросе, и посколькуsetMethod
запрос JS не отправил его, когда он сделал запрос AJAX, он просто возвращается рано и ничего не делает. Вернемся кsetMethod
функции, и мы видим, что, поскольку она ничего не пытается сделать с возвращаемым значением, ничего не происходит, и JS продолжается. На данный момент JS настроен,this.method = 'register'
но цитата не была обновлена, такcheckout_method
что по умолчанию это «гость».Поскольку JS знает выбранный пользователем регистр, он отображает поля пароля, поэтому на первый взгляд он выглядит так, как будто вы регистрируетесь. Но что касается стороны PHP, это проверка гостя, поэтому он не создает клиента, когда проверка завершена.
Редактировать: самое простое исправление - закомментировать эти три строки из saveMethodAction. Более правильное / сложное решение заключается в том, что
setMethod
нужно взять ключ form_key со страницы и отправить его с запросом AJAX.источник
app/code/core/Mage/Checkout/controllers/OnepageController.php
. Это вызвано тем, что JS делает запрос, не отправляя ключ form_key. Это ошибка с патчем. Я подозреваю, что будет v2.Полные кредиты идут в Питер для решения! Я хотел бы указать пошаговую инструкцию, что изменить.
Перейдите в приложение / code / core / Mage / Checkout / controllers / OnepageController.php
Расположить:
Закомментируйте строку с помощью тегов / * * /.
источник
form key
вместо. Мы должны сообщить об этой ошибке (патче) основной команде magento.isFormkeyValidationOnCheckoutEnabled()
вы можете просто отключить настройку в админке, но лучшее решение - это Raphaels: magento.stackexchange.com/a/177125/2671Хорошая точка для начала:
Исправление безопасности SUPEE-9767 - Возможные проблемы?
Вам необходимо обновить файлы шаблона. Обратите внимание, что с момента выхода этого патча осталось всего несколько часов, и на данный момент мы должны разобраться с тем, что является публичным. Я уверен, что в ближайшие дни все прояснится.
РЕДАКТИРОВАТЬ: Спасибо за голосование вниз! Извините, я не могу дать решение в течение 8 часов после выпуска этого патча.
источник
Спасибо за патч @ Рафаэль в Digital Pianism.
Для удобства я создал diff, чтобы вы могли быстро применить патч.
источник
Версия 2 патча SUPEE-9767 была выпущена ранее сегодня вместе с Magento CE 1.9.3.4 . V2 исправляет ряд проблем, в том числе эту ошибку регистрации оформления заказа.
Вы можете обновить до последней версии (1.9.3.4) или вернуть V1, а затем применить V2 патча. Любой вариант решит проблему.
Официальные изменения в V2 практически такие же, как описал Питер О'Каллаган, удалив три добавленные строки
Mage_Checkout_OnepageController::saveMethodAction
.источник