Ottenere un'eccezione "Specificare un metodo di spedizione" durante il checkout


18

Ho riscontrato i registri delle eccezioni per questo errore nella produzione, ma non riesco a riprodurre il problema nel mio ambiente locale o di gestione temporanea, quindi è stato piuttosto difficile da risolvere.

L'errore ha origine Mage_Sales_Model_Service_Quote::_validate()perché $raterestituito da $rate = $address->getShippingRateByCode($method)è vuoto.

Ho aggiunto un po 'di registrazione per cercare di avere un'idea migliore di ciò che stava succedendo e posso vedere che $methodcontiene il metodo di spedizione corretto.

La mia ipotesi migliore è che ad un certo punto del processo, le tariffe di spedizione vengano eliminate prima di quando dovrebbero essere.

Ho notato che ogni volta che si verifica questa eccezione, si verifica immediatamente dopo un'eccezione legittima, come una carta di credito non valida. Ho provato a riprodurre il problema utilizzando una carta di credito non valida, quindi valida, ma non si riproduce per me, in scena, produzione o locale.

Il mio sospetto iniziale era che forse il metodo di spedizione si stava perdendo da qualche parte dopo la prima eccezione valida, ma non è così, perché vedo che $methodha il valore corretto nel momento in cui viene generata questa eccezione.

Il modulo di checkout che sto usando è AwesomeCheckout - non mi risulta che abbia una logica personalizzata durante la creazione di ordini che dovrebbero causare problemi qui, ma potrebbero essere correlati.

AGGIORNAMENTO: Ho aggiunto del codice per tentare di recuperare le tariffe se mancano.

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.'));
        }
    }

Stai utilizzando un'estensione di spedizione di terze parti? Testare con un metodo Magento nativo come il flatrato potrebbe forse dare qualche indizio che si tratti dell'estensione di pagamento o dell'estensione di spedizione
Sander Mangel

1
Ho anche visto un negozio con questo accadere in produzione, spesso più volte in successione. Non siamo mai stati in grado di riprodursi in nessun ambiente.
Peter O'Callaghan,

@Sander, Sì, stiamo utilizzando un'estensione di terze parti. Sono abbastanza sicuro che non sia la causa principale, perché restituisce le tariffe sul metodo collectRates () bene e anche per i casi in cui ciò fallisce, posso vedere che le tariffe sono state restituite sull'API bene.
Kalenjordan,

@Cags, davvero ??! Buono a sapersi, forse dovremo taggare questo team. È una di quelle cose che è importante, ma poiché si riproduce molto raramente, non è una priorità importante.
Kalenjordan,

@SanderMangel, sfortunatamente provare questo con Flatrate non è un'opzione, perché non possiamo semplicemente smettere di offrire le tariffe di spedizione corrette a centinaia di clienti in produzione per tentare di riprodurre il problema. Se potessi riprodurlo nel mio ambiente locale, sicuramente testare un metodo di spedizione vanilla sarebbe una delle prime cose che proverei.
Kalenjordan,

Risposte:


8

Devi capire come funzionano le tariffe e come sono richieste. Fondamentalmente le tariffe sono richieste quando ->setCollectShippingRates(true)è impostato sull'oggetto shippinAddress e risulta che le tariffe siano raccolte e memorizzate nella tabella delle tariffe. Questa tabella viene successivamente svuotata e riempita di nuovo su una nuova richiesta di tariffa.

ciò che sta accadendo nel tuo caso è che l'errore viene generato e la richiesta viene ripetuta e le tariffe non sono richieste ma dovrebbero essere presenti. Quindi prova a forzare la riscossione delle tariffe

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

e quindi prova a ricordare anche i totali se non funziona

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

essere avvisato che chiamare più volte TotalTotals può incasinare i totali se un interno non implementa correttamente gli oggetti totali (un difetto comune)


Grazie, ha senso. Qualche idea sul perché ciò accada così raramente? Se l'errore di pagamento reimposta le tariffe, mi aspetto che accada ogni volta che si verifica un errore di pagamento.
Kalenjordan,

questo dipende dai flag e se viene chiamato o meno se è possibile replicarlo in caso di errore, è facile rintracciarlo con il debugger. Tuttavia, se l'errore del metodo di pagamento non esegue un roundtrip completo al server e interrompe semplicemente la richiesta con exit, può semplicemente interrompere l'esecuzione di tutti gli osservatori dipendenti ecc.
Anton S

Aggiunto in qualche codice e ancora fallito. Ho dimenticato la $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)linea, quindi ora ci proverò.
Kalenjordan,

Il problema si è ripresentato e il codice in uso ha impedito il verificarsi dell'eccezione. Ma la transazione fallì ancora perché SIMULTANEAMENTE il rompicapo era inattivo per alcuni minuti. Incredibile.
Kalenjordan,

1
Va bene grattalo. La ragione per cui si è verificata questa volta è stata per motivi completamente diversi. Si stava tentando di generare un ordine di abbonamento per un indirizzo in cui in realtà non c'erano tariffe di spedizione disponibili, quindi il messaggio di errore era valido. @ProxiBlue
kalenjordan

3

Potrebbe averlo capito. Avevo un'eccezione correlata che veniva generata con la stessa frequenza di questa, che era "Il metodo di pagamento richiesto non è disponibile".

Si scopre che la ragione per cui stava accadendo era perché uno dei miei osservatori sales_place_order_afterstava creando un oggetto preventivo (e salvandolo) per generare alcuni prezzi di abbonamento.

Sono stato in grado di riprodurlo eseguendo prima il checkout con una carta di credito errata come nuovo cliente (non collegato), quindi tornando indietro e riparando la carta di credito e tentando di effettuare nuovamente il checkout.

L'eccezione è stata lanciata perché loadCustomerQuotenell'osservatore di customer_login, unirà le virgolette se hai più di un preventivo, e così facendo perde alcune delle informazioni sul metodo di pagamento sul preventivo.

La correzione era eliminare la nuova citazione che stavo creando nel mio osservatore dell'abbonamento.

AGGIORNAMENTO: No, la correzione per "Il metodo di pagamento richiesto non è disponibile" non ha risolto questo problema, si è ancora verificato.


Abbastanza tardi, ma è per questo che non uso più quell'evento (posto dell'ordine di vendita dopo). Se ho bisogno che accada qualcosa dopo un ordine, vado in coda.
Philwinkle,

Allo stesso modo mi aiuterai a risolvere "Specificare un metodo di spedizione" nell'errore della pagina di checkout: magento.stackexchange.com/q/225297/57334
zus

0

Solo notando, a volte PayPal Express genererà un errore che dice "Il pagatore non identificato" al momento dell'ordine. Questo errore deriva dalla stessa eccezione "Specificare un metodo di spedizione". In Magento 1.8.1.0 questo è facilmente riproducibile causando una "fusione preventivo" o "unione carrello" al momento dell'ordine. La fusione di preventivi o carrelli comporterà l'eliminazione delle tariffe di spedizione ma non il ricalcolo. E in realtà, non vuoi risolvere questo problema, perché in tal caso il cliente potrebbe pagare di più di quanto concordato! Invece ti consigliamo di rimuovere la funzionalità di fusione o aggiornare Magento.

Questo è stato risolto in 1.9; i clienti devono prima effettuare l'accesso prima di essere reindirizzati a PayPal.


0

Nel mio caso questo errore ha origine dal nullvalore in $methode$rate

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

quindi ho fissato un tasso da questo. nel metodo e valuta quello disponibile nel tuo magento

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.