Oke, inilah perbaikan bug yang sebenarnya saya buat.
Edit /skin/frontend/base/default/js/opcheckout.js
dan 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
Ketika Anda memilih mendaftar dan melanjutkan, skrip JS akan memanggil
checkout.setMethod()
, yang terletak diskin/frontend/base/default/js/opcheckout.js
. Dari sana kita dapat melihatnya membuat permintaan POST AJAXthis.saveMethodUrl
, tetapi satu-satunya parameter yang dilewati adalahmethod
. Jika kita melihatMage_Checkout_OnepageController::saveMethodAction
, yang merupakan target dari permintaan AJAX itu, kita dapat melihat bahwa tambalan menambahkan:Karena
_validateFormKey
mencariform_key
parameter dalam permintaan, dan karenasetMethod
permintaan JS tidak mengirim ini ketika membuat permintaan AJAX, itu hanya kembali lebih awal dan tidak melakukan apa-apa. Kembali kesetMethod
fungsi 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 ditetapkanthis.method = 'register'
tetapi kuotasi belum diperbarui, demikiancheckout_method
juga '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
setMethod
harus mengambil form_key dari halaman dan mengirimkannya dengan permintaan AJAX.sumber
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.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:
Komentari baris dengan / * * / tag.
sumber
form key
sebagai gantinya. Kami harus melaporkan kesalahan ini (tambalan) ke tim inti magento.isFormkeyValidationOnCheckoutEnabled()
Anda hanya dapat menonaktifkan pengaturan di admin namun solusi terbaik adalah Raphaels: magento.stackexchange.com/a/177125/2671Poin 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.
sumber
Terima kasih untuk patch @ Raphael di Digital Pianism.
Untuk kenyamanan, saya membuat diff agar Anda dapat dengan cepat menerapkan tambalan.
sumber
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
.sumber