SUPEE-9767 पैच / सीई 1.9.3.3 - एक पृष्ठ चेकआउट - ग्राहक पंजीकरण मुद्दा


19

Magento 1.9.2.4 के स्वच्छ, वैनिला इंस्टॉलेशन पर, SUPEE-8788, SUPEE-9652 और SUPEE-9767 के साथ पैच किया गया, और एक नए नए ग्राहक पंजीकरण चेकआउट के बाद नए 'Enable Form Key Validation On Checkout' सेटिंग चालू की गई। डिफ़ॉल्ट वन पेज चेकआउट, कोई नया ग्राहक नहीं बनाया जाता है और ग्राहक लॉग इन नहीं होता है, हालांकि ऑर्डर ठीक चलता है।

'सक्षम फ़ॉर्म कुंजी सत्यापन पर चेकआउट चालू करें' को बंद करने से यह काम फिर से शुरू हो जाता है। किसी और को यह मुद्दा था? इससे कोई फर्क नहीं पड़ता कि कौन सी शिपिंग / भुगतान विधियों का उपयोग किया जाता है।

जब से मैंने इसे 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 की प्रतीक्षा कर रहे हैं, तो वह यह कर देगा


अच्छा लगा। मैं एक उपयुक्त इनपुट फ़ील्ड खोजने के लिए प्रोटोटाइप का काम करने के लिए बहुत आलसी था।
पीटर ओ'कालाघन

जब आप jQuery के लिए उपयोग किए जाते हैं तो पीटरओ'कैलाघन हाँ प्रोटोटाइप दर्दनाक है। ^ ^
डिजिटल पियानोवाद पर राफेल

1
जब आपके पास इस बिंदु पर चेकआउट में "form_key" नाम का कोई तत्व नहीं है, तो क्या होगा? कितनी बड़ी संभावना है कि घटित होगा?
अर्जन मिडेमा

1
@ पज मुझे धन्यवाद देने के लिए धन्यवाद। इसे कई दुकानों के लिए लागू किया गया है, जिसमें कोई समस्या नहीं है
अरजेन मिडेमा

1
@RaphaelatDigitalPianism: मैंने आपके तरीके की कोशिश की, लेकिन इससे मुझे कोई फायदा नहीं हुआ?
अनुराग खंडेलवाल

15

जब आप रजिस्टर का चयन करते हैं और जारी रखते हैं, तो जेएस स्क्रिप्ट कॉल 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फ़ंक्शन पर वापस जाएं और हम देख सकते हैं कि चूंकि यह रिटर्न वैल्यू के साथ कुछ भी करने का प्रयास नहीं करता है, और कुछ नहीं होता है और जेएस जारी रहता है। इस बिंदु पर जेएस ने सेट किया है this.method = 'register'लेकिन उद्धरण अपडेट नहीं किया गया है, इसलिए checkout_methodडिफ़ॉल्ट 'अतिथि' है।

चूंकि JS ग्राहक चयनित रजिस्टर को जानता है, यह पासवर्ड फ़ील्ड प्रदर्शित करता है, इसलिए इसके चेहरे पर, ऐसा लगता है कि आप पंजीकरण कर रहे हैं। लेकिन जहां तक ​​PHP पक्ष का संबंध है, यह एक अतिथि चेकआउट है, इसलिए यह ग्राहक को चेकआउट पूरा होने पर नहीं बनाता है।

संपादित करें: सबसे आसान फिक्स सेवमैथोडेशन से उन तीन लाइनों को कमेंट करना है। अधिक सही / जटिल समाधान यह है कि setMethodपृष्ठ से form_key को हथियाना चाहिए और इसे AJAX अनुरोध के साथ भेजना चाहिए।


क्या आप कृपया वह रास्ता प्रदान कर सकते हैं जहाँ हम पा सकते हैं: यह- isFormkeyValidationOnCheckoutEnabled () और $! $ -> _ validateFormKey
Icon

स्किन / फ्रंटेंड / बेस / डिफॉल्ट / js / opcheckout.js में वह फंक्शन नहीं होता है।
चिह्न

2
कोड स्निपेट फॉर्म_की जाँच कर रहा है app/code/core/Mage/Checkout/controllers/OnepageController.php। यह जेएस द्वारा फॉर्म_की नहीं भेजने के अनुरोध के कारण है। यह पैच के साथ एक बग है। मुझे संदेह है कि वहाँ एक v2 होना चाहिए।
पीटर ओ'कालाघन

2
या पैच v2 तक, बस सिस्टम / कॉन्फ़िगरेशन / व्यवस्थापक को अक्षम करें -> सुरक्षा -> "Checkout पर फ़ॉर्म कुंजी सत्यापन सक्षम करें" सेटिंग 0 पर यह एक नोटिस लाएगा, लेकिन पैच v2 के बाद हम इसे फिर से सक्षम कर सकते हैं
Jeroen

1
पीटर, थोड़ा गहरा खुदाई करने के लिए धन्यवाद। उम्मीद है कि Magento का कोई व्यक्ति इसे उठाएगा या बग रिपोर्ट देखेगा और हमें एक v2 मिलेगा।
रिकीमाज १२

3

पूर्ण क्रेडिट समाधान के लिए पीटर के पास जाते हैं! मैं कदम से कदम निर्देश इंगित करना चाहूंगा कि क्या बदलना है।

पर जाएं एप्लिकेशन / कोड / कोर / दाना / चेकआउट / नियंत्रक / 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इसके बजाय भेजना चाहिए। हमें इस दोष (पैच) की रिपोर्ट मैगेंटो कोर टीम को देनी चाहिए।
आदर्श खत्री

@ AdarshKhatri यह गलत हो सकता है लेकिन यह काम करता है! और हां, Magento की टीम को अब तक पता होना चाहिए। यदि आप कर सकते हैं तो उन्हें डबल संदेश दें।
चिह्न

2
@ AdarshKhatri मैं आपसे सहमत हूँ। इन 2 पंक्तियों को टिप्पणी करने से समस्या दूर हो जाती है, लेकिन पैच लक्ष्य को भी हटा देता है। मुझे एक ही मुद्दा मिला है और समझ में नहीं आ रहा है कि इसे कैसे ठीक से तय किया जाए ...
डार्ककोबॉय

टिप्पणी करने के बजाय isFormkeyValidationOnCheckoutEnabled()आप बस सेटिंग को व्यवस्थापक में अक्षम कर सकते हैं लेकिन सबसे अच्छा समाधान रैपल्स है
DanCarlyon

@DanCarlyon कभी राफेल ने जो किया वह महान काम है। मैंने सिर्फ पीटर द्वारा सुझाए गए अल्पकालिक फिक्स के लिए निर्देश प्रदान किया, कुछ दिनों पहले मैगेंटो ने स्वीकार किया कि एक समस्या है। मैं मानता हूं कि आदर्श समाधान नहीं है, बल्कि बैक-एंड से फॉर्म-की को अक्षम करने के रूप में एक फिक्स है।
आइकन

1

शुरू करने के लिए एक अच्छा बिंदु:

सुरक्षा पैच SUPEE-9767 - संभावित मुद्दे?

आपको अपनी टेम्पलेट फ़ाइलों को अपडेट करने की आवश्यकता है। कृपया ध्यान दें कि इस पैच के जारी होने से कुछ ही घंटे हैं और फिलहाल हमें सार्वजनिक रूप से क्या करना है। मुझे पूरा यकीन है कि अगले दिनों में चीजें स्पष्ट हो जाएंगी।

संपादित करें: नीचे मतदान के लिए धन्यवाद! मुझे खेद है कि मैं इस पैच को जारी करने से 8 घंटे में समाधान नहीं दे सकता।


3
हां, मैं उस इंस्टॉलेशन की सभी टेम्प्लेट फाइलों से गुजरा हूं जहां मैंने समस्या को देखा था। मैंने ऊपर दिए गए प्रश्न को अपडेट किया है - मैगेंटो 1.9.3.3 के एक परीक्षण वेनिला इंस्टॉलेशन पर, जिसमें कोई भी संशोधन नहीं है, मुझे लगता है कि यह एक ही मुद्दा है। परीक्षण 1.9.2.4 इंस्टॉलेशन डिफ़ॉल्ट (ताज़ा, अनमॉडिफ़ाइड) पैकेज / थीम का उपयोग कर रहा था।
रिकीमेजेब

मैंने 1.7.0.2 के साथ कोशिश की और यही बात है, जब ग्राहक कुंजियाँ सक्षम होते हैं तो ग्राहक कभी पंजीकृत नहीं होते हैं।
आइकन

1
मैं 1.9.3.3 के साथ 1.9.2.4 की तुलना में कुछ जांच करूंगा और देखूंगा कि अंतर क्या हैं। मैं खरोंच से स्थापित नहीं किया 1.9.3.3 अभी तक। मैं उपरोक्त लिंक में रिपोर्ट पोस्ट करूंगा।
ADDISON74

2
यदि मुझे समस्या मिलती है तो अपडेट करेंगे; Magento में एक बग रिपोर्ट को उठाया है क्योंकि यह एक अनमॉडिफाइड 1.9.3.3 स्थापित के साथ एक समस्या लगती है।
रिकीमाज १२

1
मैगेंटो में वह बग ट्रैकर रिपोर्ट करने का तरीका नहीं है, यह बेकार है। मैंने कई वर्षों से पहले किया था, समाधान दे रहा था, और कोड में कुछ भी नहीं बदला गया था। कोई भी वहाँ नहीं सुन रहा है, लेकिन वे Magento 2 में सुनते हैं! हमेशा मुझे Magento की वेबसाइट के अलावा अन्य जगहों पर भी समाधान मिला। मेरी सलाह है कि अपनी उत्पादन वेबसाइटों को अपडेट करने से पहले कुछ परीक्षण करें। नए मुद्दों के साथ मुझे लगता है कि हम जितनी जल्दी सोचते हैं, हम एक नया अपडेट देखेंगे। यही बात 1.9.3.0 और 1.9.3.1 के बीच हुई।
ADDISON74

1

डिजिटल पियानोवाद पर पैच @ राफेल के लिए धन्यवाद।

सुविधा के लिए, मैंने एक अंतर बनाया ताकि आप जल्दी से पैच लागू कर सकें।

 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 में आधिकारिक परिवर्तन प्रभावी रूप से पीटर ओ'कैलाघन द्वारा वर्णित तीन लाइनों को हटाने के समान है Mage_Checkout_OnepageController::saveMethodAction

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.