在我使用Authorize.net Direct Post作为付款方式构建的网站中,我遇到了一个问题,即订单成功完成后购物车不会被停用。在Mage_Authorizenet_Model_Directpost中,作为订单授权步骤的一部分,我能够在第574行确认报价已被停用。
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不会将回复转发回我的本地。
感谢您提供任何帮助。
答案 0 :(得分:2)
据我所知,如果Authorize.net的请求参数包含错误消息,即使成功,也可以调用_returnCustomerQuote。这是来自Mage_Authorizenet_Directpost_PaymentController的redirectAction
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 [合并]来告诉我的情况,/checkout/onepage
有一个条目转到/authorizenet/directpost_payment/returnQuote
。
在我的头发拉了一段时间并挖掘代码并进行一些研究后,我觉得这只能是loadIframe函数中的一个错误,该函数绑定到directpost.js中的onLoadIframe。
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控制器,并且如果响应中没有错误,则返回报价,从而使其保持活动状态并且项目保留在购物车中...
这对我没有意义,所以我从this.hasError中删除了爆炸。现在购物车在订单后被清除了,我似乎没有任何其他问题
现在看起来像这样,我很想有人告诉我我错了(认真)。
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);
}
}
},
似乎这就是'sales_order_create'控制器的情况,但我暂时离开Magento。