Ödeme sırasında "Lütfen Bir Nakliye Yöntemi Belirtin" istisnası alma


18

Üretimdeki bu hata için istisna günlükleri alıyorum, ancak sorunu yerel veya hazırlama ortamımda yeniden oluşturamıyorum, bu nedenle sorun gidermek oldukça zor oldu.

Hata Mage_Sales_Model_Service_Quote::_validate(), $ratedöndürülen $rate = $address->getShippingRateByCode($method)öğe boş olduğundan kaynaklanır .

Neler olup bittiğine dair daha iyi bir fikir edinmek için bazı günlüklere ekledim ve $methodbunun doğru gönderim yöntemini içerdiğini görebiliyorum .

En iyi tahminim, sürecin bir noktasında, nakliye oranlarının ne zaman olması gerektiğinden önce silinmesidir.

Bu istisna her gerçekleştiğinde, bunun geçersiz bir kredi kartı gibi meşru bir istisnadan hemen sonra gerçekleştiğini fark ettim. Sorunu geçersiz bir kredi kartı, sonra geçerli bir kredi kartı kullanarak yeniden oluşturmaya çalıştım, ancak benim için üretmiyor - evreleme, üretim veya yerel.

Benim ilk öbek belki nakliye yöntemi ilk geçerli istisna sonra bir yerde kayboluyordu oldu, ama durum böyle değil, çünkü $methodbu istisna atıldığı anda doğru değeri olduğunu görüyorum .

Kullandığım ödeme modülü AwesomeCheckout'tur - burada sorunlara neden olması gereken siparişler oluştururken, ancak ilgili olabilecek herhangi bir özel mantığa sahip değilim.

GÜNCELLEME: Eğer eksikse oranları hatırlamak için bazı kod ekledim.

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

3. taraf bir gönderim uzantısı mı kullanıyorsunuz? Flatrate gibi yerel bir Magento yöntemiyle test etmek, ödeme uzantısı veya nakliye uzantısı olup olmadığı konusunda bir fikir verebilir
Sander Mangel

1
Ayrıca, üretimde, çoğu kez art arda birkaç kez gerçekleşen bir mağaza gördüm. Hiçbir zaman kendimizi hiçbir ortamda üretemedik.
Peter O'Callaghan

@Sander, Evet, 3. taraf bir uzantı kullanıyoruz. Ben kök neden olmasa da oldukça iyi çünkü bu oranlar sadece iyi ve bu başarısız olduğu durumlarda bile, oranlar API üzerinden iade edildi görebilirsiniz görebilirsiniz.
kalenjordan

@ Kafeler, gerçekten ??! Bilmek güzel, belki de bunu ekibi etiketlememiz gerekecek. Önemli olan şeylerden biri ama çok seyrek olarak çoğaldığı için büyük bir öncelik değil.
kalenjordan

@SanderMangel, maalesef bunu flatrate ile denemek bir seçenek değil, çünkü sorunu yeniden üretmeye çalışmak için yüzlerce müşteriye doğru nakliye ücretlerini sunmayı bırakamayız. Bunu yerel ortamımda yeniden üretebilseydim, bir vanilya sevkıyat yöntemine karşı test etmek, ilk denediğim şeylerden biri olurdu.
kalenjordan

Yanıtlar:


8

Oranların nasıl çalıştığını ve nasıl talep edildiğini anlamalısınız. Temel olarak ücretler, ->setCollectShippingRates(true)shippinAddress nesnesinde ayarlandığında istenir ve sonuç oranları, ücretler tablosunda toplanıp saklanır. Bu tablo daha sonra boşaltılır ve yeni ücret talebi üzerine tekrar doldurulur.

sizin durumunuzda meydana gelen şey, hatanın atılması ve talebin tekrarlanması ve ücretlerin istenmemesi ancak orada olması bekleniyor. Bu yüzden oran koleksiyonunu

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

ve eğer işe yaramazsa toplamları da hatırlamaya çalışın

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

Bazı uzantılar toplam nesneleri doğru bir şekilde uygulamıyorsa, collectTotals'ı birden çok kez çağırmanın toplamlarınızı bozabileceği konusunda uyarılmalıdır (ortak bir kusur)


Teşekkürler, mantıklı. Bunun neden bu kadar nadiren gerçekleşeceği hakkında bir fikriniz var mı? Ödeme hatası oranları sıfırlasaydı, her ödeme hatası olduğunda bunun olmasını beklerdim.
Kalenjordan

Bu, bayraklara bağlıdır ve çağrılıp çağrılmıyorsa, bunu hata halinde çoğaltabiliyorsanız, hata ayıklayıcı ile izlemek kolaydır. Ödeme yöntemi hata sunucuya tam gidiş dönüş yapmak ve sadece çıkışında ile isteği kırar vermez Ancak eğer sadece tüm bağımlı gözlemci vb yürütme kırabilir
Anton S

Bazı kodlar eklendi ve hala başarısız oldu. Unutmadan yaptım $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)bunu şimdi deneyeceğim böylece olsa hattı.
kalenjordan

Sorun yeniden oluştu ve ben var kod istisna oluşmasını engelledi. Ancak SIMULTANEOUSLY braintree birkaç dakika kapalı kaldığı için işlem hala başarısız oldu. Inanılmaz.
kalenjordan

1
Tamam çizik. Bu kez ortaya çıkmasının nedeni tamamen farklı nedenlerden kaynaklanıyordu. Gerçekte gönderim bedeli bulunmayan bir adres için bir abonelik siparişi oluşturulmaya çalışıldı, bu nedenle hata mesajı geçerliydi. @ProxiBlue
kalenjordan

3

Bunu çözebilirdi. "İstenen Ödeme Yöntemi kullanılamıyor" olanla aynı frekansta atılan ilgili bir istisnam vardı.

Bunun olmasının sebebinin gözlemcilerimden birinin sales_place_order_after bazı abonelik fiyatlandırması oluşturmak için bir teklif nesnesi (ve kaydetme) oluşturmasıydı.

Önce yeni bir müşteri (giriş değil) olarak kötü bir kredi kartı ile kontrol, daha sonra geri dönüp kredi kartı sabitleme ve tekrar ödeme yapmaya çalışarak çoğaltmayı başardı.

İstisna nedeniyle atma loadCustomerQuotegözlemcisicustomer_login birden fazla teklifiniz varsa tekliflerinizi birleştirecek ve böylece teklif üzerindeki ödeme yöntemi bilgilerinin bir kısmını kaybedecektir.

Düzeltme, abonelik gözlemcimde oluşturduğum yeni teklifi silmekti.

GÜNCELLEME: Hayır, "İstenen Ödeme Yöntemi mevcut değil" düzeltmesi bu sorunu çözmedi, yine de gerçekleşiyor.


Oldukça geç, ama bu yüzden artık o etkinliği (satış sonrası yeri) artık kullanmıyorum. Bir emirden sonra bir şeylere ihtiyacım olursa bir kuyruğa giriyorum.
philwinkle

Aynı şekilde, ödeme sayfası hatasındaki "Lütfen bir gönderim yöntemi belirtin" çözmeme yardımcı olacaksınız
zus

0

Sadece belirtmek gerekirse, bazen PayPal Express sipariş verildikten sonra "Ödeyici tanımlanmadı" hatası verir. Bu hata aynı "Lütfen bir gönderim yöntemi belirtin" istisnasından kaynaklanır. Magento 1.8.1.0'da bu, sipariş verildikten sonra bir "fiyat teklifi birleştirmesi" veya "alışveriş sepeti birleştirmesine" neden olarak kolayca yeniden üretilebilir. Tekliflerin veya alışveriş sepetlerinin birleştirilmesi gönderim ücretlerinin silinmesine neden olur, ancak yeniden hesaplanmaz. Ve aslında, bunu düzeltmek istemezsiniz, çünkü o zaman müşteri üzerinde anlaştıklarından daha fazlasını ödüyor olabilir! Bunun yerine birleştirme işlevini kaldırmak veya Magento'yu yükseltmek istersiniz.

Bu, 1.9'da düzeltildi; müşterilerin PayPal'a yönlendirilmeden önce giriş yapması gerekir.


0

Benim durumumda bu hata onun kaynaklanan nulldeğer $methodve$rate

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

bu yüzden bundan bir oran belirledim. Magento'nuzda bulunan yöntem ve oranda

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.