SUPEE-9767 Patch / CE 1.9.3.3 - Checkout Satu Halaman - Masalah Registrasi Pelanggan

19

Pada pemasangan vanento Magento 1.9.2.4 yang bersih, ditambal dengan SUPEE-8788, SUPEE-9652 dan SUPEE-9767, dan dengan pengaturan 'Aktifkan Validasi Kunci Pada Saat Checkout' diaktifkan, mengikuti checkout pendaftaran pelanggan baru yang sukses pada Checkout Satu Halaman default, tidak ada pelanggan baru dibuat dan pelanggan tidak login, meskipun pesanan berjalan dengan baik.

Mematikan pengaturan 'Aktifkan Validasi Kunci Pada Saat Keluar' membuat ini berfungsi lagi. Adakah orang lain yang mengalami masalah ini? Tampaknya tidak masalah metode pengiriman / pembayaran mana yang digunakan.

Sejak itu saya sudah mencoba ini dengan instalasi Magento 1.9.3.3 yang segar dan tidak berubah dan tampaknya memiliki masalah yang sama. Saat mendaftarkan pelanggan baru melalui checkout satu halaman, tidak ada pelanggan yang dibuat bahkan melalui pesanan berjalan dengan baik, selama pengaturan 'Aktifkan Validasi Kunci Form Pada Checkout' diaktifkan.

RickyMage123
sumber

Jawaban:

36

Oke, inilah perbaikan bug yang sebenarnya saya buat.

Edit /skin/frontend/base/default/js/opcheckout.jsdan edit setMethod()metode dengan mengganti:

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

Dengan:

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

Itu akan melakukannya saat kita menunggu v2 patch

Raphael di Digital Pianism
sumber
Bagus. Saya terlalu malas untuk mengerjakan prototipe untuk menemukan bidang input yang sesuai.
Peter O'Callaghan
@ PeterO'Callaghan ya prototipe menyakitkan untuk bekerja ketika Anda terbiasa dengan jQuery ^^
Raphael di Digital Pianism
1
Apa yang terjadi ketika Anda tidak memiliki elemen dengan nama "form_key" di checkout Anda saat ini? Seberapa besar peluang yang akan terjadi?
Arjen Miedema
1
@paj, terima kasih sudah memberi tahu saya. Diimplementasikan untuk beberapa toko sekarang tanpa masalah
Arjen Miedema
1
@RaphaelatDigitalPianism: Saya sudah mencoba cara Anda tetapi itu tidak membantu saya, tahu?
Anurag Khandelwal
15

Ketika Anda memilih mendaftar dan melanjutkan, skrip JS akan memanggil checkout.setMethod(), yang terletak di skin/frontend/base/default/js/opcheckout.js. Dari sana kita dapat melihatnya membuat permintaan POST AJAX this.saveMethodUrl, tetapi satu-satunya parameter yang dilewati adalah method. Jika kita melihat Mage_Checkout_OnepageController::saveMethodAction, yang merupakan target dari permintaan AJAX itu, kita dapat melihat bahwa tambalan menambahkan:

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

Karena _validateFormKeymencari form_keyparameter dalam permintaan, dan karena setMethodpermintaan JS tidak mengirim ini ketika membuat permintaan AJAX, itu hanya kembali lebih awal dan tidak melakukan apa-apa. Kembali ke setMethodfungsi dan kita dapat melihat bahwa karena ia tidak berusaha melakukan apa pun dengan nilai kembali, tidak ada lagi yang terjadi dan JS berlanjut. Pada titik ini JS telah ditetapkan this.method = 'register'tetapi kuotasi belum diperbarui, demikian checkout_methodjuga 'tamu' default.

Karena JS mengetahui register yang dipilih oleh pelanggan, ia menampilkan kolom kata sandi, jadi pada permukaannya, sepertinya Anda mendaftar. Namun sejauh menyangkut PHP, ini adalah checkout tamu, sehingga tidak membuat pelanggan ketika checkout selesai.

Sunting: perbaikan paling sederhana adalah dengan mengomentari ketiga baris dari saveMethodAction. Solusi yang lebih benar / kompleks adalah yang setMethodharus mengambil form_key dari halaman dan mengirimkannya dengan permintaan AJAX.

Peter O'Callaghan
sumber
Bisakah Anda memberikan jalur di mana kami dapat menemukan: this-> isFormkeyValidationOnCheckoutEnabled () &&! $ This -> _ validateFormKey
Icon
skin / frontend / base / default / js / opcheckout.js tidak mengandung fungsi itu.
Ikon
2
Cuplikan kode yang memeriksa form_key dari app/code/core/Mage/Checkout/controllers/OnepageController.php. Ini disebabkan oleh JS yang membuat permintaan tidak mengirim form_key. Ini adalah bug dengan tambalan. Saya menduga harus ada v2.
Peter O'Callaghan
2
Atau hingga tambalan v2, cukup nonaktifkan pengaturan Sistem / Konfigurasi / Admin -> Keamanan -> "Aktifkan Validasi Kunci Formulir Pada Checkout" ke 0 Ini akan membawa pemberitahuan, tetapi setelah tambalan v2 kita dapat mengaktifkannya kembali
Jeroen
1
Terima kasih telah menggali sedikit lebih dalam, Peter. Semoga seseorang dari Magento akan mengambil ini atau melihat laporan bug dan kami akan mendapatkan v2.
RickyMage123
3

Penghargaan penuh diberikan kepada Peter untuk solusinya! Saya ingin menunjukkan instruksi langkah demi langkah apa yang harus diubah.

Buka aplikasi / kode / core / Mage / Checkout / controllers / OnepageController.php

Menemukan:

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

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

Komentari baris dengan / * * / tag.

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

    /*if ($this->isFormkeyValidationOnCheckoutEnabled() && !$this->_validateFormKey()) {
        return;
    }*/
Ikon
sumber
2
Ini salah, Anda mengomentari yang ditambahkan patch. Sejauh yang saya ketahui tentang tambalan ini, permintaan js harus dikirim form keysebagai gantinya. Kami harus melaporkan kesalahan ini (tambalan) ke tim inti magento.
Adarsh ​​Khatri
@AdarshKhatri Ini mungkin salah tetapi berhasil! dan Ya, tim magento harusnya sadar sekarang. Gandakan pesan mereka jika Anda bisa.
Ikon
2
@AdarshKhatri, saya setuju dengan Anda. Mengomentari 2 baris ini menghilangkan masalah, tetapi juga menghapus tujuan tambalan. Saya punya masalah yang sama dan tidak bisa mengerti bagaimana cara memperbaikinya dengan benar untuk saat ini ...
DarkCowboy
Daripada berkomentar isFormkeyValidationOnCheckoutEnabled()Anda hanya dapat menonaktifkan pengaturan di admin namun solusi terbaik adalah Raphaels: magento.stackexchange.com/a/177125/2671
DanCarlyon
@DanCarlyon Apa yang pernah dilakukan Raphael adalah pekerjaan yang bagus. Saya baru saja memberikan instruksi untuk perbaikan jangka pendek yang disarankan oleh Peter, beberapa hari sebelum Magento mengakui ada masalah. Saya setuju bukan solusi yang ideal melainkan perbaikan seperti menonaktifkan form-key dari back-end.
Ikon
1

Poin yang baik untuk memulai:

Patch Keamanan SUPEE-9767 - Kemungkinan masalah?

Anda perlu memperbarui file template Anda. Harap dicatat hanya ada beberapa jam sejak rilis tambalan ini dan untuk saat ini kami harus berurusan dengan apa yang bersifat publik. Saya cukup yakin di hari-hari berikutnya segalanya akan diklarifikasi.

EDIT: Terima kasih telah memilih! Maaf saya tidak bisa memberikan solusi dalam 8 jam sejak merilis patch ini.

ADDISON74
sumber
3
Ya, saya telah memeriksa semua file templat pada instalasi tempat saya melihat masalahnya. Saya telah memperbarui pertanyaan di atas - pada instalasi uji vanilla Magento 1.9.3.3 tanpa modifikasi, saya tampaknya memiliki masalah yang sama. Instalasi pengujian 1.9.2.4 juga menggunakan paket / tema default (segar, tidak dimodifikasi).
RickyMage123
Saya mencoba dengan 1.7.0.2 dan hal yang sama, pelanggan tidak pernah terdaftar ketika kunci Formulir Diaktifkan.
Ikon
1
Saya akan melakukan beberapa penyelidikan membandingkan 1.9.2.4 dengan 1.9.3.3 dan melihat apa perbedaannya. Saya belum menginstal dari awal 1.9.3.3. Saya akan memposting laporan di tautan yang disebutkan di atas.
ADDISON74
2
Akan diperbarui jika saya menemukan masalah; telah mengangkat laporan bug di Magento karena ini tampaknya menjadi masalah dengan instalasi 1.9.3.3 yang tidak dimodifikasi.
RickyMage123
1
Pelacak Bug di Magento itu bukan cara untuk melaporkan, itu tidak berguna. Saya melakukannya sebelum bertahun-tahun, memberikan solusi, dan tidak ada yang berubah dalam kode. Tidak ada yang mendengarkan di sana, tetapi mereka mendengarkan di Magento 2! Saya selalu menemukan solusi di tempat lain selain situs web Magento. Saran saya adalah melakukan beberapa tes sebelum memperbarui situs web produksi Anda. Dengan masalah baru, saya pikir kita akan melihat pembaruan baru lebih cepat dari yang kita pikirkan. Hal yang sama terjadi antara 1.9.3.0 dan 1.9.3.1.
ADDISON74
1

Terima kasih untuk patch @ Raphael di Digital Pianism.

Untuk kenyamanan, saya membuat diff agar Anda dapat dengan cepat menerapkan tambalan.

 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);
Brainski
sumber
1

Versi 2 dari patch SUPEE-9767 dirilis sebelumnya hari ini, bersama dengan Magento CE 1.9.3.4 . V2 memperbaiki sejumlah masalah, termasuk bug pendaftaran checkout ini.

Anda dapat meningkatkan ke versi terbaru (1.9.3.4), atau mengembalikan V1 dan kemudian menerapkan V2 tambalan. Pilihan mana pun akan menyelesaikan masalah.

Perubahan resmi dalam V2 secara efektif sama dengan yang dijelaskan Peter O'Callaghan, menghilangkan tiga baris yang ditambahkan Mage_Checkout_OnepageController::saveMethodAction.

Ryan Hoerr
sumber