Patch SUPEE-9767 / CE 1.9.3.3 - Pagamento em uma página - Problema no registro do cliente

19

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
fonte

Respostas:

36

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:

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
Agradável. Eu estava com preguiça de elaborar o protótipo para encontrar um campo de entrada apropriado.
Peter O'Callaghan
@ PeterO'Callaghan sim, protótipo é doloroso para trabalhar quando você está acostumado com jQuery ^^
Raphael no Digital Pianism
1
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?
Arjen Miedema
1
@ paj obrigado por me avisar. Implementado por vários lojas agora, sem problemas
Arjen Miedema
1
@RaphaelatDigitalPianism: Eu tentei do seu jeito, mas isso não me ajudou, alguma ideia?
Anurag Khandelwal
15

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:

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

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.

Peter O'Callaghan
fonte
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.
Icon
2
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.
Peter O'Callaghan
2
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
Jeroen
1
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.
precisa saber é o seguinte
3

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:

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

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

Comente a linha com / * * / tags.

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

    /*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }*/
Ícone
fonte
2
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.
Adarsh ​​Khatri
@AdarshKhatri Isso pode estar errado, mas funciona! e Sim, a equipe do Magento deve estar ciente até agora. Envie uma mensagem dupla se puder.
Icon
2
@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.
Icon
1

Um 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.

ADDISON74
fonte
3
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).
RickyMage123
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.
Icon
1
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.
ADDISON74
2
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.
precisa saber é o seguinte
1
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.
ADDISON74
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 +++++----
 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
fonte
1

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.

Ryan Hoerr
fonte