Dostaję dzienniki wyjątków dla tego błędu w produkcji, ale nie jestem w stanie odtworzyć problemu w moim środowisku lokalnym lub przejściowym, więc bardzo trudno było go rozwiązać.
Błąd pochodzi, Mage_Sales_Model_Service_Quote::_validate()
ponieważ $rate
zwrócony przez $rate = $address->getShippingRateByCode($method)
jest pusty.
Dodałem trochę logowania, aby spróbować lepiej zrozumieć, co się dzieje, i widzę, że $method
zawiera prawidłową metodę wysyłki.
Domyślam się, że w pewnym momencie procesu koszty wysyłki są usuwane przed, kiedy powinny.
Zauważyłem, że za każdym razem, gdy wystąpi ten wyjątek, dzieje się to natychmiast po uzasadnionym wyjątku, takim jak nieważna karta kredytowa. Próbowałem odtworzyć problem, używając nieważnej, a następnie ważnej karty kredytowej, ale dla mnie nie jest ona reprodukowana - na etapie inscenizacji, produkcji ani lokalnym.
Moje początkowe przeczucie było takie, że być może metoda wysyłki gubiła się gdzieś po pierwszym ważnym wyjątku, ale tak nie jest, ponieważ widzę, że $method
ma ona prawidłową wartość w momencie zgłoszenia tego wyjątku.
Moduł kasy, którego używam, jest AwesomeCheckout - tak naprawdę według mojej wiedzy nie ma żadnej niestandardowej logiki podczas tworzenia zamówień, które powinny powodować problemy tutaj, ale mogą być powiązane.
AKTUALIZACJA: Dodałem jakiś kod, aby spróbować przypomnieć stawki, jeśli ich brakuje.
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.'));
}
}
Odpowiedzi:
Musisz zrozumieć, jak działają stawki i jak są wymagane. Zasadniczo stawki są wymagane, gdy
->setCollectShippingRates(true)
są ustawione na obiekcie shippinAddress, a stawki wynikowe są gromadzone i przechowywane w tabeli stawek. Tabela ta jest następnie opróżniana i ponownie wypełniana na żądanie nowej stawki.w twoim przypadku generowany jest błąd i żądanie jest powtarzane, a stawki nie są wymagane, ale oczekuje się, że tam będą. Spróbuj więc wymusić zbieranie stawek
a następnie spróbuj również przypomnieć sobie sumy, jeśli to nie działa
ostrzegamy, że wielokrotne wywoływanie funkcji collectTotals może zepsuć sumy, jeśli jakieś rozszerzenie nie implementuje poprawnie obiektów sum (powszechna wada)
źródło
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)
linii, więc spróbuję teraz.Może to rozgryzłem. Miałem pokrewny wyjątek, który był zgłaszany z taką samą częstotliwością jak ten, który brzmiał: „Żądana metoda płatności nie jest dostępna”.
Okazuje się, że powodem tego było to, że jeden z moich obserwatorów nie
sales_place_order_after
stworzył obiektu wyceny (i zapisał go) w celu wygenerowania cen subskrypcji.Udało mi się go odtworzyć, najpierw sprawdzając przy użyciu złej karty kredytowej jako nowy klient (niezalogowany), a następnie wracając, naprawiając kartę kredytową i próbując ponownie dokonać płatności.
Wyjątek został zgłoszony, ponieważ
loadCustomerQuote
obserwatorcustomer_login
połączy swoje oferty razem, jeśli masz więcej niż jedną ofertę, a tym samym traci część informacji o metodzie płatności w ofercie.Rozwiązaniem było usunięcie nowej wyceny, którą tworzyłem w moim obserwatorze subskrypcji.
AKTUALIZACJA: Nie, poprawka „Żądana metoda płatności nie jest dostępna” nie rozwiązała tego problemu, nadal występuje.
źródło
Wystarczy zauważyć, że czasami PayPal Express wyświetli komunikat o błędzie „Nie zidentyfikowano płatnika” przy składaniu zamówienia. Ten błąd wynika z tego samego wyjątku „Proszę podać metodę wysyłki”. W Magento 1.8.1.0 można to łatwo odtworzyć, powodując „scalenie wyceny” lub „scalanie koszyka” podczas składania zamówienia. Scalanie ofert lub koszyków spowoduje, że stawki wysyłki zostaną usunięte, ale nie zostaną ponownie obliczone. W rzeczywistości nie chcesz tego naprawiać, ponieważ wtedy klient może płacić więcej niż uzgodniono! Zamiast tego będziesz chciał usunąć funkcję scalania - lub zaktualizować Magento.
Zostało to naprawione w 1.9; klienci muszą najpierw się zalogować, zanim zostaną przekierowani do PayPal.
źródło
W moim przypadku błąd ten pochodzi z
null
wartości w$method
i$rate
więc ustaliłem z tego stawkę. w metodzie i stawce dostępnej w twoim Magento
źródło