SUPEE-9767 Patch / CE 1.9.3.3 - Commande d'une page - Problème d'enregistrement client


19

Sur une installation propre et vanillée de Magento 1.9.2.4, corrigée avec SUPEE-8788, SUPEE-9652 et SUPEE-9767, et avec le nouveau paramètre `` Activer la validation des clés de formulaire lors du paiement '' activé, après une vérification de l'enregistrement du nouveau client réussie sur la valeur par défaut One Page Checkout, aucun nouveau client n'est créé et le client n'est pas connecté, bien que la commande se déroule correctement.

Désactiver le paramètre «Activer la validation des clés de formulaire lors du paiement» rend ce travail à nouveau. Est-ce que quelqu'un d'autre a eu ce problème? Peu importe les méthodes d'expédition / de paiement utilisées.

J'ai depuis essayé cela avec une nouvelle installation inchangée de Magento 1.9.3.3 et il semble avoir le même problème. Lors de l'enregistrement d'un nouveau client via la validation d'une page, aucun client n'est créé même si la commande est très bien, tant que le paramètre `` Activer la validation des clés de formulaire lors de la validation '' est activé.

Réponses:


36

Ok, voici la vraie correction de bug que j'ai trouvée.

Modifiez /skin/frontend/base/default/js/opcheckout.jset modifiez la setMethod()méthode en remplaçant:

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

Avec:

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

Ça va le faire en attendant la v2 du patch


Agréable. J'étais trop paresseux pour travailler sur le prototype pour trouver un champ de saisie approprié.
Peter O'Callaghan

@ PeterO'Callaghan ouais le prototype est pénible à travailler quand on est habitué à jQuery ^^
Raphael au Digital Pianism

1
Que se passe-t-il lorsque vous n'avez aucun élément portant le nom "form_key" dans votre paiement à ce stade? Quelles sont les chances qui se produiront?
Arjen Miedema

1
@paj merci de m'avoir prévenu. Mis en œuvre pour plusieurs magasins maintenant sans aucun problème
Arjen Miedema

1
@RaphaelatDigitalPianism: J'ai essayé votre chemin mais cela ne m'a pas aidé, une idée?
Anurag Khandelwal

15

Lorsque vous sélectionnez S'inscrire et continuer, le script JS appelle checkout.setMethod(), qui se trouve dans skin/frontend/base/default/js/opcheckout.js. De là, nous pouvons voir qu'il fait une requête AJAX POST this.saveMethodUrl, mais le seul paramètre qu'il passe est method. Si nous regardons Mage_Checkout_OnepageController::saveMethodAction, qui est la cible de cette demande AJAX, nous pouvons voir que le patch a ajouté:

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

Etant donné qu'il _validateFormKeyrecherche un form_keyparamètre dans la demande et que la setMethoddemande JS ne l'a pas envoyé lors de la demande AJAX, il revient simplement tôt et ne fait rien. Revenons à la setMethodfonction et nous pouvons voir que puisqu'elle ne tente rien de faire avec une valeur de retour, rien d'autre ne se passe et le JS continue. À ce stade, le JS a été défini, this.method = 'register'mais le devis n'a pas été mis à jour, tout checkout_methodcomme l'invité par défaut.

Étant donné que le JS connaît le registre sélectionné par le client, il affiche les champs de mot de passe, donc à première vue, il semble que vous vous inscrivez. Mais en ce qui concerne le côté PHP, il s'agit d'un paiement invité, donc il ne crée pas le client lorsque le paiement est terminé.

Edit: la solution la plus simple consiste à commenter ces trois lignes de saveMethodAction. La solution la plus correcte / complexe consiste setMethodà saisir la clé form_key de la page et à l'envoyer avec la demande AJAX.


Pourriez-vous s'il vous plaît fournir le chemin où nous pouvons trouver: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon

skin / frontend / base / default / js / opcheckout.js ne contient pas cette fonction.
Icon

2
L'extrait de code vérifiant la clé form_ provient de app/code/core/Mage/Checkout/controllers/OnepageController.php. Cela est dû au fait que le JS a effectué la demande et n'a pas envoyé la clé form_key. C'est un bug avec le patch. Je soupçonne qu'il devra y avoir une v2.
Peter O'Callaghan

2
Ou jusqu'à la mise à jour v2, désactivez simplement le paramètre Système / Configuration / Admin -> Sécurité -> «Activer la validation des clés de formulaire lors du paiement» à 0. Cela apportera une notification, mais après la mise à jour v2, nous pourrons le réactiver
Jeroen

1
Merci d'avoir creusé un peu plus, Peter. Avec un peu de chance, quelqu'un de Magento s'en chargera ou remarquera le rapport de bogue et nous obtiendrons une v2.
RickyMage123

3

Les crédits complets vont à Peter pour la solution! Je voudrais souligner les instructions étape par étape à modifier.

Allez dans app / code / core / Mage / Checkout / controllers / OnepageController.php

Localiser:

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

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

Mettez la ligne en commentaire avec / * * / tags.

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

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

2
C'est faux, vous commentez celui auquel le patch a été ajouté. Pour autant que je sache ce correctif, la demande js devrait être envoyée à la form keyplace. Nous devons signaler cette erreur (correctif) à l'équipe principale de magento.
Adarsh ​​Khatri

@AdarshKhatri Cela peut être faux mais ça marche! et oui, l'équipe magento devrait être au courant maintenant. Double-les si vous le pouvez.
Icon

2
@AdarshKhatri, je suis d'accord avec vous. Commenter ces 2 lignes supprime le problème, mais supprime également l'objectif du correctif. J'ai le même problème et je ne comprends pas comment le résoudre correctement pour le moment ...
DarkCowboy

Plutôt que de commenter, isFormkeyValidationOnCheckoutEnabled()vous pouvez simplement désactiver le paramètre dans l'administrateur, mais la meilleure solution est Raphaels: magento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyon Ce que Raphael a fait est un excellent travail. Je viens de fournir des instructions pour le correctif à court terme suggéré par Peter, quelques jours avant que Magento ne reconnaisse qu'il y a un problème. Je suis d'accord n'est pas la solution idéale mais plutôt un correctif tout comme la désactivation des clés de formulaire du back-end.
Icon

1

Un bon point de départ:

Patch de sécurité SUPEE-9767 - Problèmes possibles?

Vous devez mettre à jour vos fichiers de modèle. Veuillez noter qu'il ne reste que quelques heures à compter de la sortie de ce patch et pour le moment nous devons faire face à ce qui est public. Je suis à peu près sûr que dans les prochains jours, les choses seront clarifiées.

EDIT: Merci pour votre vote négatif! Je suis désolé, je ne peux pas donner de solution dans les 8 heures suivant la sortie de ce patch.


3
Oui, j'ai parcouru tous les fichiers de modèle sur l'installation où j'ai repéré le problème. J'ai mis à jour la question ci-dessus - sur une installation de test vanilla de Magento 1.9.3.3 sans aucune modification, je semble avoir le même problème. L'installation de test 1.9.2.4 utilisait également le package / thème par défaut (frais, non modifié).
RickyMage123

J'ai essayé avec 1.7.0.2 et même chose, les clients ne sont jamais enregistrés lorsque les clés Forms sont activées.
Icon

1
Je ferai quelques recherches en comparant 1.9.2.4 avec 1.9.3.3 et voir quelles sont les différences. Je n'ai pas encore installé à partir de zéro 1.9.3.3. Je publierai le rapport dans le lien mentionné ci-dessus.
ADDISON74

2
Mettra à jour si je trouve le problème; ont soulevé un rapport de bogue chez Magento car cela semble être un problème avec une installation 1.9.3.3 non modifiée.
RickyMage123

1
Ce bug tracker chez Magento n'est pas le moyen de signaler, il est inutile. Je l'ai fait avant de nombreuses années, en donnant des solutions, et rien n'a été changé dans le code. Personne n'y écoute, mais ils écoutent dans Magento 2! J'ai toujours trouvé des solutions ailleurs que sur le site Magento. Mon conseil est de faire quelques tests avant de mettre à jour vos sites de production. Avec les nouveaux problèmes, je pense que nous verrons une nouvelle mise à jour plus tôt que nous le pensons. La même chose s'est produite entre le 1.9.3.0 et le 1.9.3.1.
ADDISON74

1

Merci pour le patch @ Raphael chez Digital Pianism.

Pour plus de commodité, j'ai créé un diff afin que vous puissiez appliquer rapidement le 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 version 2 du correctif SUPEE-9767 a été publiée plus tôt dans la journée , avec Magento CE 1.9.3.4 . V2 corrige un certain nombre de problèmes, y compris ce bogue d'enregistrement de paiement.

Vous pouvez mettre à niveau vers la dernière version (1.9.3.4), ou rétablir la V1, puis appliquer la V2 du correctif. L'une ou l'autre option résoudra le problème.

Le changement officiel dans V2 est effectivement le même que celui décrit par Peter O'Callaghan, en supprimant les trois lignes ajoutées Mage_Checkout_OnepageController::saveMethodAction.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.