私は同じ問題に直面しました。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 フォームです。
ここで重要なのは、次のことに注意することです。
- 「mymodule/standard/redirect」は注文ページからデータを受信しないため、このアプローチは、チェックアウト プロセス中に顧客がデータを入力せずに外部リダイレクトを構築できる場合にのみ可能です。
- 「mymodule/standard/redirect」は基本的に JavaScript ファイルにハードコードされているため、「ハック」参照です。