今天我开始为Magento 2开发支付模块。经过大量的尝试和错误,我现在有了一个可配置且有限制的支付模块。
现在,下一步是在下订单后启动交易请求。在Magento 1中,我将使用getOrderPlaceRedirectUrl()返回一个将重定向到消费者的URL。
当我尝试使用Magento 2时,会调用该函数,但不会对返回URL进行重定向。
有人知道Magento 2内部是否发生了变化,或者我做错了什么?
该功能如下:
public function getOrderPlaceRedirectUrl(){
return $this->_urlBuilder->getUrl('module/controller/method');
}
答案 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 :(得分:0)
我发现支付网关的最佳分析是paypal模块。 如果你看到了
./供应商/的magento /模块贝宝/视图/前端/网络/ JS /动作/设定付款method.js
您会看到他们将用户重定向到某个网址的行为。此URL由配置提供程序提供。
就我而言,我开发了一个Redirect控制器,可以将用户重定向到支付网关。
流程是:
结帐 - > (js) - >重定向控制器 - > (php) - >外部网关 - >成功/取消控制器 - > (php) - >结帐单页成功