J'ai reçu des journaux d'exceptions pour cette erreur de production, mais je ne parviens pas à reproduire le problème dans mon environnement local ou intermédiaire, il a donc été assez difficile à résoudre.
L'erreur provient du Mage_Sales_Model_Service_Quote::_validate()
fait que le $rate
retourné par $rate = $address->getShippingRateByCode($method)
est vide.
J'ai ajouté de la journalisation pour essayer d'avoir une meilleure idée de ce qui se passait, et je peux voir que $method
contient la bonne méthode d'expédition.
Ma meilleure supposition est qu'à un moment donné du processus, les tarifs d'expédition sont supprimés avant le moment où ils devraient l'être.
J'ai remarqué que chaque fois que cette exception se produit, elle se produit immédiatement après une exception légitime, telle qu'une carte de crédit invalide. J'ai essayé de reproduire le problème en utilisant une carte de crédit non valide, puis une carte valide, mais elle ne se reproduit pas pour moi - en mise en scène, en production ou en local.
Mon intuition initiale était que la méthode d'expédition se perdait peut-être quelque part après la première exception valide, mais ce n'est pas le cas, car je vois que cela $method
a la bonne valeur au moment où cette exception est levée.
Le module de paiement que j'utilise est AwesomeCheckout - il n'a pas vraiment à ma connaissance de logique personnalisée lors de la création de commandes qui devrait causer des problèmes ici, mais pourrait être lié.
MISE À JOUR: J'ai ajouté du code pour tenter de récupérer les tarifs s'ils sont manquants.
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.'));
}
}