Ich habe Ausnahmenprotokolle für diesen Fehler in der Produktion erhalten, kann das Problem jedoch nicht in meiner lokalen Umgebung oder in der Staging-Umgebung reproduzieren. Daher ist die Problembehandlung recht schwierig.
Der Fehler entsteht, Mage_Sales_Model_Service_Quote::_validate()
weil das $rate
zurückgegebene von $rate = $address->getShippingRateByCode($method)
leer ist.
Ich habe einige Protokollierungen hinzugefügt, um eine bessere Vorstellung davon zu bekommen, was vor sich ging, und ich sehe, dass diese $method
die richtige Versandmethode enthalten.
Ich gehe davon aus, dass zu einem bestimmten Zeitpunkt die Versandkosten gelöscht werden, bevor sie angezeigt werden.
Ich habe festgestellt, dass diese Ausnahme bei jedem Auftreten unmittelbar nach einer legitimen Ausnahme auftritt, z. B. einer ungültigen Kreditkarte. Ich habe versucht, das Problem mit einer ungültigen und dann gültigen Kreditkarte zu reproduzieren, aber es wird für mich nicht reproduziert - in der Inszenierung, Produktion oder vor Ort.
Meine anfängliche Vermutung war, dass die Versandmethode möglicherweise irgendwo nach der ersten gültigen Ausnahme verloren gegangen ist, aber das ist nicht der Fall, da ich sehe, dass sie $method
zum Zeitpunkt des Auslösens dieser Ausnahme den richtigen Wert hat.
Das Checkout-Modul, das ich verwende, ist AwesomeCheckout - es verfügt meines Wissens nicht über eine benutzerdefinierte Logik beim Erstellen von Aufträgen, die hier Probleme verursachen sollten, aber möglicherweise in Zusammenhang stehen.
UPDATE: Ich habe einen Code hinzugefügt, um zu versuchen, die Preise zu ermitteln, falls sie fehlen.
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.'));
}
}