Ok, aqui está a verdadeira correção de bug que eu criei.
Edite /skin/frontend/base/default/js/opcheckout.js
e edite o setMethod()
método substituindo:
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});
},
Com:
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});
},
Isso será feito enquanto aguardamos a v2 do patch
Raphael na Digital Pianism
fonte
Quando você seleciona registrar e continua, o script JS chama
checkout.setMethod()
, localizado emskin/frontend/base/default/js/opcheckout.js
. A partir daí, podemos ver que ele faz uma solicitação AJAX POSTthis.saveMethodUrl
, mas o único parâmetro que ele passa émethod
. Se olharmos paraMage_Checkout_OnepageController::saveMethodAction
qual é o alvo dessa solicitação AJAX, podemos ver que o patch foi adicionado:Como
_validateFormKey
procura umform_key
parâmetro na solicitação, e como asetMethod
solicitação JS não enviou isso quando fez a solicitação AJAX, simplesmente retornou mais cedo e não fez nada. De volta àsetMethod
função e podemos ver que, como ela não tenta fazer nada com um valor de retorno, nada mais acontece e o JS continua. Nesse ponto, o JS definiu,this.method = 'register'
mas a cotação não foi atualizada, assimcheckout_method
como o 'convidado' padrão.Como o JS conhece o registro selecionado pelo cliente, ele exibe os campos de senha; portanto, parece que você está se registrando. Mas, no que diz respeito ao lado do PHP, é um checkout de convidado, portanto não cria o cliente quando o checkout é concluído.
Editar: a correção mais simples é comentar essas três linhas de saveMethodAction. A solução mais correta / complexa é que você
setMethod
deve pegar o form_key da página e enviá-lo com a solicitação AJAX.fonte
app/code/core/Mage/Checkout/controllers/OnepageController.php
. É causado pelo JS fazendo a solicitação não enviar a form_key. É um bug com o patch. Eu suspeito que terá que haver uma v2.Os créditos completos vão para Peter para a solução! Gostaria de apontar instruções passo a passo o que mudar.
Acesse app / code / core / Mage / Checkout / controllers / OnepageController.php
Localizar:
Comente a linha com / * * / tags.
fonte
form key
. Devemos relatar esta falha (patch) para a equipe principal do magento.isFormkeyValidationOnCheckoutEnabled()
você poderia simplesmente desativar a configuração no admin no entanto, a melhor solução é Raphaels: magento.stackexchange.com/a/177125/2671Um bom ponto de partida:
Patch de segurança SUPEE-9767 - Possíveis problemas?
Você precisa atualizar seus arquivos de modelo. Observe que há apenas algumas horas desde o lançamento deste patch e, no momento, temos que lidar com o que é público. Tenho certeza de que nos próximos dias as coisas serão esclarecidas.
EDIT: Obrigado por votar! Lamento não poder dar uma solução em 8 horas após o lançamento deste patch.
fonte
Obrigado pelo patch @ Raphael no Digital Pianism.
Por conveniência, criei um diff para que você possa aplicar rapidamente o patch.
fonte
A versão 2 do patch SUPEE-9767 foi lançada hoje hoje, junto com o Magento CE 1.9.3.4 . A V2 corrige uma série de problemas, incluindo este bug de registro do checkout.
Você pode atualizar para a versão mais recente (1.9.3.4) ou reverter a V1 e aplicar a V2 do patch. Qualquer uma das opções resolverá o problema.
A mudança oficial na V2 é efetivamente a mesma que Peter O'Callaghan descreveu, removendo as três linhas adicionadas a
Mage_Checkout_OnepageController::saveMethodAction
.fonte