SUPEE-9767补丁/ CE 1.9.3.3-一页结帐-客户注册问题


19

成功进行了新的客户注册结帐后,在干净,原始的Magento 1.9.2.4安装中,修补了SUPEE-8788,SUPEE-9652和SUPEE-9767,并启用了新的“结帐时启用表单密钥验证”设置。默认的“一页结帐”,不会创建新客户,也不会登录该客户,尽管该订单可以正常进行。

关闭“在签出时启用表单密钥验证”设置会再次执行此操作。有人遇到过这个问题吗?使用哪种运输/付款方式似乎并不重要。

此后,我尝试使用全新的,未更改的Magento 1.9.3.3安装程序来尝试此操作,它似乎也存在相同的问题。通过一页结帐注册新客户时,只要打开“在结帐时启用表单密钥验证”设置,即使订单进行得很好,也不会创建任何客户。

Answers:


36

好的,这是我想出的真正的错误修复程序。

通过替换来编辑/skin/frontend/base/default/js/opcheckout.js和编辑setMethod()方法:

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

拥有:

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

在我们等待补丁v2的时候就可以了


真好 我太懒了,无法找出原型并找到合适的输入字段。
Peter O'Callaghan

@ PeterO'Callaghan是的原型,当您习惯使用jQuery时,工作起来很痛苦^^
Digital Pianism的Raphael于2002年

1
此时,当您在结帐中没有名称为“ form_key”的元素时,会发生什么情况?发生的机会有多大?
Arjen Miedema

1
@paj感谢您告诉我。现在已在几家商店中成功实施了该解决方案
Arjen Miedema

1
@RaphaelatDigitalPianism:我尝试过您的方式,但是对我没有帮助,有什么想法吗?
Anurag Khandelwal

15

选择注册并继续时,JS脚本会调用checkout.setMethod(),位于中skin/frontend/base/default/js/opcheckout.js。从那里我们可以看到它向发出AJAX POST请求this.saveMethodUrl,但传递的唯一参数是method。如果查看Mage_Checkout_OnepageController::saveMethodAction,它是该AJAX请求的目标,则可以看到添加了补丁:

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

由于在请求中_validateFormKey查找form_key参数,并且由于JS setMethod请求在发出AJAX请求时未发送该参数,因此它只是提前返回而无所作为。回到该setMethod函数,我们可以看到,由于它不尝试对返回值做任何事情,因此没有其他事情发生,并且JS继续运行。此时,JS已设置,this.method = 'register'但报价尚未更新,checkout_method默认的“ guest”也是如此。

由于JS知道客户选择的注册者,因此它会显示密码字段,因此表面上看起来像您正在注册。但是就PHP方面而言,它是来宾结帐,因此结帐完成后不会创建客户。

编辑:最简单的解决方法是从saveMethodAction中注释掉这三行。更正确/更复杂的解决方案是setMethod应该从页面中获取form_key并与AJAX请求一起发送。


您能否提供我们可以找到的路径:this-> isFormkeyValidationOnCheckoutEnabled()&&!$ this-> _ validateFormKey
Icon

skin / frontend / base / default / js / opcheckout.js不包含该功能。
图标

2
检查form_key的代码段来自app/code/core/Mage/Checkout/controllers/OnepageController.php。这是由JS发出的请求未发送form_key引起的。补丁程序存在错误。我怀疑必须有一个v2。
彼得·奥卡拉汉

2
或者直到补丁v2的,只是禁用系统/配置/管理- >安全- >“启用表单密钥确认结账”设置为0,这将带来一个通知,但补丁之后V2我们可以重新启用它
吉荣

1
彼得,感谢您的深入研究。希望Magento的某人能够解决这个问题或注意到错误报告,然后我们将获得v2。
RickyMage123

3

完整的感谢归功于Peter提供的解决方案!我想指出逐步说明要更改的内容。

转到 app / code / core / Mage / Checkout / controllers / OnepageController.php

定位:

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

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

用/ * * /标签注释掉该行。

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

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

2
这是错误的,您正在注释添加了补丁的那个。据我所知,这个补丁应该发送js请求form key。我们应该将此故障(补丁)报告给magento核心团队。
Adarsh Khatri

@AdarshKhatri这可能是错误的,但是有效!是的,Magento团队现在应该知道。如果可以,请给他们留言。
图标

2
@AdarshKhatri我同意你的看法。注释这两行可以消除问题,但也可以消除补丁目标。我遇到了相同的问题,暂时无法理解如何正确解决...
DarkCowboy

无需注释掉即可,isFormkeyValidationOnCheckoutEnabled()您可以在管理员中禁用该设置,但是最好的解决方案是Raphaels:magento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyon Raphael所做的一切都很出色。在Magento承认存在问题的几天之前,我刚刚提供了Peter建议的短期修复的说明。我同意这不是一个理想的解决方案,而是一个解决方案,就像从后端禁用Form-keys一样。
图标

1

一个不错的起点:

安全补丁SUPEE-9767-可能的问题?

您需要更新模板文件。请注意,自发布此补丁以来只有几个小时,目前,我们必须处理公开的问题。我敢肯定,未来几天情况会变得更清楚。

编辑:感谢您的不赞成投票!很抱歉,我无法在发布此补丁后的8小时内给出解决方案。


3
是的,我已经遍历了发现问题的安装中的所有模板文件。我已经更新了上面的问题-在未经修改的Magento 1.9.3.3的测试香草安装上,我似乎也遇到了同样的问题。测试1.9.2.4的安装也使用了默认(新的,未修改的)程序包/主题。
RickyMage123

我尝试使用1.7.0.2和同样的方法,启用了Forms键后,客户永远都不会注册。
图标

1
我将做一些调查,将1.9.2.4与1.9.3.3进行比较,看看有什么区别。我尚未从头开始安装1.9.3.3。我将在上面提到的链接中发布报告。
ADDISON74

2
如果发现问题将更新;已在Magento上提出了一个错误报告,因为这似乎是未经修改的1.9.3.3安装的问题。
RickyMage123 '17

1
Magento的Bug跟踪器不是报告方式,它没有用。我做了很多年才给出解决方案,但是代码没有任何变化。没有人在那儿听,但是他们在Magento 2中听!我总是在Magento网站以外的其他地方找到解决方案。我的建议是在更新生产网站之前进行一些测试。对于新问题,我认为我们会比我们想像的更快看到新的更新。在1.9.3.0和1.9.3.1。之间发生了相同的事情。
ADDISON74 '17

1

感谢Digital Pianism的@ Raphael补丁。

为了方便起见,我创建了一个差异文件,以便您可以快速应用补丁。

 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

SUPEE-9767补丁程序的第2版今天与Magento CE 1.9.3.4一起发布。V2解决了许多问题,包括此签出注册错误。

您可以升级到最新版本(1.9.3.4),或还原V1,然后应用补丁的V2。两种选择都可以解决问题。

V2中的正式更改实际上与Peter O'Callaghan所描述的相同,删除了添加到的三行Mage_Checkout_OnepageController::saveMethodAction

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.