Ausnahmebedingung "Bitte geben Sie eine Versandart an" während der Kaufabwicklung

18

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 $ratezurü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 $methoddie 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 $methodzum 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.'));
        }
    }
kalenjordan
quelle
Verwenden Sie eine Drittanbieter-Versanderweiterung? Das Testen mit einer nativen Magento-Methode wie der Flatrate gibt vielleicht einen Einblick, ob es sich um die Checkout-Erweiterung oder die Versanderweiterung handelt
Sander Mangel
1
Ich habe auch ein Geschäft gesehen, in dem dies in der Produktion passiert, oft mehrere Male hintereinander. Wir haben uns in keiner Umgebung reproduzieren können.
Peter O'Callaghan
@Sander, Ja, wir verwenden eine Drittanbietererweiterung. Ich bin mir ziemlich sicher, dass dies nicht die Hauptursache ist, da die Raten über die collectRates () -Methode einwandfrei zurückgegeben werden und selbst in den Fällen, in denen dies fehlschlägt, kann ich feststellen, dass die Raten über die API einwandfrei zurückgegeben wurden.
Kalenjordan
@ Cags, wirklich?! Gut zu wissen, vielleicht müssen wir das Team markieren. Es ist eines dieser Dinge, die wichtig sind, aber da es sehr selten reproduziert wird, hat es keine große Priorität.
Kalenjordan
@SanderMangel, leider ist es keine Option, dies mit einer Flatrate auszuprobieren, da wir nicht aufhören können, Hunderten von Kunden in der Produktion die korrekten Versandkosten anzubieten, um zu versuchen, das Problem zu reproduzieren. Wenn ich dies in meiner lokalen Umgebung reproduzieren könnte, wäre es sicher eines der ersten Dinge, die ich versuchen würde, es mit einer Vanille-Versandmethode zu testen.
Kalenjordan

Antworten:

8

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

getQuote()->getShippingAddress()->setCollectShippingRates(true);

und dann versuchen, auch Summen zu erfassen, wenn es nicht funktioniert

getQuote()->setTotalsCollectedFlag(false)->collectTotals();

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).

Anton S
quelle
Danke, macht Sinn. Irgendeine Idee, warum dies so selten vorkommt? Wenn der Zahlungsfehler die Tarife zurücksetzt, würde ich jedes Mal einen Zahlungsfehler erwarten.
Kalenjordan
Dies hängt von den Flags ab und ob es aufgerufen wird oder nicht, wenn Sie dies bei einem Fehler replizieren können, ist es einfach, es mit dem Debugger zu verfolgen. Wenn Ihr Zahlungsmethodenfehler jedoch keinen vollständigen Roundtrip zum Server durchführt und nur die Anforderung mit exit unterbricht, kann er nur die Ausführung aller abhängigen Beobachter usw. unterbrechen
Anton S,
Hinzugefügt in einigen Code und es ist immer noch fehlgeschlagen. Ich habe die $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)Zeile allerdings vergessen , also werde ich das jetzt versuchen.
Kalenjordan
Das Problem trat erneut auf, und der vorhandene Code verhinderte das Auftreten der Ausnahme. Die Transaktion schlug jedoch immer noch fehl, da SIMULTANEOUSLY braintree einige Minuten lang nicht verfügbar war. Nicht zu glauben.
Kalenjordan
1
Okay, kratz das ab. Diesmal geschah dies aus ganz anderen Gründen. Es wurde versucht, eine Abonnementbestellung für eine Adresse zu generieren, für die tatsächlich keine Versandkosten verfügbar waren. Daher war die Fehlermeldung gültig. @ProxiBlue
kalenjordan
3

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_afterein 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 loadCustomerQuoteBeobachten von customer_loginIhre 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.

kalenjordan
quelle
Ziemlich spät, aber aus diesem Grund benutze ich dieses Ereignis (Auftragserteilung nach) überhaupt nicht mehr. Wenn nach einer Bestellung etwas passieren soll, rufe ich in eine Warteschlange.
Philwinkle
Ebenso helfen Sie mir bei der Lösung des Problems
zus
0

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.

Erfan
quelle
0

In meinem Fall stammt dieser Fehler vom nullWert in $methodund$rate

$method= $address->getShippingMethod();
$rate  = $address->getShippingRateByCode($method);
    if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
Mage::throwException(Mage::helper('sales')->__('Please specify a 
shipping method.'));
}

also setze ich eine rate daraus. in methode und bewerte das in deinem magento

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
Mai Noppadol
quelle