Ho riscontrato i registri delle eccezioni per questo errore nella produzione, ma non riesco a riprodurre il problema nel mio ambiente locale o di gestione temporanea, quindi è stato piuttosto difficile da risolvere.
L'errore ha origine Mage_Sales_Model_Service_Quote::_validate()
perché $rate
restituito da $rate = $address->getShippingRateByCode($method)
è vuoto.
Ho aggiunto un po 'di registrazione per cercare di avere un'idea migliore di ciò che stava succedendo e posso vedere che $method
contiene il metodo di spedizione corretto.
La mia ipotesi migliore è che ad un certo punto del processo, le tariffe di spedizione vengano eliminate prima di quando dovrebbero essere.
Ho notato che ogni volta che si verifica questa eccezione, si verifica immediatamente dopo un'eccezione legittima, come una carta di credito non valida. Ho provato a riprodurre il problema utilizzando una carta di credito non valida, quindi valida, ma non si riproduce per me, in scena, produzione o locale.
Il mio sospetto iniziale era che forse il metodo di spedizione si stava perdendo da qualche parte dopo la prima eccezione valida, ma non è così, perché vedo che $method
ha il valore corretto nel momento in cui viene generata questa eccezione.
Il modulo di checkout che sto usando è AwesomeCheckout - non mi risulta che abbia una logica personalizzata durante la creazione di ordini che dovrebbero causare problemi qui, ma potrebbero essere correlati.
AGGIORNAMENTO: Ho aggiunto del codice per tentare di recuperare le tariffe se mancano.
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.'));
}
}