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(有点像 hack)版本。我的猜测是 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 文件中,因此是“hack”参考。
于 2015-11-01T19:54:47.487 回答
0

我发现的支付网关最好的分析是贝宝模块。如果你看到

./vendor/magento/module-paypal/view/frontend/web/js/action/set-payment-method.js

您会看到他们如何将用户重定向到某个 url。此 url 由配置提供程序提供。

就我而言,我开发了一个重定向控制器,将用户重定向到支付网关。

流程是:

Checkout -> (js) -> Redirect Controller -> (php) -> External Gateway -> Success/Cancel Controller -> (php) -> Checkout Onepage Success

于 2016-08-26T14:46:19.573 回答