SUPEE-9767 Patch / CE 1.9.3.3 - ชำระเงินหน้าเดียว - ปัญหาการลงทะเบียนลูกค้า


19

ในการติดตั้งวานิลลา 1.9.2.4 ที่สะอาดติดตั้ง patched กับ SUPEE-8788, SUPEE-9652 และ SUPEE-9767 และเปิดการตั้งค่า 'เปิดใช้งานการตรวจสอบคีย์แบบฟอร์มการชำระเงินใหม่' หลังจากการลงทะเบียนลูกค้าใหม่ที่ประสบความสำเร็จ การชำระเงินแบบหน้าเดียวเริ่มต้นไม่มีลูกค้าใหม่ถูกสร้างขึ้นและลูกค้าไม่ได้เข้าสู่ระบบถึงแม้ว่าการสั่งซื้อจะผ่านไป

การปิดการตั้งค่า 'เปิดใช้งานการตรวจสอบความถูกต้องของคีย์แบบฟอร์มเมื่อชำระเงิน' ทำให้สามารถทำงานได้อีกครั้ง มีใครมีปัญหานี้อีกบ้างไหม ดูเหมือนจะไม่สำคัญว่าจะใช้วิธีการจัดส่ง / การชำระเงินใด

ฉันได้ลองทำสิ่งนี้ด้วยการติดตั้ง 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 ของแพทช์


ดี ฉันขี้เกียจเกินกว่าที่จะออกแบบต้นแบบเพื่อค้นหาฟิลด์อินพุตที่เหมาะสม
Peter O'Callaghan

@ PeterO'Callaghan ใช่ต้นแบบมีความเจ็บปวดในการทำงานเมื่อคุณคุ้นเคยกับ jQuery ^^
Raphael ที่ Digital Pianism

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พารามิเตอร์ในคำขอและเนื่องจากsetMethodคำขอJS ไม่ได้ส่งสิ่งนี้เมื่อสร้างคำขอ AJAX มันแค่ส่งคืน แต่เช้าและไม่ทำอะไรเลย กลับไปที่setMethodฟังก์ชั่นและเราสามารถเห็นได้ว่าเนื่องจากมันไม่ได้พยายามทำอะไรด้วยค่าส่งคืนไม่มีอะไรเกิดขึ้นและ JS ดำเนินการต่อ ณ จุดนี้ JS ได้มีการตั้งค่าไว้this.method = 'register'แต่การเสนอราคายังไม่ได้รับการอัปเดตดังนั้นจึงcheckout_methodเป็น 'แขก' เริ่มต้น

เนื่องจาก JS รู้ว่าลูกค้าเลือกลงทะเบียนมันจะแสดงฟิลด์รหัสผ่านดังนั้นเมื่อเห็นหน้ามันแล้วดูเหมือนว่าคุณกำลังลงทะเบียน แต่เท่าที่เกี่ยวข้องกับ PHP มันเป็นเช็คเอาท์ของแขกดังนั้นจึงไม่สร้างลูกค้าเมื่อเช็คเอาต์เสร็จสมบูรณ์

แก้ไข:การแก้ไขที่ง่ายที่สุดคือการใส่เครื่องหมายสามบรรทัดจาก saveMethodAction วิธีแก้ไขที่ถูกต้อง / ซับซ้อนมากขึ้นคือsetMethodควรคว้า form_key จากหน้าและส่งไปพร้อมกับคำขอ AJAX


คุณช่วยระบุเส้นทางที่เราสามารถหาได้: this-> isFormkeyValidationOnCheckoutEnabled () && $ $ นี้ -> _ validateFormKey
ไอคอน

skin / frontend / base / default / js / opcheckout.js ไม่มีฟังก์ชั่นนั้น
ไอคอน

2
โค้ดตรวจสอบ form_key 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

เครดิตเต็มไปที่ปีเตอร์สำหรับการแก้ปัญหา! ฉันอยากจะชี้ให้เห็นว่าการเปลี่ยนแปลงทีละขั้นตอน

ไปที่ แอพ / รหัส / 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แทน เราควรรายงานความผิดพลาดนี้ (patch) ให้กับทีม core magento
Adarsh ​​Khatri

@AdarshKhatri นี่อาจจะผิด แต่ใช้งานได้! และใช่ตอนนี้ทีมงานวีโอไอพีควรทราบตอนนี้ ส่งข้อความถึงพวกเขาหากคุณสามารถ
ไอคอน

2
@AdarshKhatri ฉันเห็นด้วยกับคุณ การแสดงความคิดเห็น 2 บรรทัดเหล่านี้จะเป็นการลบปัญหา แต่ยังลบเป้าหมายการแก้ไขด้วย ฉันมีปัญหาเดียวกันและไม่สามารถเข้าใจวิธีการแก้ไขได้อย่างถูกต้องในขณะนี้ ...
DarkCowboy

แทนที่จะแสดงความคิดเห็นisFormkeyValidationOnCheckoutEnabled()คุณสามารถปิดการใช้งานการตั้งค่าในผู้ดูแลระบบได้ แต่ทางออกที่ดีที่สุดคือ Raphaels: magento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyon ราฟาเอลทำอะไรได้ดีมาก ฉันเพิ่งให้คำแนะนำสำหรับการแก้ไขระยะสั้นที่แนะนำโดย Peter วันก่อนที่วีโอไอพีจะยอมรับว่ามีปัญหา ฉันเห็นด้วยไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่เป็นการแก้ไขเช่นเดียวกับการปิดใช้งานฟอร์มคีย์จากแบ็คเอนด์
ไอคอน

1

จุดเริ่มต้นที่ดี:

Security Patch SUPEE-9767 - ปัญหาที่อาจเกิดขึ้น?

คุณต้องอัปเดตไฟล์เทมเพลตของคุณ โปรดทราบว่ามีเพียงไม่กี่ชั่วโมงจากการเปิดตัวแพทช์นี้และในขณะนี้เราต้องจัดการกับสิ่งที่เป็นสาธารณะ ฉันค่อนข้างมั่นใจในสิ่งต่อไปที่จะได้รับการชี้แจง

แก้ไข: ขอบคุณสำหรับการลงคะแนน! ฉันขอโทษที่ฉันไม่สามารถแก้ปัญหาใน 8 ชั่วโมงจากการปล่อยแพทช์นี้


3
ใช่ฉันได้ผ่านไฟล์เทมเพลตทั้งหมดในการติดตั้งที่ฉันพบปัญหาแล้ว ฉันได้อัปเดตคำถามข้างต้น - ในการทดสอบการติดตั้งวานิลลาของ Magento 1.9.3.3 โดยไม่มีการดัดแปลงใด ๆ ฉันดูเหมือนจะมีปัญหาเดียวกัน การทดสอบการติดตั้ง 1.9.2.4 นั้นใช้แพ็คเกจ / ธีมเริ่มต้น (ใหม่ไม่มีการแก้ไข) ด้วย
RickyMage123

ฉันลองกับ 1.7.0.2 และสิ่งเดียวกันลูกค้าไม่เคยลงทะเบียนเมื่อเปิดใช้งานคีย์ฟอร์ม
ไอคอน

1
ฉันจะทำการตรวจสอบเปรียบเทียบ 1.9.2.4 กับ 1.9.3.3 และดูว่าอะไรคือความแตกต่าง ฉันยังไม่ได้ติดตั้งตั้งแต่เริ่มต้น 1.9.3.3 ฉันจะโพสต์รายงานในลิงก์ที่กล่าวถึงข้างต้น
ADDISON74

2
จะอัปเดตหากฉันพบปัญหา ได้รายงานข้อผิดพลาดที่ Magento เนื่องจากดูเหมือนว่าจะมีปัญหากับการติดตั้ง 1.9.3.3 ที่ไม่ได้แก้ไข
RickyMage123

1
ตัวติดตามบั๊กที่ Magento ไม่ใช่วิธีรายงาน แต่ก็ไร้ประโยชน์ ฉันทำมาหลายปีแล้วให้วิธีแก้ปัญหาและไม่มีอะไรเปลี่ยนแปลงในรหัส ไม่มีใครฟังที่นั่น แต่พวกเขาฟังใน Magento 2! ฉันมักจะพบวิธีแก้ปัญหาในสถานที่อื่นนอกเหนือจากเว็บไซต์วีโอไอพี คำแนะนำของฉันคือทำการทดสอบก่อนที่จะปรับปรุงเว็บไซต์ผลิตของคุณ ด้วยปัญหาใหม่ฉันคิดว่าเราจะเห็นการอัปเดตใหม่เร็วกว่าที่เราคิด สิ่งเดียวกันเกิดขึ้นระหว่าง 1.9.3.0 และ 1.9.3.1
ADDISON74

1

ขอบคุณสำหรับ patch @ Raphael ที่ Digital Pianism

เพื่อความสะดวกฉันได้สร้างส่วนต่างเพื่อให้คุณสามารถใช้โปรแกรมแก้ไขได้อย่างรวดเร็ว

 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

รุ่นที่ 2 ของสุภี-9767 แพทช์ได้รับการปล่อยตัวในวันนี้พร้อมกับวีโอไอพี CE 1.9.3.4 V2 แก้ไขปัญหาจำนวนหนึ่งรวมถึงข้อผิดพลาดในการลงทะเบียนเช็คเอาต์

คุณสามารถอัพเกรดเป็นเวอร์ชั่นล่าสุด (1.9.3.4) หรือแปลงกลับ V1 แล้วใช้ V2 ของแพตช์ ตัวเลือกอย่างใดอย่างหนึ่งจะแก้ไขปัญหา

การเปลี่ยนแปลงอย่างเป็นทางการใน V2 Mage_Checkout_OnepageController::saveMethodActionนั้นได้อย่างมีประสิทธิภาพเช่นเดียวกับปีเตอร์แกห์นอธิบายเอาสามบรรทัดเพิ่มไปยัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.