【问题标题】:Magento 2 - No redirect to external payment provderMagento 2 - 没有重定向到外部支付提供商
【发布时间】:2016-01-29 17:45:06
【问题描述】:

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

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

当我使用 Magento 2 尝试此操作时,会调用该函数,但不会重定向到返回 url。

有谁知道这在 Magento 2 中是否发生了变化或者我做错了什么?

函数如下:

public function getOrderPlaceRedirectUrl(){


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

}

【问题讨论】:

  • 您是否有其他方法来实现这一目标?

标签: payment-gateway magento2


【解决方案1】:

我也遇到过同样的问题。在花了几天时间尝试调试 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”参考。

【讨论】:

  • 感谢您的回答,我会调查这个,因为大多数付款方式在结帐过程中不需要额外的数据。我也会就此联系 Magento,以确保这仍然是 Magento 2 的方式。
  • 我有办法从模型中做到这一点,比如 getOrderPlaceRedirectUrl()?我需要从订单中传递一些参数。
  • 你能分享一下你是如何重定向的,因为我的根本不工作
  • 已经四年了,所以你可能已经忘记了关于 magento 的一切,但我会试一试,因为我正在尝试使用你的方法。重定向到我的自定义控制器效果很好,但是如何访问控制器内的订单详细信息?
【解决方案2】:

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

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

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

在我的例子中,我开发了一个重定向控制器,将用户重定向到支付网关。

流程是:

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

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 2020-12-26
    • 1970-01-01
    • 2021-03-20
    • 2013-01-21
    • 1970-01-01
    • 2013-03-21
    • 2011-06-27
    • 2022-07-26
    相关资源
    最近更新 更多