SUPEE-9767 Yama / CE 1.9.3.3 - Bir Sayfa Satın Alma - Müşteri Kaydı sorunu


19

SUPER-8788, SUPEE-9652 ve SUPEE-9767 ile yamalanmış Magento 1.9.2.4'ün temiz ve vanilya yüklemesinde ve yeni bir ' Yeni Müşteri Kayıt Ödemesini Etkinleştir' ayarı açıkken varsayılan Tek Sayfa Satın Alma, yeni bir müşteri oluşturulmaz ve sipariş iyi geçmesine rağmen müşteri oturum açmaz.

'Form Anahtarı Doğrulamasını Etkinleştir Açıkta Çıkış' ayarının kapatılması bu işlemin yeniden yapılmasını sağlar. Başka kimse bu sorunu yaşadı mı? Hangi nakliye / ödeme yöntemlerinin kullanıldığı önemli değildir.

O zamandan beri Magento 1.9.3.3'ün yeni, değiştirilmemiş bir kurulumuyla bunu denedim ve aynı sorun var gibi görünüyor. Tek sayfalık bir ödeme yoluyla yeni bir müşteri kaydederken, 'Form Anahtarı Doğrulamasını Etkinleştir Açıkta Etkinleştir' ayarı açık olduğu sürece, sipariş boyunca bile hiçbir müşteri oluşturulmaz.

Yanıtlar:


36

Tamam burada gerçek hata düzeltme geldi.

Değiştirerek yöntemi /skin/frontend/base/default/js/opcheckout.jsdüzenleyin ve düzenleyin 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});
},

İle:

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

Bu, yamanın v2'sini beklerken yapacağız


Güzel. Uygun bir girdi alanı bulmak için prototip üzerinde çalışamayacak kadar tembeltim.
Peter O'Callaghan

@ PeterO'Callaghan evet prototip jQuery için alıştığınız zaman çalışmak acı verici ^^
Raphael at Digital Pianism

1
Bu noktada kasanızda "form_key" adında bir öğeniz yoksa ne olur? Ortaya çıkma şansı ne kadar büyük?
Arjen Miedema

1
@paj bana bildirdiğiniz için teşekkürler. Şimdi herhangi bir sorun ile birkaç dükkan için
uygulandı

1
@RaphaelatDigitalPianism: Yolunu denedim ama bu bana yardımcı olmadı, herhangi bir fikir?
Anurag Khandelwal

15

Kayıt ve JS komut çağrıları devam seçeneğini zaman checkout.setMethod()bulunur, skin/frontend/base/default/js/opcheckout.js. Oradan bir AJAX POST isteği yaptığını görebiliriz this.saveMethodUrl, ancak geçtiği tek parametre method. Bu Mage_Checkout_OnepageController::saveMethodActionAJAX isteğinin hedefi olan bakarsak, yamanın eklendiğini görebiliriz:

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

Yana _validateFormKeybir için görünüm form_keyistekte parametresi, ve o zamandan beri JS setMethodo AJAX isteği yaptığında isteği basitçe erken dönen ve hiçbir şey yapıyor, bu göndermedi. İşleve geri setMethoddöndüğümüzde, dönüş değeri olan bir şey yapmaya çalışmadığından, başka bir şey olmayacağını ve JS'nin devam ettiğini görebiliriz. Bu noktada JS ayarlandı this.method = 'register'ancak teklif güncellenmedi, checkout_methodvarsayılan 'misafir' de öyle.

JS müşteri tarafından seçilen kaydı bildiğinden, şifre alanlarını görüntüler, bu yüzden yüzünde kayıt yaptırdığınız anlaşılıyor. Ancak PHP tarafı söz konusu olduğunda, bu bir misafir kasasıdır, bu nedenle kasası tamamlandığında müşteri oluşturmaz.

Düzenleme: en basit düzeltme saveMethodAction bu üç satır yorum yapmaktır. Daha doğru / karmaşık çözüm, setMethodform_key'i sayfadan alıp AJAX isteği ile göndermesidir.


Lütfen bulabileceğimiz yolu sağlayabilir misiniz: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon

skin / frontend / base / default / js / opcheckout.js bu işlevi içermiyor.
Icon

2
Form_key kontrol kod parçacığı arasındadır app/code/core/Mage/Checkout/controllers/OnepageController.php. Bunun nedeni JS'nin form_key'i göndermemesi talebidir. Bu yama ile ilgili bir hatadır. Bir v2 olması gerektiğinden şüpheleniyorum.
Peter O'Callaghan

2
Veya yama v2'ye kadar, sadece Sistem / Yapılandırma / Yönetici -> Güvenlik -> "Form Anahtarı Doğrulamasını Etkinleştir Açıkta Etkinleştir" ayarını 0 olarak devre dışı bırakın. Bu bir bildirim getirir, ancak yama v2'den sonra yeniden etkinleştirebiliriz
Jeroen

1
Biraz daha derine indiğiniz için teşekkürler, Peter. Umarım Magento'dan bir kişi bunu alır ya da hata raporunu fark eder ve bir v2 alırız.
RickyMage123

3

Çözüm için tam kredi Peter'a gidiyor! Neyi değiştireceğimi adım adım anlatmak istiyorum.

Go uygulaması / kod / çekirdek / Mage / Ödeme / kontrol / OnepageController.php

bulun:

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

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

Satırı / * * / tags ile yorumlayın.

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

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

2
Bu yanlış, eklenen yamayı yorumluyorsunuz. Bu yama farkında olduğum kadarıyla, js isteği form keyyerine göndermek gerekir . Bu hatayı (yama) magento çekirdek ekibine bildirmeliyiz.
Adarsh ​​Khatri

@AdarshKhatri Bu yanlış olabilir ama işe yarıyor! ve Evet, magento takımı şimdiye kadar farkında olmalı. Mümkünse onlara iki kez mesaj gönderin.
Icon

2
@AdarshKhatri Sana katılıyorum. Bu 2 satırı yorumlamak sorunu ortadan kaldırır, ancak yama hedefini de kaldırır. Ben de aynı sorunu var ve şu an için düzgün bir şekilde düzeltmek nasıl anlayamıyorum ...
DarkCowboy

Yorum yapmak yerine isFormkeyValidationOnCheckoutEnabled(), yönetici ayarını devre dışı bırakabilirsiniz, ancak en iyi çözüm Raphaels'dir: magento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyon Raphael'in yaptığı her şey harika bir iş. Magento'nun bir sorun olduğunu kabul etmeden günler önce Peter tarafından önerilen kısa süreli düzeltme için talimat verdim. İdeal bir çözüm değil, aynı zamanda form anahtarlarını arka uçtan devre dışı bırakmak gibi bir düzeltme olduğunu kabul ediyorum.
Icon

1

Başlamak için iyi bir nokta:

Güvenlik Düzeltme Eki SUPEE-9767 - Olası sorunlar mı var?

Şablon dosyalarınızı güncellemeniz gerekir. Bu yamanın yayınlanmasından sadece birkaç saat geçtiğini ve şu an herkese açık olanlarla ilgilenmemiz gerektiğini lütfen unutmayın. Önümüzdeki günlerde her şeyin netleşeceğinden eminim.

EDIT: Oy verdiğiniz için teşekkür ederiz! Bu yamayı yayınladıktan sonra 8 saat içinde çözüm bulamadığım için üzgünüm.


3
Evet, kurulumda sorunu tespit ettiğim tüm şablon dosyalarını inceledim. Yukarıdaki soruyu güncelledim - Magento 1.9.3.3'ün bir vanilya kurulumunda herhangi bir değişiklik olmadan aynı sorunu yaşıyorum gibi görünüyor. Test 1.9.2.4 yüklemesi de varsayılan (yeni, değiştirilmemiş) paketi / temayı kullanıyordu.
RickyMage123

1.7.0.2 ve aynı şeyi denedim, Form anahtarları Etkinleştirildiğinde müşteriler asla kaydedilmez.
Icon

1
1.9.2.4 ile 1.9.3.3'ü karşılaştıran bazı araştırmalar yapacağım ve farkların ne olduğunu göreceğim. Henüz 1.9.3.3 sıfırdan kurulum yapmadım. Raporu yukarıda belirtilen bağlantıya göndereceğim.
ADDISON74

2
Sorunu bulursam güncellenir; değiştirilmemiş 1.9.3.3 kurulumuyla ilgili bir sorun gibi göründüğü için Magento'da bir hata raporu oluşturduk.
RickyMage123

1
Magento'daki Bug izci raporlamanın yolu değil, işe yaramaz. Yıllar önce yaptım, çözümler verdim ve kodda hiçbir şey değişmedi. Orada kimse dinlemiyor, ama Magento 2'de dinliyorlar! Her zaman Magento web sitesinden başka yerlerde çözümler buldum. Tavsiyem, üretim web sitelerinizi güncellemeden önce bazı testler yapmanızdır. Yeni konularla birlikte düşündüğümüzden daha yeni bir güncelleme göreceğimizi düşünüyorum. Aynı şey 1.9.3.0 ve 1.9.3.1 arasında da oldu.
ADDISON74

1

@ Raphael'in Dijital Piyanizm'deki yaması için teşekkürler.

Kolaylık sağlamak için, yamayı hızlı bir şekilde uygulayabilmeniz için bir fark yarattım.

 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 yamasının 2. sürümü , Magento CE 1.9.3.4 ile birlikte bugün daha erken yayınlandı . V2, bu ödeme kaydı hatası da dahil olmak üzere bir dizi sorunu giderir.

En son sürüme (1.9.3.4) yükseltebilir veya V1'i geri alabilir ve yamanın V2'sini uygulayabilirsiniz. Her iki seçenek de sorunu çözecektir.

V2'deki resmi değişiklik, Peter O'Callaghan'ın tanımladığı ile aynıdır ve eklenen üç çizgiyi kaldırır Mage_Checkout_OnepageController::saveMethodAction.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.