Magento Authorize.net Direct Post未清空购物车(未将报价设置为非活动)
在我正在建设的一个使用Authorize.net Direct Post作为付款方式的网站中,我遇到了一个问题,在成功完成订单后购物车将不会被停用。在Mage_Authorizenet_Model_Directpost中,我能够确认,作为订单授权步骤的一部分,第574行上的报价正在停用Magento Authorize.net Direct Post未清空购物车(未将报价设置为非活动),magento,authorize.net,onepage-checkout,Magento,Authorize.net,Onepage Checkout,在我正在建设的一个使用Authorize.net Direct Post作为付款方式的网站中,我遇到了一个问题,在成功完成订单后购物车将不会被停用。在Mage_Authorizenet_Model_Directpost中,我能够确认,作为订单授权步骤的一部分,第574行上的报价正在停用 Mage::getModel('sales/quote') ->load($order->getQuoteId()) ->setIsActive(false) ->
Mage::getModel('sales/quote')
->load($order->getQuoteId())
->setIsActive(false)
->save();
但是,在directpost.js中,当Authorize.net加载IFrame并调用returnQuote函数时,它将重定向到Mage_Authorizenet_directpost_PaymentController的returnQuoteAction,该操作将调用_returnCustomerQuote函数
if ($order->getId()) {
$quote = Mage::getModel('sales/quote')
->load($order->getQuoteId());
if ($quote->getId()) {
$quote->setIsActive(1)
->setReservedOrderId(NULL)
->save();
$this->_getCheckout()->replaceQuote($quote);
}
$this->_getDirectPostSession()->removeCheckoutOrderIncrementId($incrementId);
$this->_getDirectPostSession()->unsetData('quote_id');
if ($cancelOrder) {
$order->registerCancellation($errorMsg)->save();
}
}
请注意,报价再次被设置为活动报价。我不知道他们为什么这么做,除非订单取消了。我在想也许我在逻辑上遗漏了什么。我们已经做了一些一页结帐定制和一些实际订单提交的定制,但我没有看到任何会影响这一点。Magento是否希望报价稍后在调用链中被禁用?由于Authorize.net Direct Post不会将响应转发回本地服务器,因此我无法单步调试此代码
感谢您提供的帮助。据我所知,如果Authorize.net中的请求参数包含错误消息,即使成功,也可以调用_returnCustomerQuote。这是来自Mage_Authorizenet_Directpost_PaymentController的重定向操作
if (!empty($redirectParams['success'])
&& isset($redirectParams['x_invoice_num'])
&& isset($redirectParams['controller_action_name'])
) {
$this->_getDirectPostSession()->unsetData('quote_id');
$params['redirect_parent'] = Mage::helper('authorizenet')->getSuccessOrderUrl($redirectParams);
}
if (!empty($redirectParams['error_msg'])) {
$cancelOrder = empty($redirectParams['x_invoice_num']);
$this->_returnCustomerQuote($cancelOrder, $redirectParams['error_msg']);
}
但是,在我的情况下,我可以通过查看access.log[combined]来判断有一个条目来自/checkout/onepage
进入/authorizenet/directpost\u payment/returnQuote
在对代码进行了一段时间的研究之后,我觉得这可能只是directpost.js中绑定到onLoadIframe的loadIframe函数中的一个bug
loadIframe : function() {
if (this.paymentRequestSent) {
switch (this.controller) {
case 'onepage':
this.paymentRequestSent = false;
if (!this.hasError) {
this.returnQuote();
}
break;
case 'sales_order_edit':
case 'sales_order_create':
if (!this.orderRequestSent) {
this.paymentRequestSent = false;
if (!this.hasError) {
this.returnQuote();
} else {
this.changeInputOptions('disabled', false);
toggleSelectsUnderBlock($('loading-mask'), true);
$('loading-mask').hide();
enableElements('save');
}
}
break;
}
if (this.tmpForm) {
document.body.removeChild(this.tmpForm);
}
}
},
在我看来,它正在检查是否在重定向操作填充iframe时发送了付款请求。如果付款请求已发送,如果它正在使用onepage控制器,并且响应中没有错误,则返回报价,从而使其保持活动状态,并且商品仍保留在购物车中
这对我来说没有意义,所以我删除了这个.hasError的爆炸。现在,购物车在下单后被清空了,我似乎没有任何其他问题
现在看起来是这样,我希望有人能告诉我我错了(说真的)
看起来在“销售订单创建”控制器中会出现这种情况,但我现在不去管Magento了
loadIframe : function() {
if (this.paymentRequestSent) {
switch (this.controller) {
case 'onepage':
this.paymentRequestSent = false;
if (this.hasError) {
this.returnQuote();
}
break;
case 'sales_order_edit':
case 'sales_order_create':
if (!this.orderRequestSent) {
this.paymentRequestSent = false;
if (!this.hasError) {
this.returnQuote();
} else {
this.changeInputOptions('disabled', false);
toggleSelectsUnderBlock($('loading-mask'), true);
$('loading-mask').hide();
enableElements('save');
}
}
break;
}
if (this.tmpForm) {
document.body.removeChild(this.tmpForm);
}
}
},