SUPEE-9767 Patch / CE 1.9.3.3-1ページのチェックアウト-顧客登録の問題


19

新規の顧客登録チェックアウトが成功した後、 SUPEE-8788、SUPEE-9652、およびSUPEE-9767でパッチされ、新しい「チェックアウト時のフォームキー検証を有効にする」設定がオンになっているMagento 1.9.2.4のクリーンなバニラインストールでデフォルトのOne Page Checkoutの場合、新しい顧客は作成されず、顧客はログインしませんが、注文は順調に進みます。

[チェックアウト時のフォームキー検証を有効にする]設定をオフにすると、この機能が再び機能します。他の誰かがこの問題を抱えていましたか?どの配送/支払い方法が使用されるかは問題ではないようです。

それ以来、Magento 1.9.3.3の新しい、変更されていないインストールでこれを試しましたが、同じ問題があるようです。1ページのチェックアウトで新規顧客を登録する場合、「チェックアウト時のフォームキー検証を有効にする」設定がオンになっている限り、注文が正常に完了しても顧客は作成されません。

回答:


36

OK、私が思いついた本当のバグ修正です。

以下を置き換えて/skin/frontend/base/default/js/opcheckout.jssetMethod()メソッドを編集および編集します。

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を待っている間にそれを行います


いいね 適切な入力フィールドを見つけるためにプロトタイプを作成するのは面倒でした。
ピーターオキャラハン

@ PeterO'Callaghanプロトタイプは、jQueryに慣れていると動作しにくいです^^
Digital PianismのRaphael

1
この時点でチェックアウトに「form_key」という名前の要素がない場合はどうなりますか?発生する可能性はどれくらいですか?
アリエンMiedema

1
@paj教えてくれてありがとう。いくつかのショップに問題なく実装しました
Arjen Miedema

1
@RaphaelatDigitalPianism:私はあなたのやり方を試しましたが、それは私を助けませんでした、どんな考えですか?
アヌラグハンデルヴァル

15

登録を選択して続行すると、JSスクリプトは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関数に戻ると、戻り値で何も実行しようとしていないため、他に何も起こらず、JSが続行することがわかります。この時点でJSは設定されてthis.method = 'register'いますが、引用符は更新されていないためcheckout_method、デフォルトの「ゲスト」も更新されていません。

JSは顧客が選択した登録を知っているため、パスワードフィールドが表示されるため、その表面には登録しているように見えます。しかし、PHP側に関する限り、これはゲストチェックアウトであるため、チェックアウトの完了時に顧客を作成しません。

編集:最も簡単な修正は、saveMethodActionからこれら3行をコメントアウトすることです。より正確で複雑なソリューションはsetMethod、ページからform_keyを取得し、AJAXリクエストで送信することです。


私たちが見つけることができるパスを提供してください:this-> isFormkeyValidationOnCheckoutEnabled()&&!$ this-> _ validateFormKey-
アイコン

skin / frontend / base / default / js / opcheckout.jsにはその関数は含まれていません。
アイコン

2
form_keyをチェックするコードスニペットはからapp/code/core/Mage/Checkout/controllers/OnepageController.phpです。これは、JSがリクエストを行ってform_keyを送信しないことが原因です。これはパッチのバグです。v2が必要だと思います。
ピーターオキャラハン

2
またはパッチv2のまで、単にシステム/構成/管理を無効にする- >セキュリティ- >通知をもたらす0これまでの設定「フォームのキーの検証でチェックアウトを有効にする」が、パッチの後、我々はそれを再度有効にすることができV2
イェルーン

1
少し掘り下げてくれてありがとう、ピーター。Magentoの誰かがこれを拾うか、バグレポートに気付くと、v2が届きます。
RickyMage123

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代わりに送信する必要があります。この障害(パッチ)をmagentoコアチームに報告する必要があります。
アダーシュカトリ

@AdarshKhatriこれは間違っているかもしれませんが、動作します!そして、はい、magentoチームは今までに知っている必要があります。できれば二重にメッセージを送信します。
アイコン

2
@AdarshKhatri私はあなたに同意します。これらの2行にコメントを付けると、問題はなくなりますが、パッチの目標もなくなります。私は同じ問題を抱えており、今のところそれを適切に修正する方法を理解することはできません...
DarkCowboy

むしろコメントアウトよりisFormkeyValidationOnCheckoutEnabled():あなただけが最善の解決策があるRaphaels管理者の設定を無効にすることができmagento.stackexchange.com/a/177125/2671
DanCarlyon

@DanCarlyonラファエルがやったことは素晴らしい仕事です。Magentoが問題があることを認める数日前に、私はPeterによって提案された短期的な修正の指示を提供しました。私は、これが理想的な解決策ではなく、バックエンドからフォームキーを無効にするのと同じように修正することに同意します。
アイコン

1

開始する良い点:

セキュリティパッチSUPEE-9767-考えられる問題?

テンプレートファイルを更新する必要があります。このパッチのリリースからわずか数時間であり、現時点では公開されているものに対処する必要があることに注意してください。私は次の日に物事が明らかになると確信しています。

編集:ダウン投票していただきありがとうございます!このパッチをリリースしてから8時間以内に解決策を提供できないのが残念です。


3
はい、問題を発見したインストールのすべてのテンプレートファイルを確認しました。上記の質問を更新しました-変更なしでMagento 1.9.3.3のテストバニラインストールで、同じ問題が発生しているようです。テスト1.9.2.4のインストールでは、デフォルト(未修正の)パッケージ/テーマも使用していました。
-RickyMage123

1.7.0.2で試しましたが、Formsキーが有効になっていると、顧客が登録されません。
アイコン

1
1.9.2.4と1.9.3.3を比較する調査を行い、違いを確認します。まだ1.9.3.3を最初からインストールしていません。上記のリンクにレポートを投稿します。
-ADDISON74

2
問題が見つかったら更新します。これは修正されていない1.9.3.3インストールの問題と思われるため、Magentoでバグレポートを提出しました。
-RickyMage123

1
Magentoのバグトラッカーは報告する方法ではなく、役に立たないものです。私は何年も前にそれをし、解決策を与えましたが、コードには何も変更がありませんでした。誰も聞いていませんが、Magento 2で聞いています!常に、MagentoのWebサイト以外の場所で解決策を見つけました。私のアドバイスは、実稼働Webサイトを更新する前にいくつかのテストを行うことです。新しい問題については、私たちが考えているよりも早く新しいアップデートが表示されると思います。1.9.3.0と1.9.3.1の間でも同じことが起こりました。
-ADDISON74

1

Digital Pianismの@ Raphaelのパッチに感謝します。

便宜上、差分を作成して、パッチをすばやく適用できるようにしました。

 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の公式の変更は、Peter O'Callaghanが説明したものと事実上同じで、に追加された3行を削除しMage_Checkout_OnepageController::saveMethodActionます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.