1

今日、私は Magento 2 の支払いモジュールの作業を開始しました。多くの試行錯誤の後、設定可能で制限のある支払いモジュールができました。

さて、次のステップは、注文後にトランザクションリクエストを開始することです. Magento 1 内では、 getOrderPlaceRedirectUrl() を使用して、消費者がリダイレクトされる URL を返します。

Magento 2 でこれを試すと、関数が呼び出されますが、戻り URL へのリダイレクトは行われません。

これがMagento 2内で変更されたのか、それとも私が間違っているのか誰か知っていますか?

関数は次のようになります。

public function getOrderPlaceRedirectUrl(){


    return $this->_urlBuilder->getUrl('module/controller/method');

}
4

2 に答える 2

4

私は同じ問題に直面しました。getOrderPlaceRedirectUrl のデバッグに数日を費やした後、支払いゲートウェイへのリダイレクトの JavaScript (一種のハック) バージョンを実行することになりました。私の推測では、Magento 2 は新しいチェックアウト フローでそれをまだ実装していませんでした。私が間違っている可能性があるので、これを行うための設計された方法があるかどうか、Magento チームに確認してください。調査する時間がなかっただけです。

私が行ったことは、支払い方法の JavaScript レンダラー ファイルを変更し、そこにリダイレクトを実装することです。このようなもの:

/*browser:true*/
/*global define*/
define(
[
    'jquery',
    'Magento_Checkout/js/view/payment/default',
    'Magento_Checkout/js/action/place-order',
    'Magento_Checkout/js/action/select-payment-method',
    'Magento_Customer/js/model/customer',
    'Magento_Checkout/js/checkout-data',
    'Magento_Checkout/js/model/payment/additional-validators',
    'mage/url',
],
function (
    $,
    Component,
    placeOrderAction,
    selectPaymentMethodAction,
    customer,
    checkoutData,
    additionalValidators,
    url) {
    'use strict';

    return Component.extend({
        defaults: {
            template: 'My_Module/payment/form-template'
        },

        placeOrder: function (data, event) {
            if (event) {
                event.preventDefault();
            }
            var self = this,
                placeOrder,
                emailValidationResult = customer.isLoggedIn(),
                loginFormSelector = 'form[data-role=email-with-possible-login]';
            if (!customer.isLoggedIn()) {
                $(loginFormSelector).validation();
                emailValidationResult = Boolean($(loginFormSelector + ' input[name=username]').valid());
            }
            if (emailValidationResult && this.validate() && additionalValidators.validate()) {
                this.isPlaceOrderActionAllowed(false);
                placeOrder = placeOrderAction(this.getData(), false, this.messageContainer);

                $.when(placeOrder).fail(function () {
                    self.isPlaceOrderActionAllowed(true);
                }).done(this.afterPlaceOrder.bind(this));
                return true;
            }
            return false;
        },

        selectPaymentMethod: function() {
            selectPaymentMethodAction(this.getData());
            checkoutData.setSelectedPaymentMethod(this.item.method);
            return true;
        },

        afterPlaceOrder: function () {
            window.location.replace(url.build('mymodule/standard/redirect/'));
        }
    });
}
);

afterPlaceOrder がここでの重要な変更です。これにより、[注文] をクリックした直後に、内部コントローラー「mymodule/standard/redirect」にリダイレクトされます。次に、このコントローラーを使用して外部リダイレクトを構築します。通常は、支払いゲートウェイ ページに送信された POST フォームです。

ここで重要なのは、次のことに注意することです。

  1. 「mymodule/standard/redirect」は注文ページからデータを受信しないため、このアプローチは、チェックアウト プロセス中に顧客がデータを入力せずに外部リダイレクトを構築できる場合にのみ可能です。
  2. 「mymodule/standard/redirect」は基本的に JavaScript ファイルにハードコードされているため、「ハック」参照です。
于 2015-11-01T19:54:47.487 に答える