Dostaję dzienniki wyjątków dla tego błędu w produkcji, ale nie jestem w stanie odtworzyć problemu w moim środowisku lokalnym lub przejściowym, więc bardzo trudno było go rozwiązać.
Błąd pochodzi, Mage_Sales_Model_Service_Quote::_validate()
ponieważ $rate
zwrócony przez $rate = $address->getShippingRateByCode($method)
jest pusty.
Dodałem trochę logowania, aby spróbować lepiej zrozumieć, co się dzieje, i widzę, że $method
zawiera prawidłową metodę wysyłki.
Domyślam się, że w pewnym momencie procesu koszty wysyłki są usuwane przed, kiedy powinny.
Zauważyłem, że za każdym razem, gdy wystąpi ten wyjątek, dzieje się to natychmiast po uzasadnionym wyjątku, takim jak nieważna karta kredytowa. Próbowałem odtworzyć problem, używając nieważnej, a następnie ważnej karty kredytowej, ale dla mnie nie jest ona reprodukowana - na etapie inscenizacji, produkcji ani lokalnym.
Moje początkowe przeczucie było takie, że być może metoda wysyłki gubiła się gdzieś po pierwszym ważnym wyjątku, ale tak nie jest, ponieważ widzę, że $method
ma ona prawidłową wartość w momencie zgłoszenia tego wyjątku.
Moduł kasy, którego używam, jest AwesomeCheckout - tak naprawdę według mojej wiedzy nie ma żadnej niestandardowej logiki podczas tworzenia zamówień, które powinny powodować problemy tutaj, ale mogą być powiązane.
AKTUALIZACJA: Dodałem jakiś kod, aby spróbować przypomnieć stawki, jeśli ich brakuje.
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.'));
}
}