SUPEE-9767 Patch / CE 1.9.3.3 - Thanh toán một trang - Vấn đề đăng ký khách hàng


19

Trên bản cài đặt Magento 1.9.2.4 sạch sẽ, được vá bằng SUPEE-8788, SUPEE-9652 và SUPEE-9767 và với cài đặt 'Bật xác thực khóa biểu mẫu trên thanh toán' mới được bật, sau khi kiểm tra đăng ký khách hàng mới thành công Thanh toán một trang mặc định, không có khách hàng mới nào được tạo và khách hàng không đăng nhập, mặc dù đơn hàng vẫn ổn.

Tắt cài đặt 'Bật xác thực khóa biểu mẫu khi thanh toán' sẽ khiến công việc này hoạt động trở lại. Có ai khác có vấn đề này? Dường như không có vấn đề gì về phương thức vận chuyển / thanh toán được sử dụng.

Kể từ đó, tôi đã thử điều này với bản cài đặt Magento 1.9.3.3 mới, chưa được thay đổi và dường như nó cũng có cùng một vấn đề. Khi đăng ký một khách hàng mới thông qua thanh toán một trang, không có khách hàng nào được tạo ngay cả khi đơn hàng được xử lý tốt, miễn là cài đặt 'Bật xác thực khóa biểu mẫu khi thanh toán' được bật.

Câu trả lời:


36

Ok đây là bản sửa lỗi thực sự tôi nghĩ ra.

Chỉnh sửa /skin/frontend/base/default/js/opcheckout.jsvà chỉnh sửa setMethod()phương thức bằng cách thay thế:

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

Với:

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

Điều đó sẽ làm điều đó trong khi chúng tôi chờ đợi bản v2 của bản vá


Tốt đẹp. Tôi đã quá lười biếng để tìm ra nguyên mẫu để tìm một trường đầu vào thích hợp.
Peter O'Callaghan

@ PeterO'Callaghan yeah nguyên mẫu rất khó hoạt động khi bạn đã quen với jQuery ^^
Raphael tại Digital Pianism

1
Điều gì xảy ra khi bạn không có thành phần nào có tên "form_key" trong thanh toán của bạn tại thời điểm này? Làm thế nào lớn là những cơ hội sẽ xảy ra?
Arjen Miedema

1
@paj cảm ơn đã cho tôi biết. Hiện đã triển khai nó cho một số cửa hàng mà không có vấn đề gì
Arjen Miedema

1
@RaphaelatDigitalPianism: Tôi đã thử cách của bạn nhưng điều đó không giúp tôi, có ý kiến ​​gì không?
Anurag Khandelwal

15

Khi bạn chọn đăng ký và tiếp tục, tập lệnh JS gọi checkout.setMethod(), được đặt trong skin/frontend/base/default/js/opcheckout.js. Từ đó chúng ta có thể thấy nó thực hiện một yêu cầu AJAX POST this.saveMethodUrl, nhưng tham số duy nhất mà nó chuyển qua là method. Nếu chúng ta nhìn vào Mage_Checkout_OnepageController::saveMethodAction, đó là mục tiêu của yêu cầu AJAX đó, chúng ta có thể thấy rằng bản vá được thêm vào:

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

_validateFormKeytìm kiếm một form_keytham số trong yêu cầu và vì setMethodyêu cầu JS không gửi yêu cầu này khi nó thực hiện yêu cầu AJAX, nên nó chỉ đơn giản là quay lại sớm và không làm gì cả. Quay trở lại setMethodhàm và chúng ta có thể thấy rằng vì nó không cố gắng làm bất cứ điều gì với giá trị trả về, nên không có gì khác xảy ra và JS tiếp tục. Tại thời điểm này, JS đã đặt this.method = 'register'nhưng trích dẫn chưa được cập nhật, do đó, checkout_method'khách' mặc định.

Vì JS biết khách hàng đã chọn đăng ký, nó hiển thị các trường mật khẩu, do đó, trên mặt của nó, có vẻ như bạn đang đăng ký. Nhưng theo như phía PHP có liên quan, đó là thanh toán khách, vì vậy nó không tạo ra khách hàng khi thanh toán hoàn tất.

Chỉnh sửa: cách khắc phục đơn giản nhất là nhận xét ba dòng đó từ saveMethodAction. Giải pháp chính xác / phức tạp hơn là setMethodnên lấy form_key từ trang và gửi nó với yêu cầu AJAX.


Bạn có thể vui lòng cung cấp đường dẫn nơi chúng tôi có thể tìm thấy: this-> isFormkeyValidationOnCheckoutEnables () &&! $ This -> _ validateFormKey
Biểu tượng

skin / frontend / base / default / js / opcheckout.js không chứa chức năng đó.
Biểu tượng

2
Đoạn mã kiểm tra form_key là từ app/code/core/Mage/Checkout/controllers/OnepageController.php. Nó gây ra bởi JS khiến cho yêu cầu không gửi form_key. Đó là một lỗi với các bản vá. Tôi nghi ngờ sẽ phải có một v2.
Peter O'Callaghan

2
Hoặc cho đến khi vá v2, chỉ cần tắt cài đặt Hệ thống / Cấu hình / Quản trị viên -> Bảo mật -> "Bật xác thực khóa biểu mẫu khi thanh toán" thành 0 Điều này sẽ mang đến một thông báo, nhưng sau khi vá v2, chúng tôi có thể kích hoạt lại
Jeroen

1
Cảm ơn vì đã đào sâu hơn một chút, Peter. Hy vọng rằng ai đó từ Magento sẽ nhận được thông báo này hoặc nhận thấy báo cáo lỗi và chúng tôi sẽ nhận được v2.
RickyMage123

3

Tín dụng đầy đủ đi đến Peter cho giải pháp! Tôi muốn chỉ ra từng bước hướng dẫn những gì cần thay đổi.

Chuyển đến ứng dụng / mã / lõi / Mage / Checkout / bộ điều khiển / OnepageControll.php

Định vị:

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

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

Nhận xét dòng với / * * / tags.

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

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

2
Điều này là sai, bạn đang bình luận ra một bản vá được thêm vào. Theo như tôi biết về bản vá này, yêu cầu js nên gửi form keythay thế. Chúng ta nên báo cáo lỗi này (bản vá) cho nhóm cốt lõi magento.
Adarsh ​​Khatri

@AdarshKhatri Điều này có thể sai nhưng nó hoạt động! và Có, đội magento nên được nhận thức ngay bây giờ. Nhân đôi tin nhắn cho họ nếu bạn có thể.
Biểu tượng

2
@AdarshKhatri Tôi đồng ý với bạn. Nhận xét 2 dòng này sẽ loại bỏ vấn đề, nhưng cũng loại bỏ mục tiêu vá lỗi. Tôi đã gặp vấn đề tương tự và không thể hiểu cách khắc phục đúng cách vào lúc này ...
DarkCowboy

Thay vì bình luận, isFormkeyValidationOnCheckoutEnabled()bạn chỉ có thể vô hiệu hóa cài đặt trong quản trị viên, tuy nhiên giải pháp tốt nhất là Raphaels: magento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyon Những gì Raphael đã làm là một công việc tuyệt vời. Tôi chỉ cung cấp hướng dẫn cho bản sửa lỗi ngắn hạn được đề xuất bởi Peter, vài ngày trước khi Magento thừa nhận có vấn đề. Tôi đồng ý không phải là giải pháp lý tưởng mà là cách khắc phục giống như vô hiệu hóa các khóa biểu mẫu khỏi back-end.
Biểu tượng

1

Một điểm tốt để bắt đầu:

Bản vá bảo mật SUPEE-9767 - Các vấn đề có thể xảy ra?

Bạn cần cập nhật các tập tin mẫu của bạn. Xin lưu ý rằng chỉ có một vài giờ kể từ khi phát hành bản vá này và hiện tại chúng tôi phải đối phó với những gì công khai. Tôi khá chắc chắn trong những ngày tiếp theo mọi thứ sẽ được làm rõ.

EDIT: Cảm ơn bạn đã bỏ phiếu! Tôi xin lỗi tôi không thể đưa ra giải pháp trong 8 giờ kể từ khi phát hành bản vá này.


3
Có, tôi đã xem qua tất cả các tệp mẫu khi cài đặt, nơi tôi phát hiện ra vấn đề. Tôi đã cập nhật câu hỏi ở trên - trên bản cài đặt vanilla thử nghiệm của Magento 1.9.3.3 mà không có sửa đổi, tôi dường như đang gặp vấn đề tương tự. Quá trình cài đặt 1.9.2.4 thử nghiệm cũng sử dụng gói / chủ đề mặc định (mới, chưa sửa đổi).
RickyMage123

Tôi đã thử với 1.7.0.2 và điều tương tự, khách hàng không bao giờ được đăng ký khi khóa Biểu mẫu được bật.
Biểu tượng

1
Tôi sẽ làm một số điều tra so sánh 1.9.2.4 với 1.9.3.3 và xem sự khác biệt là gì. Tôi chưa cài đặt từ đầu 1.9.3.3. Tôi sẽ đăng báo cáo trong liên kết được đề cập ở trên.
ĐỊA CHỈ74

2
Sẽ cập nhật nếu tôi tìm thấy vấn đề; đã đưa ra một báo cáo lỗi tại Magento vì đây dường như là một vấn đề với bản cài đặt 1.9.3.3 chưa được sửa đổi.
RickyMage123

1
Trình theo dõi lỗi đó tại Magento không phải là cách để báo cáo, nó là vô dụng. Tôi đã làm điều đó trước nhiều năm, đưa ra giải pháp và không có gì thay đổi trong mã. Không ai nghe ở đó, nhưng họ nghe trong Magento 2! Luôn luôn tôi tìm thấy giải pháp ở những nơi khác ngoài trang web Magento. Lời khuyên của tôi là làm một số thử nghiệm trước khi cập nhật trang web sản xuất của bạn. Với những vấn đề mới tôi nghĩ chúng ta sẽ thấy một bản cập nhật mới sớm hơn chúng ta nghĩ. Điều tương tự cũng xảy ra giữa 1.9.3.0 và 1.9.3.1.
ĐỊA CHỈ74

1

Cảm ơn bản vá @ Raphael tại Digital Pianism.

Để thuận tiện, tôi đã tạo một diff để bạn có thể nhanh chóng áp dụng bản vá.

 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

Phiên bản 2 của bản vá SUPEE-9767 đã được phát hành vào đầu ngày hôm nay, cùng với Magento CE 1.9.3.4 . V2 sửa một số vấn đề, bao gồm lỗi đăng ký thanh toán này.

Bạn có thể nâng cấp lên phiên bản mới nhất (1.9.3.4) hoặc hoàn nguyên V1 và sau đó áp dụng V2 của bản vá. Hoặc là tùy chọn sẽ giải quyết vấn đề.

Thay đổi chính thức trong V2 thực sự giống như Peter O'Callaghan đã mô tả, loại bỏ ba dòng được thêm vào Mage_Checkout_OnepageController::saveMethodAction.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.