Я получаю журналы исключений для этой ошибки в производственной среде, но я не могу воспроизвести проблему в моей локальной или промежуточной среде, поэтому ее довольно сложно устранить.
Ошибка возникает Mage_Sales_Model_Service_Quote::_validate()
из-за того, что $rate
возвращается $rate = $address->getShippingRateByCode($method)
пустым.
Я добавил некоторые записи в журнал, чтобы попытаться получить лучшее представление о том, что происходит, и я вижу, что в нем $method
указан правильный способ доставки.
Мое лучшее предположение состоит в том, что в какой-то момент процесса тарифы на доставку удаляются до того времени, когда они должны быть.
Я заметил, что каждый раз, когда возникает это исключение, оно происходит сразу после законного исключения, такого как недействительная кредитная карта. Я пытался воспроизвести проблему, используя недействительную кредитную карту, а затем действительную, но она не воспроизводится для меня - при постановке, производстве или локальной.
Моя первоначальная догадка заключалась в том, что, возможно, метод доставки терялся где-то после первого допустимого исключения, но это не так, потому что я вижу, что оно $method
имеет правильное значение в момент, когда выбрасывается это исключение.
Модуль извлечения, который я использую, - 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.'));
}
}