【问题标题】:Magento Authorize.net Direct Post not emptying cart (not setting quote as inactive)Magento Authorize.net Direct Post 未清空购物车(未将报价设置为无效)
【发布时间】:2015-03-22 16:05:41
【问题描述】:

在我正在构建的一个使用 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 不会将响应转发回我的本地,因此我无法单步执行代码,因此我很难调试它。

感谢您提供的任何帮助。

【问题讨论】:

    标签: magento authorize.net onepage-checkout


    【解决方案1】:

    据我所知,如果来自 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 [combined] 来判断我的情况,有一个条目来自 /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 中删除了 bang。现在下单后购物车清了,我好像没有其他问题了

    现在看起来像这样,我希望有人告诉我我错了(严重)。

    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。

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2013-06-20
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多