Patch SUPEE-9767 / CE 1.9.3.3 - Pagamento em uma página - Problema no registro do cliente
Em uma instalação limpa e simples do Magento 1.9.2.4, corrigida com SUPEE-8788, SUPEE-9652 e SUPEE-9767, e com a nova configuração 'Ativar validação de chave de formulário no checkout' ativada, após uma nova verificação bem-sucedida de registro de cliente em o check-out de uma página padrão, nenhum novo cliente é criado e o cliente não está logado, embora o pedido seja aprovado.
Desativar a configuração 'Ativar validação de chave de formulário no check-out' faz com que isso funcione novamente. Alguém mais teve esse problema? Não parece importar quais métodos de envio / pagamento são usados.
Desde então, tentei isso com uma instalação nova e inalterada do Magento 1.9.3.3 e parece ter o mesmo problema. Ao registrar um novo cliente através do checkout de uma página, nenhum cliente é criado, mesmo que o pedido seja processado corretamente, desde que a configuração 'Ativar validação de chave de formulário no checkout' esteja ativada.
— RickyMage123
Ok, aqui está a verdadeira correção de bug que eu criei.
Edite /skin/frontend/base/default/js/opcheckout.jse edite o setMethod()método substituindo:
this.gotoSection('billing', true);
alert(Translator.translate('Please choose to register or to checkout as a guest').stripTags());
document.body.fire('login:setMethod', {method : this.method});
var formKey = $('checkout-step-login').select('[name=form_key]')[0].value;
{method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest', form_key:formKey}}
{method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register', form_key:formKey}}
Isso será feito enquanto aguardamos a v2 do patch
Agradável. Eu estava com preguiça de elaborar o protótipo para encontrar um campo de entrada apropriado.
@ PeterO'Callaghan sim, protótipo é doloroso para trabalhar quando você está acostumado com jQuery ^^
O que acontece quando você não tem nenhum elemento com o nome "form_key" no seu checkout neste momento? Quão grandes são as chances de isso ocorrer?
@ paj obrigado por me avisar. Implementado por vários lojas agora, sem problemas
@RaphaelatDigitalPianism: Eu tentei do seu jeito, mas isso não me ajudou, alguma ideia?
— Anurag Khandelwal
Quando você seleciona registrar e continua, o script JS chama checkout.setMethod(), localizado em skin/frontend/base/default/js/opcheckout.js. A partir daí, podemos ver que ele faz uma solicitação AJAX POST this.saveMethodUrl, mas o único parâmetro que ele passa é method. Se olharmos para Mage_Checkout_OnepageController::saveMethodActionqual é o alvo dessa solicitação AJAX, podemos ver que o patch foi adicionado:
Como _validateFormKeyprocura um form_keyparâmetro na solicitação, e como a setMethodsolicitação JS não enviou isso quando fez a solicitação AJAX, simplesmente retornou mais cedo e não fez nada. De volta à setMethodfunçã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, assim checkout_methodcomo 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ê setMethoddeve pegar o form_key da página e enviá-lo com a solicitação AJAX.
Você poderia, por favor, fornecer o caminho onde podemos encontrar: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
— Ícone
skin / frontend / base / default / js / opcheckout.js não contém essa função.
O snippet de código que verifica a form_key é de 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.
Ou até o patch v2, basta desativar a configuração Sistema / Configuração / Admin -> Segurança -> "Ativar validação de chave de formulário no checkout" para 0 Isso trará um aviso, mas após o patch v2 podemos reativá-lo
Obrigado por aprofundar um pouco, Peter. Espero que alguém do Magento pegue isso ou observe o relatório de erros e obteremos 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
Comente a linha com / * * / tags.
/*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
Isso está errado, você está comentando o patch que foi adicionado. Tanto quanto eu estou ciente desse patch, a solicitação js deve ser enviada form key. Devemos relatar esta falha (patch) para a equipe principal do magento.
@AdarshKhatri Isso pode estar errado, mas funciona! e Sim, a equipe do Magento deve estar ciente até agora. Envie uma mensagem dupla se puder.
@AdarshKhatri Concordo com você. Comentar essas duas linhas remove o problema, mas também remove a meta do patch. Eu tenho o mesmo problema e não consegue entender como corrigi-lo adequadamente para o momento ...
— DarkCowboy
Ao invés de comentar a isFormkeyValidationOnCheckoutEnabled()você poderia simplesmente desativar a configuração no admin no entanto, a melhor solução é Raphaels: magento.stackexchange.com/a/177125/2671
— DanCarlyon
@ DanCarlyon O que sempre Raphael fez é um ótimo trabalho. Acabei de fornecer instruções para a correção de curto prazo sugerida por Peter, dias antes de Magento reconhecer que há um problema. Concordo que não é a solução ideal, mas sim uma correção, assim como desabilitar as teclas de formulário do back-end.
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.
— ADDISON74
Sim, analisei todos os arquivos de modelo na instalação onde localizei o problema. Atualizei a pergunta acima - em uma instalação de teste de baunilha do Magento 1.9.3.3 sem modificações, parece que estou tendo o mesmo problema. A instalação do teste 1.9.2.4 também estava usando o pacote / tema padrão (novo, não modificado).
Eu tentei com 1.7.0.2 e a mesma coisa, os clientes nunca são registrados quando as chaves de formulários estão ativadas.
Vou fazer algumas investigações comparando 1.9.2.4 com 1.9.3.3 e ver quais são as diferenças. Ainda não instalei do zero 1.9.3.3. Vou postar o relatório no link mencionado acima.
Será atualizado se eu encontrar o problema; criaram um relatório de bug no Magento, pois isso parece ser um problema com uma instalação 1.9.3.3 não modificada.
Esse bug tracker no Magento não é o caminho para reportar, é inútil. Fiz isso antes de muitos anos, dando soluções, e nada foi alterado no código. Ninguém está ouvindo lá, mas eles ouvem no Magento 2! Sempre encontrei soluções em outros lugares que não o site Magento. Meu conselho é fazer alguns testes antes de atualizar os sites de produção. Com os novos problemas, acho que veremos uma nova atualização mais cedo do que pensamos. O mesmo aconteceu entre 1.9.3.0 e 1.9.3.1.
Obrigado pelo patch @ Raphael no Digital Pianism.
Por conveniência, criei um diff para que você possa aplicar rapidamente o patch.
skin/frontend/base/default/js/opcheckout.js | 9 +++++----
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 = {
+        var formKey = $('checkout-step-login').select('[name=form_key]')[0].value;
-            var request = new Ajax.Request(
+            new Ajax.Request(
-                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest'}}
+                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest', form_key:formKey}}
-                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register'}}
+                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register', form_key:formKey}}
— Brainski
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.