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.'));
}
}
Antworten:
Sie müssen verstehen, wie die Tarife funktionieren und wie sie angefordert werden. Grundsätzlich werden Raten abgefragt, wenn
->setCollectShippingRates(true)
für das Objekt shippinAddress festgelegt wurde und die Ergebnisraten gesammelt und in der Tarifpreistabelle gespeichert werden sollen. Diese Tabelle wird anschließend geleert und bei neuer Tarifanfrage wieder gefüllt.In Ihrem Fall tritt ein Fehler auf, und die Anforderung wird wiederholt, und die Preise werden nicht angefordert, es wird jedoch erwartet, dass sie vorhanden sind. Versuchen Sie also, die Gebührenerhebung zu erzwingen
und dann versuchen, auch Summen zu erfassen, wenn es nicht funktioniert
Seien Sie gewarnt, dass ein mehrmaliger Aufruf von collectTotals Ihre Summen durcheinander bringen kann, wenn eine Erweiterung Summenobjekte nicht korrekt implementiert (ein häufiger Fehler).
quelle
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)
Zeile allerdings vergessen , also werde ich das jetzt versuchen.Könnte das herausgefunden haben. Ich hatte eine verwandte Ausnahme, die ungefähr mit der gleichen Häufigkeit wie diese geworfen wurde: "Die angeforderte Zahlungsmethode ist nicht verfügbar".
Es stellte sich heraus, dass der Grund dafür war, dass einer meiner Beobachter
sales_place_order_after
ein Angebotsobjekt erstellt (und es gespeichert) hat, um einen Abonnementpreis zu generieren.Ich konnte es reproduzieren, indem ich zuerst mit einer falschen Kreditkarte als Neukunde auscheckte (nicht angemeldet), dann zurückging und die Kreditkarte reparierte und versuchte, erneut auszuchecken.
Die Ausnahme wurde ausgelöst, weil beim
loadCustomerQuote
Beobachten voncustomer_login
Ihre Angebote zusammengeführt werden, wenn Sie mehr als ein Angebot haben, und dadurch einige der Zahlungsmethodeninformationen im Angebot verloren gehen.Das Update bestand darin, das neue Angebot zu löschen, das ich in meinem Abonnementbeobachter erstellt habe.
UPDATE: Nein, das Update für "Die angeforderte Zahlungsmethode ist nicht verfügbar" hat das Problem nicht gelöst und ist immer noch aufgetreten.
quelle
Nur zur Kenntnisnahme, manchmal wird PayPal Express bei der Auftragserteilung eine Fehlermeldung mit der Aufschrift "Payer not identification" (Zahler nicht identifiziert) ausgeben. Dieser Fehler rührt von derselben Ausnahme "Bitte geben Sie eine Versandart an" her. In Magento 1.8.1.0 ist dies leicht reproduzierbar, indem bei Auftragserteilung ein "Quot Merge" oder ein "Cart Merge" ausgelöst wird. Durch das Zusammenführen von Angeboten oder Warenkörben werden die Versandkosten gelöscht, jedoch nicht neu berechnet. Und tatsächlich möchten Sie dies nicht beheben, da der Kunde dann möglicherweise mehr zahlt, als er vereinbart hat! Stattdessen möchten Sie die Zusammenführungsfunktionalität entfernen oder Magento aktualisieren.
Dies ist in 1.9 behoben; Kunden müssen sich erst anmelden, bevor sie zu PayPal weitergeleitet werden.
quelle
In meinem Fall stammt dieser Fehler vom
null
Wert in$method
und$rate
also setze ich eine rate daraus. in methode und bewerte das in deinem magento
quelle