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.'));
}
}
Réponses:
Vous devez comprendre comment fonctionnent les tarifs et comment ils sont demandés. Fondamentalement, les taux sont demandés lorsque
->setCollectShippingRates(true)
est défini sur l'objet shippinAddress et que les taux sont collectés et stockés dans la table des taux. Ce tableau est ensuite vidé et rempli à nouveau sur nouvelle demande de tarif.ce qui se passe dans votre cas, c'est qu'une erreur est lancée et que la demande est répétée et que les tarifs ne sont pas demandés mais devraient être là. Alors essayez de forcer la collecte des tarifs
puis essayez de récupérer les totaux aussi si cela ne fonctionne pas
soyez averti que l'appel de collectTotals plusieurs fois peut perturber vos totaux si une extension n'implémente pas correctement les objets de totaux (une faille commune)
la source
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)
ligne, donc je vais essayer maintenant.Pourrait avoir compris cela. J'ai eu une exception connexe qui était lancée avec à peu près la même fréquence que celle-ci, qui était "La méthode de paiement demandée n'est pas disponible".
Il s'avère que la raison pour laquelle cela se produisait était parce que l'un de mes observateurs était en train de
sales_place_order_after
créer un objet de devis (et de l'enregistrer) afin de générer des prix d'abonnement.J'ai pu le faire reproduire en vérifiant d'abord avec une mauvaise carte de crédit en tant que nouveau client (non connecté), puis en revenant et en corrigeant la carte de crédit et en essayant à nouveau de commander.
L'exception a été levée car, dans l'
loadCustomerQuote
observateur decustomer_login
, il fusionnera vos devis si vous avez plusieurs devis, et ce faisant, il perd certaines informations sur le mode de paiement sur le devis.Le correctif consistait à supprimer le nouveau devis que je créais dans mon observateur d'abonnement.
MISE À JOUR: Non, le correctif pour "La méthode de paiement demandée n'est pas disponible" n'a pas résolu ce problème, toujours en cours.
la source
Il suffit de noter que PayPal Express donne parfois une erreur indiquant "Payeur non identifié" lors de la commande. Cette erreur provient de la même exception "Veuillez spécifier une méthode d'expédition". Dans Magento 1.8.1.0, cela est facilement reproductible en provoquant une "fusion de devis" ou une "fusion de panier" lors de la commande. La fusion des devis ou des paniers entraînera la suppression des tarifs d'expédition mais non leur recalcul. Et en fait, vous ne voulez pas résoudre ce problème, car alors le client pourrait payer plus que ce qu'il avait convenu! Au lieu de cela, vous souhaiterez supprimer la fonctionnalité de fusion - ou mettre à niveau Magento.
Ceci est corrigé dans 1.9; les clients doivent d'abord se connecter avant d'être redirigés vers PayPal.
la source
Dans mon cas, cette erreur provient de la
null
valeur dans$method
et$rate
j'ai donc mis un taux à partir de cela. dans la méthode et le taux disponibles dans votre magento
la source