SUPEE-9767 Patch / CE 1.9.3.3 - Pago de una página - Problema de registro del cliente

19

En una instalación limpia y vainilla de Magento 1.9.2.4, parcheada con SUPEE-8788, SUPEE-9652 y SUPEE-9767, y con la nueva configuración 'Habilitar validación de clave de formulario al finalizar la compra' activada, luego de un pago exitoso del registro del nuevo cliente en el pago predeterminado de una página, no se crea un nuevo cliente y el cliente no ha iniciado sesión, aunque el pedido se realiza correctamente.

Desactivar la opción 'Habilitar validación de clave de formulario al finalizar la compra' hace que esto funcione nuevamente. ¿Alguién más ha tenido este problema? No parece importar qué métodos de envío / pago se utilicen.

Desde entonces he intentado esto con una instalación nueva y sin modificaciones de Magento 1.9.3.3 y parece tener el mismo problema. Al registrar un nuevo cliente a través de la comprobación de una página, no se crea ningún cliente, incluso si el pedido se procesa correctamente, siempre que la configuración 'Habilitar validación de clave de formulario al finalizar la compra' esté activada.

RickyMage123
fuente

Respuestas:

36

Ok, aquí está la verdadera corrección de errores que se me ocurrió.

Edite /skin/frontend/base/default/js/opcheckout.jsy edite el setMethod()método reemplazando:

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

Eso lo hará mientras esperamos la v2 del parche

Raphael en Digital Pianism
fuente
Agradable. Fui demasiado vago para elaborar el prototipo para encontrar un campo de entrada apropiado.
Peter O'Callaghan
@ PeterO'Callaghan sí, el prototipo es doloroso de trabajar cuando estás acostumbrado a jQuery ^^
Raphael en Digital Pianism
1
¿Qué sucede cuando no tiene ningún elemento con el nombre "form_key" en su pago en este momento? ¿Qué tan grandes son las posibilidades de que ocurra?
Arjen Miedema
1
@paj gracias por hacérmelo saber. Lo implementé para varias tiendas ahora sin problemas
Arjen Miedema
1
@RaphaelatDigitalPianism: Intenté tu camino pero eso no me ayudó, ¿alguna idea?
Anurag Khandelwal
15

Cuando selecciona registrarse y continuar, el script JS llama checkout.setMethod(), que se encuentra en skin/frontend/base/default/js/opcheckout.js. Desde allí podemos ver que realiza una solicitud POST AJAX this.saveMethodUrl, pero el único parámetro que pasa es method. Si observamos Mage_Checkout_OnepageController::saveMethodAction, cuál es el objetivo de esa solicitud AJAX, podemos ver que el parche agregó:

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

Dado que _validateFormKeybusca un form_keyparámetro en la solicitud, y dado que la setMethodsolicitud JS no envió esto cuando realizó la solicitud AJAX, simplemente regresa temprano y no hace nada. Volviendo a la setMethodfunción y podemos ver que, dado que no intenta hacer nada con un valor de retorno, no sucede nada más y el JS continúa. En este punto, el JS se ha establecido, this.method = 'register'pero la cotización no se ha actualizado, por lo que checkout_methodes el "invitado" predeterminado.

Dado que JS conoce el registro seleccionado por el cliente, muestra los campos de contraseña, por lo que parece que se está registrando. Pero en lo que respecta al lado de PHP, es un pago de invitado, por lo que no crea el cliente cuando se completa el pago.

Editar: la solución más simple es comentar esas tres líneas de saveMethodAction. La solución más correcta / compleja es que setMethoddebería tomar la tecla form_key de la página y enviarla con la solicitud AJAX.

Peter O'Callaghan
fuente
¿Podría proporcionar la ruta donde podemos encontrar: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon
skin / frontend / base / default / js / opcheckout.js no contiene esa función.
Icono
2
El fragmento de código que comprueba form_key es de app/code/core/Mage/Checkout/controllers/OnepageController.php. Es causado por el JS que hace que la solicitud no envíe form_key. Es un error con el parche. Sospecho que tendrá que haber una v2.
Peter O'Callaghan
2
O hasta el parche v2, simplemente deshabilite la configuración Sistema / Configuración / Admin -> Seguridad -> "Habilitar validación de clave de formulario al finalizar la compra" a 0 Esto traerá un aviso, pero después del parche v2 podemos volver a habilitarlo
Jeroen
1
Gracias por profundizar un poco más, Peter. Con suerte, alguien de Magento lo recogerá o notará el informe de error y obtendremos una v2.
RickyMage123
3

¡Los créditos completos van a Peter por la solución! Me gustaría señalar instrucciones paso a paso sobre qué cambiar.

Vaya a app / code / core / Mage / Checkout / controllers / OnepageController.php

Localizar:

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

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

Comente la línea con / * * / etiquetas.

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

    /*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }*/
Icono
fuente
2
Esto está mal, estás comentando el que parche agregó. Hasta donde tengo conocimiento de este parche, js request debería enviar en su form keylugar. Deberíamos informar esta falla (parche) al equipo central de magento.
Adarsh ​​Khatri
@AdarshKhatri Esto puede estar mal pero funciona! y sí, el equipo de magento ya debería estar al tanto. Envíeles un mensaje doble si puede.
Icono
2
@AdarshKhatri Estoy de acuerdo contigo. Comentar estas 2 líneas elimina el problema, pero también elimina el objetivo del parche. Tengo el mismo problema y no puedo entender cómo solucionarlo correctamente por el momento ...
DarkCowboy
En lugar de comentar, isFormkeyValidationOnCheckoutEnabled()puede deshabilitar la configuración en el administrador, sin embargo, la mejor solución es Raphaels: magento.stackexchange.com/a/177125/2671
DanCarlyon
@DanCarlyon Lo que Raphael hizo es un gran trabajo. Acabo de proporcionar instrucciones para la solución a corto plazo sugerida por Peter, días antes de que Magento reconociera que hay un problema. Estoy de acuerdo en que no es la solución ideal, sino una solución, al igual que deshabilitar las teclas de formulario desde el back-end.
Icono
1

Un buen punto para comenzar:

Parche de seguridad SUPEE-9767 - ¿Posibles problemas?

Necesita actualizar sus archivos de plantilla. Tenga en cuenta que solo quedan unas pocas horas desde el lanzamiento de este parche y por el momento tenemos que lidiar con lo que es público. Estoy bastante seguro de que en los próximos días las cosas se aclararán.

EDITAR: ¡Gracias por votar abajo! Lamento no poder dar una solución en 8 horas desde el lanzamiento de este parche.

ADDISON74
fuente
3
Sí, revisé todos los archivos de plantilla en la instalación donde detecté el problema. He actualizado la pregunta anterior: en una instalación de prueba de Magento 1.9.3.3 sin modificaciones, parece que tengo el mismo problema. La instalación de la prueba 1.9.2.4 también usaba el paquete / tema predeterminado (nuevo, sin modificar).
RickyMage123
Intenté con 1.7.0.2 y lo mismo, los clientes nunca se registran cuando las claves de formularios están habilitadas.
Icono
1
Haré algunas investigaciones comparando 1.9.2.4 con 1.9.3.3 y veré cuáles son las diferencias. Todavía no instalé desde cero 1.9.3.3. Publicaré el informe en el enlace mencionado anteriormente.
ADDISON74
2
Se actualizará si encuentro el problema; ha generado un informe de error en Magento, ya que parece ser un problema con una instalación 1.9.3.3 no modificada.
RickyMage123
1
Ese rastreador de errores en Magento no es la forma de informar, es inútil. Lo hice antes de muchos años, dando soluciones, y nada cambió en el código. ¡Nadie está escuchando allí, pero escuchan en Magento 2! Siempre encontré soluciones en otros lugares que no sean el sitio web de Magento. Mi consejo es hacer algunas pruebas antes de actualizar sus sitios web de producción. Con los nuevos problemas, creo que veremos una nueva actualización antes de lo que pensamos. Lo mismo sucedió entre 1.9.3.0 y 1.9.3.1.
ADDISON74
1

Gracias por el parche @ Raphael en Digital Pianism.

Por conveniencia, creé un diff para que pueda aplicar rápidamente el parche.

 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
fuente
1

La versión 2 del parche SUPEE-9767 se lanzó hoy, junto con Magento CE 1.9.3.4 . V2 corrige una serie de problemas, incluido este error de registro de pago.

Puede actualizar a la última versión (1.9.3.4) o revertir V1 y luego aplicar V2 del parche. Cualquiera de las opciones resolverá el problema.

El cambio oficial en V2 es efectivamente el mismo que Peter O'Callaghan describió, eliminando las tres líneas agregadas Mage_Checkout_OnepageController::saveMethodAction.

Ryan Hoerr
fuente