我一直在生产中获取此错误的异常日志,但无法在本地或暂存环境中重现该问题,因此很难进行故障排除。
产生此错误的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.'));
}
}