结帐时出现“请指定送货方式”异常


18

我一直在生产中获取此错误的异常日志,但无法在本地或暂存环境中重现该问题,因此很难进行故障排除。

产生此错误的Mage_Sales_Model_Service_Quote::_validate()原因是$rate返回的$rate = $address->getShippingRateByCode($method)为空。

我添加了一些日志记录,以尝试更好地了解正在发生的事情,并且可以看到其中$method包含正确的运输方法。

我最好的猜测是,在此过程中的某个时候,运费应在应有的时候删除。

我注意到,每次发生此异常时,都会在合法异常(例如无效的信用卡)之后立即发生。我试图通过使用无效的信用卡(然后是有效的信用卡)来重现该问题,但是对于我而言,无论是分期,制作还是本地,都无法重现。

我最初的预感是,可能在第一个有效异常之后某处丢失了运输方法,但事实并非如此,因为$method在抛出此异常时,我认为该方法具有正确的值。

我正在使用的checkout模块是AwesomeCheckout-据我所知,在创建应该在此处引起问题的订单时,它实际上没有任何自定义逻辑,但可能是相关的。

更新:我添加了一些代码以尝试重新收集丢失的费率。

protected function _validate()
{
    if (!$this->getQuote()->isVirtual()) {
        $address = $this->getQuote()->getShippingAddress();
        $addressValidation = $address->validate();
        if ($addressValidation !== true) {
            Mage::throwException(
                Mage::helper('sales')->__('Please check shipping address information. %s', implode(' ', $addressValidation))
            );
        }
        $method= $address->getShippingMethod();
        $rate  = $address->getShippingRateByCode($method);

        /**
         * Start Customization
         */
        if (!$this->getQuote()->isVirtual() && !$rate) {
            Mage::logException(new Exception("Rate was empty inside quote validate method, trying to forcefully recalculate"));
            $this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
            $this->getQuote()->setTotalsCollectedFlag(false);
            $this->getQuote()->collectTotals();
            $rate  = $address->getShippingRateByCode($method);
        }
        /** End Customization **/             

        if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
            Mage::throwException(Mage::helper('sales')->__('Please specify a shipping method.'));
        }
    }

您是否正在使用第三方运输扩展?与本地Magento的方法类似flatrate测试将或许能给一些有识之士无论是结账延伸或扩展出货
桑德甜菜

1
我还看到一家商店在生产中经常发生这种情况,通常是连续多次。我们从未能够在任何环境中繁殖自己。
彼得·奥卡拉汉

@Sander,是的,我们正在使用第三方扩展。我很确定这不是根本原因,因为它可以通过collectRates()方法返回费率,即使在失败的情况下,我也可以看到通过API返回的费率也很好。
kalenjordan

@Cags,真的吗?!很高兴知道,也许我们必须为此添加标签。这是很重要的事情之一,但是因为它很少复制,所以它不是主要的优先事项。
kalenjordan

@SanderMangel,不幸的是,无法采用统一价格进行尝试,因为我们不能仅仅停止向生产中的数百个客户提供正确的运费,以尝试重现该问题。如果我可以在本地环境中重现此代码,那么肯定会尝试使用香草运输方法进行测试。
kalenjordan

Answers:


8

您必须了解费率如何工作以及如何提出要求。基本上,->setCollectShippingRates(true)在shippinAddress对象上设置时会请求费率,它会导致费率被收集并存储在费率表中。此后清空该表,并根据新的费率要求再次填写。

在您的情况下,发生的情况是引发错误并重复了请求,并且未请求费率,但期望费率在那儿。因此,请尝试强行收取费用

getQuote()->getShippingAddress()->setCollectShippingRates(true);

然后尝试重新收集总计,如果它不起作用

getQuote()->setTotalsCollectedFlag(false)->collectTotals();

警告:如果某些扩展未能正确实现合计对象,则多次调用collectTotals可能会弄乱您的合计(一个常见缺陷)


谢谢,很有道理。知道为什么这种情况很少发生吗?如果付款错误正在重置费率,我希望每次发生付款错误时都会发生。
kalenjordan

这取决于标志,并且是否可以在错误时复制它,是否调用它,则很容易使用调试器进行跟踪。但是,如果您的付款方式错误并不能完全往返服务器,而只是通过退出中断请求,则可能会中断所有相关的观察员等执行
Anton S

添加了一些代码,但仍然失败。我确实忘记了这$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)条线,所以现在我要尝试一下。
kalenjordan 2013年

再次发生该问题,并且我拥有的代码确实阻止了异常的发生。但是交易仍然失败了,因为同时脑力衰竭了几分钟。难以置信的。
kalenjordan

1
好了 这次发生的原因是完全不同的原因。试图为一个实际上没有可用运费的地址生成一个订购单,因此错误消息是有效的。@ProxiBlue
kalenjordan 2013年

3

可能已经知道了。我有一个相关的异常与该异常发生的频率相同,即“请求的付款方式不可用”。

事实证明,发生这种情况的原因是因为我的一位观察者sales_place_order_after正在创建一个报价对象(并保存该报价对象)以生成一些订阅价格。

通过首先以不良信用卡作为新客户(未登录)签出,然后返回并修复信用卡并尝试再次签出,从而能够重现该文件。

之所以引发异常,是因为在的loadCustomerQuote观察者中customer_login,如果您有多个报价,它将把您的报价合并在一起,这样做会丢失报价上的一些付款方式信息。

解决方法是删除我在订阅观察器中创建的新报价。

更新:不,针对“请求的付款方式不可用”的修复无法解决此问题,仍在发生。


很晚了,但这就是为什么我不再使用该事件(以后的销售订单)的原因。如果我在下订单后需要做些事情,我会进入队列。
philwinkle

同样,您将帮助我解决结帐页面错误中的“请指定送货方式”:magento.stackexchange.com/q/225297/57334
zus

0

请注意,有时在下订单时,PayPal Express会给出错误消息,指出“未确认付款人”。此错误源于相同的“请指定运输方式”异常。在Magento 1.8.1.0中,可以通过在下订单时引起“报价合并”或“购物车合并”来轻松重现这一点。合并报价或购物车将导致清除运费,但不会重新计算。实际上,您不想解决此问题,因为那样的话,客户可能会支付比他们同意的价格还要多的钱!相反,您将需要删除合并功能-或升级Magento。

在1.9中已修复。客户首先必须登录,然后才能重定向到PayPal。


0

就我而言,此错误的起因null$method和中的值$rate

$method= $address->getShippingMethod();
$rate  = $address->getShippingRateByCode($method);
    if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
Mage::throwException(Mage::helper('sales')->__('Please specify a 
shipping method.'));
}

所以我为此设定了一个比率。在您的magento中可用的方法和费率

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.