SUPEE-9767 패치 / CE 1.9.3.3-한 페이지 체크 아웃-고객 등록 문제


19

SUPEE-8788, SUPEE-9652 및 SUPEE-9767으로 패치 된 Magento 1.9.2.4의 깨끗하고 바닐라 설치 및 새로운 고객 등록 체크 아웃에 이어 새로운 '양식 키 유효성 검사시 체크 인 에이블'설정이 켜진 경우 기본 1 페이지 체크 아웃에서는 주문이 정상적으로 진행되지만 새 고객이 작성되지 않고 고객이 로그인하지 않습니다.

'양식 키 유효성 검사 사용 설정'설정을 해제하면이 작업이 다시 작동합니다. 다른 사람 이이 문제가 있습니까? 어떤 운송 / 지불 방법이 사용되는지는 중요하지 않습니다.

그 후 Magento 1.9.3.3을 새로 변경하지 않은 상태로 설치하려고 시도했지만 동일한 문제가있는 것 같습니다. 한 페이지 체크 아웃을 통해 새 고객을 등록 할 때 '양식 키 유효성 검사 사용 체크 아웃'설정이 켜져있는 한 주문을 통해도 고객이 생성되지 않습니다.

답변:


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를 기다리는 동안 그렇게 할 것입니다.


좋은. 적절한 입력 필드를 찾기 위해 프로토 타입을 작성하기에는 너무 게으르다.
피터 오캘 라간

@ PeterO'Callaghan 그래, 프로토 타입은 jQuery에 익숙 할 때 힘들어 ^^
Digital Pianism의 Raphael

1
이 시점에서 체크 아웃에 이름이 "form_key"인 요소가 없으면 어떻게됩니까? 발생할 확률은 얼마나됩니까?
Arjen Miedema

1
알려 주셔서 감사합니다. 문제없이 여러 상점에 구현했습니다
Arjen Miedema

1
@RaphaelatDigitalPianism : 나는 당신의 길을 시도했지만 그게 도움이되지 않았습니다.
Anurag Khandelwal

15

register를 선택하고 계속하면에있는 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;
}

이후 _validateFormKeyA의 외모 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에는 해당 기능이 없습니다.
Icon

2
form_key를 검사하는 코드 스 니펫은 from app/code/core/Mage/Checkout/controllers/OnepageController.php입니다. JS가 form_key를 보내지 않는 요청으로 인해 발생합니다. 패치 관련 버그입니다. v2가 있어야 할 것 같습니다.
Peter O'Callaghan

2
또는 패치 v2까지는 시스템 / 구성 / 관리자-> 보안-> "체크 아웃시 폼 키 유효성 검사 사용"설정을 0으로 비활성화하십시오. 알림이 표시되지만 패치 v2 이후에는 다시 활성화 할 수 있습니다.
Jeroen

1
조금 더 깊이 파고 들어 주셔서 감사합니다, 피터 Magento의 누군가가 이것을 선택하거나 버그 보고서를보고 v2를 얻게되기를 바랍니다.
RickyMage123

3

솔루션에 대한 전체 크레딧은 Peter에게갑니다! 무엇을 변경해야하는지 단계별로 지시하고 싶습니다.

로 이동하여 응용 프로그램 / 코드 / 코어 / 마법사 / 체크 아웃 / 컨트롤러 / 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 2016 년

@AdarshKhatri 이것은 잘못되었을 수도 있지만 작동합니다! 예, magento 팀은 지금까지 알고 있어야합니다. 가능하면 두 번 메시지를 보내십시오.
Icon

2
@AdarshKhatri 동의합니다. 이 두 줄을 주석 처리하면 문제가 제거되지만 패치 목표도 제거됩니다. 나는 같은 문제를
겪었고

주석을 달기보다는 isFormkeyValidationOnCheckoutEnabled()관리자에서 설정을 비활성화 할 수는 있지만 가장 좋은 해결책은 Raphaels입니다. magento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyon Raphael이 한 일은 훌륭한 일입니다. Magento가 문제가 있음을 인정하기 며칠 전에 Peter가 제안한 단기 수정에 대한 지침을 방금 제공했습니다. 백엔드에서 양식 키를 비활성화하는 것처럼 이상적인 솔루션이 아니라 해결책이라는 데 동의합니다.
Icon

1

시작하기에 좋은 점 :

보안 패치 SUPEE-9767-가능한 문제?

템플릿 파일을 업데이트해야합니다. 이 패치가 출시 된 후 몇 시간 밖에 걸리지 않으며 현재 공개 된 내용을 처리해야합니다. 다음 날에는 상황이 명확해질 것이라고 확신합니다.

편집 : 다운 투표 주셔서 감사합니다! 이 패치를 릴리스하여 8 시간 내에 솔루션을 제공 할 수 없습니다.


3
예, 설치에서 문제를 발견 한 모든 템플릿 파일을 살펴 보았습니다. 위의 질문을 수정했습니다-수정없이 Magento 1.9.3.3의 테스트 바닐라 설치에서 동일한 문제가있는 것 같습니다. 테스트 1.9.2.4 설치는 기본 (새롭고 수정되지 않은) 패키지 / 테마도 사용했습니다.
RickyMage123

1.7.0.2와 동일한 방법으로 시도했지만 Forms 키가 활성화되어 있으면 고객이 등록되지 않습니다.
Icon

1
1.9.2.4와 1.9.3.3을 비교 한 조사를 통해 차이점이 무엇인지 살펴 보겠습니다. 아직 처음 1.9.3.3부터 설치하지 않았습니다. 위의 언급 된 링크에 보고서를 게시하겠습니다.
ADDISON74

2
문제를 발견하면 업데이트됩니다. 수정되지 않은 1.9.3.3 설치에 문제가있는 것으로 보이므로 Magento에서 버그 보고서를 작성했습니다.
RickyMage123

1
마젠 토의 버그 추적기는보고하는 방법이 아니며 쓸모가 없습니다. 몇 년 전에 솔루션을 제공했으며 코드에서 아무것도 변경되지 않았습니다. 아무도 듣지 않지만 마 젠토 2에서는 듣습니다! 항상 Magento 웹 사이트 이외의 다른 곳에서 솔루션을 찾았습니다. 프로덕션 웹 사이트를 업데이트하기 전에 몇 가지 테스트를 수행하는 것이 좋습니다. 새로운 문제로 생각보다 빨리 새로운 업데이트를 보게 될 것입니다. 1.9.3.0과 1.9.3.1에서 같은 일이 일어났습니다.
ADDISON74

1

Digital Pianism의 패치 @ Raphael에 감사드립니다.

편의를 위해 패치를 신속하게 적용 할 수 있도록 diff를 만들었습니다.

 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.