SUPEE-9767 Patch / CE 1.9.3.3 - Pagamento in una pagina - Problema di registrazione del cliente


19

Su un'installazione pulita e vanigliata di Magento 1.9.2.4, patchata con SUPEE-8788, SUPEE-9652 e SUPEE-9767 e con la nuova impostazione 'Abilita convalida chiave modulo al checkout' attivata, in seguito a una verifica della registrazione di un nuovo cliente riuscita su il Pagamento di una pagina predefinito, nessun nuovo cliente viene creato e il cliente non ha effettuato l'accesso, sebbene l'ordine sia andato a buon fine.

Disattivando l'impostazione "Abilita convalida chiave modulo al checkout", questo funziona nuovamente. Qualcun altro ha avuto questo problema? Non sembra importare quali sono i metodi di spedizione / pagamento utilizzati.

Da allora l'ho provato con un'installazione fresca e inalterata di Magento 1.9.3.3 e sembra avere lo stesso problema. Quando si registra un nuovo cliente tramite il checkout di una pagina, nessun cliente viene creato anche se l'ordine va a buon fine, purché l'impostazione "Abilita convalida chiave modulo al checkout" sia attivata.

Risposte:


36

Ok ecco la vera correzione di bug che mi è venuta in mente.

Modifica /skin/frontend/base/default/js/opcheckout.jse modifica il setMethod()metodo sostituendo:

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});
},

Con:

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});
},

Lo farà mentre stiamo aspettando il v2 della patch


Bello. Ero troppo pigro per elaborare il prototipo per trovare un campo di input appropriato.
Peter O'Callaghan,

@ PeterO'Callaghan sì, il prototipo è doloroso quando si è abituati a jQuery ^^
Raphael al Digital Pianism,

1
Cosa succede quando non hai elementi con il nome "form_key" nel tuo checkout a questo punto? Quanto sono grandi le probabilità che si verifichino?
Arjen Miedema,

1
@paj grazie per avermelo fatto notare. Implementato per diversi negozi ora senza problemi
Arjen Miedema il

1
@RaphaelatDigitalPianism: ho provato la tua strada ma questo non mi ha aiutato, qualche idea?
Anurag Khandelwal,

15

Quando si seleziona registra e si continua, lo script JS chiama checkout.setMethod(), che si trova in skin/frontend/base/default/js/opcheckout.js. Da lì possiamo vedere che fa una richiesta POST AJAX this.saveMethodUrl, ma l'unico parametro che passa è method. Se guardiamo Mage_Checkout_OnepageController::saveMethodAction, che è l'obiettivo di quella richiesta AJAX, possiamo vedere che la patch ha aggiunto:

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

Poiché _validateFormKeycerca un form_keyparametro nella richiesta e poiché la setMethodrichiesta JS non ha inviato questo quando ha effettuato la richiesta AJAX, sta semplicemente tornando in anticipo e non sta facendo nulla. Torniamo alla setMethodfunzione e possiamo vedere che dal momento che non tenta di fare nulla con un valore di ritorno, non succede nient'altro e JS continua. A questo punto il JS è stato impostato this.method = 'register'ma il preventivo non è stato aggiornato, quindi checkout_methodè 'guest' predefinito.

Poiché JS conosce il registro selezionato dal cliente, visualizza i campi della password, quindi a prima vista sembra che tu stia registrando. Ma per quanto riguarda il lato PHP, è un checkout per gli ospiti, quindi non crea il cliente quando il checkout è completo.

Modifica: la soluzione più semplice è commentare quelle tre righe da saveMethodAction. La soluzione più corretta / complessa è quella di setMethodprendere il form_key dalla pagina e inviarlo con la richiesta AJAX.


Potresti fornire il percorso in cui possiamo trovare: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon

skin / frontend / base / default / js / opcheckout.js non contiene quella funzione.
Icona

2
Lo snippet di codice che controlla il form_key proviene da app/code/core/Mage/Checkout/controllers/OnepageController.php. È causato dal fatto che JS non ha inviato il form_key alla richiesta. È un bug con la patch. Ho il sospetto che ci dovrà essere un v2.
Peter O'Callaghan,

2
O fino alla patch v2, basta disabilitare l'impostazione Sistema / Configurazione / Ammin. -> Sicurezza -> "Abilita convalida chiave modulo al checkout" su 0 Questo porterà un avviso, ma dopo la patch v2 possiamo riattivarlo
Jeroen

1
Grazie per scavare un po 'più a fondo, Peter. Spero che qualcuno di Magento lo raccolga o noti la segnalazione di bug e otterremo un v2.
RickyMage123,

3

Tutti i crediti vanno a Peter per la soluzione! Vorrei sottolineare passo dopo passo le istruzioni su cosa cambiare.

Vai su app / code / core / Mage / Checkout / controller / OnepageController.php

Individuare:

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

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

Commenta la riga con / * * / tag.

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

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

2
Questo è sbagliato, stai commentando quello che la patch ha aggiunto. Per quanto ne so di questa patch, dovrebbe form keyinvece essere inviata la richiesta js . Dovremmo segnalare questo errore (patch) al core team di magento.
Adarsh ​​Khatri,

@AdarshKhatri Questo potrebbe essere sbagliato ma funziona! e sì, ormai il team di magento dovrebbe esserne consapevole. Doppio messaggio se puoi.
Icona

2
@AdarshKhatri Sono d'accordo con te. Commentare queste 2 righe rimuove il problema, ma rimuove anche l'obiettivo della patch. Ho lo stesso problema e non riesco a capire come risolverlo correttamente per il momento ...
DarkCowboy

Invece di commentare, isFormkeyValidationOnCheckoutEnabled()potresti semplicemente disabilitare l'impostazione nell'amministratore,
DanCarlyon

@DanCarlyon Quello che mai Raphael ha fatto è un ottimo lavoro. Ho appena fornito istruzioni per la correzione a breve termine suggerita da Peter, giorni prima che Magento riconoscesse che c'era un problema. Sono d'accordo che non è la soluzione ideale, ma piuttosto una soluzione altrettanto disabilitante i form-key dal back-end.
Icona

1

Un buon punto di partenza:

Patch di sicurezza SUPEE-9767 - Possibili problemi?

Devi aggiornare i tuoi file modello. Si noti che mancano poche ore al rilascio di questa patch e per il momento dobbiamo occuparci di ciò che è pubblico. Sono abbastanza sicuro che nei prossimi giorni le cose verranno chiarite.

EDIT: Grazie per il voto negativo! Mi dispiace non poter dare una soluzione entro 8 ore dal rilascio di questa patch.


3
Sì, ho esaminato tutti i file modello nell'installazione in cui ho riscontrato il problema. Ho aggiornato la domanda sopra: su un'installazione di prova di vaniglia di Magento 1.9.3.3 senza modifiche, sembra che abbia lo stesso problema. L'installazione del test 1.9.2.4 utilizzava anche il pacchetto / tema predefinito (nuovo, non modificato).
RickyMage123

Ho provato con 1.7.0.2 e la stessa cosa, i clienti non si registrano mai quando le chiavi dei moduli sono abilitate.
Icona

1
Farò alcune indagini confrontando 1.9.2.4 con 1.9.3.3 e vedremo quali sono le differenze. Non ho ancora installato da zero 1.9.3.3. Pubblicherò la relazione nel link sopra menzionato.
ADDISON74

2
Si aggiornerà se trovo il problema; ha sollevato una segnalazione di bug in Magento poiché questo sembra essere un problema con un'installazione 1.9.3.3 non modificata.
RickyMage123

1
Quel bug tracker di Magento non è il modo di segnalarlo, è inutile. L'ho fatto prima di molti anni, fornendo soluzioni e nulla è stato modificato nel codice. Nessuno ci sta ascoltando, ma ascoltano in Magento 2! Ho sempre trovato soluzioni in luoghi diversi dal sito Web Magento. Il mio consiglio è di fare alcuni test prima di aggiornare i siti Web di produzione. Con i nuovi problemi penso che vedremo un nuovo aggiornamento prima di quanto pensiamo. La stessa cosa è successa tra 1.9.3.0 e 1.9.3.1.
ADDISON74

1

Grazie per la patch @ Raphael al Digital Pianism.

Per comodità, ho creato un diff in modo da poter applicare rapidamente la 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);

1

La versione 2 della patch SUPEE-9767 è stata rilasciata prima di oggi, insieme a Magento CE 1.9.3.4 . V2 risolve una serie di problemi, incluso questo bug di registrazione del checkout.

È possibile eseguire l'aggiornamento alla versione più recente (1.9.3.4) o ripristinare V1 e quindi applicare V2 della patch. Entrambe le opzioni risolveranno il problema.

La modifica ufficiale in V2 è effettivamente la stessa descritta da Peter O'Callaghan, rimuovendo le tre righe aggiunte Mage_Checkout_OnepageController::saveMethodAction.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.