Magento 2 - 没有重定向到外部付款提供者

时间:2015-10-29 14:16:37

标签: payment-gateway magento2

今天我开始为Magento 2开发支付模块。经过大量的尝试和错误,我现在有了一个可配置且有限制的支付模块。

现在,下一步是在下订单后启动交易请求。在Magento 1中,我将使用getOrderPlaceRedirectUrl()返回一个将重定向到消费者的URL。

当我尝试使用Magento 2时,会调用该函数,但不会对返回URL进行重定向。

有人知道Magento 2内部是否发生了变化,或者我做错了什么?

该功能如下:

public function getOrderPlaceRedirectUrl(){


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

}

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。在花了几天时间尝试调试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的/标准/重定向"不会从订单页面接收任何数据,因此只有在结账过程中没有客户输入数据的情况下才能构建外部重定向,才能实现此方法。
  2. " MyModule的/标准/重定向"基本上是在JavaScript文件中硬编码,因此" hack"参考

答案 1 :(得分:0)

我发现支付网关的最佳分析是paypal模块。 如果你看到了

  

./供应商/的magento /模块贝宝/视图/前端/网络/ JS /动作/设定付款method.js

您会看到他们将用户重定向到某个网址的行为。此URL由配置提供程序提供。

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

流程是:

结帐 - > (js) - >重定向控制器 - > (php) - >外部网关 - >成功/取消控制器 - > (php) - >结帐单页成功