Mendapatkan pengecualian “Tentukan Metode Pengiriman” selama checkout

18

Saya telah mendapatkan log pengecualian untuk kesalahan dalam produksi ini, tetapi saya tidak dapat mereproduksi masalah di lingkungan pementasan atau lokal saya, jadi sangat sulit untuk memecahkan masalah.

Kesalahan berasal Mage_Sales_Model_Service_Quote::_validate()karena $ratedikembalikan oleh $rate = $address->getShippingRateByCode($method)kosong.

Saya telah menambahkan beberapa pencatatan untuk mencoba dan mendapatkan gagasan yang lebih baik tentang apa yang sedang terjadi, dan saya dapat melihat bahwa itu $methodberisi metode pengiriman yang benar.

Tebakan terbaik saya adalah bahwa pada titik tertentu dalam proses, tarif pengiriman sedang dihapus sebelum kapan seharusnya.

Saya perhatikan bahwa setiap kali pengecualian ini terjadi, itu terjadi segera setelah pengecualian yang sah, seperti kartu kredit yang tidak valid. Saya sudah mencoba mereproduksi masalah dengan menggunakan kartu kredit yang tidak valid, kemudian kartu yang valid, tetapi tidak mereproduksi untuk saya - dalam pementasan, produksi, atau lokal.

Firasat awal saya adalah bahwa mungkin metode pengiriman hilang di suatu tempat setelah pengecualian pertama yang valid, tetapi itu tidak terjadi, karena saya melihat bahwa $methodmemiliki nilai yang benar pada saat pengecualian ini dilemparkan.

Modul checkout yang saya gunakan adalah AwesomeCheckout - tidak sepengetahuan saya memiliki logika khusus saat membuat pesanan yang seharusnya menyebabkan masalah di sini, tetapi mungkin terkait.

UPDATE: Saya telah menambahkan dalam beberapa kode untuk mencoba mengingat kembali tarif jika mereka hilang.

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
sumber
Apakah Anda menggunakan ekstensi pengiriman pihak ke-3? Pengujian dengan metode Magento asli seperti flatrate mungkin akan memberikan beberapa wawasan apakah itu ekstensi checkout atau ekstensi pengiriman
Sander Mangel
1
Saya juga telah melihat sebuah toko dengan ini terjadi dalam produksi, seringkali berkali-kali berturut-turut. Kami tidak pernah dapat mereproduksi diri di lingkungan apa pun.
Peter O'Callaghan
@Sand, Ya kami menggunakan ekstensi pihak ke-3. Saya cukup yakin itu bukan akar penyebabnya karena itu mengembalikan tingkat atas metode collectRates () baik-baik saja dan bahkan untuk kasus-kasus di mana ini gagal, saya dapat melihat bahwa tarif dikembalikan atas API dengan baik.
kalenjordan
@Cags, benarkah ??! Senang tahu, mungkin kita harus menandai tim ini. Itu salah satu hal yang penting tetapi karena mereproduksi sangat jarang, itu bukan prioritas utama.
kalenjordan
@SanderMangel, sayangnya mencoba ini dengan flatrate bukanlah suatu pilihan, karena kami tidak bisa berhenti melayani tarif pengiriman yang benar untuk ratusan pelanggan dalam produksi untuk mencoba mereproduksi masalah. Jika saya bisa mereproduksi ini di lingkungan lokal saya, pasti pengujian terhadap metode pengiriman vanilla akan menjadi salah satu hal pertama yang saya coba.
kalenjordan

Jawaban:

8

Anda harus memahami cara kerja tarif dan bagaimana tarifnya diminta. Pada dasarnya tarif diminta ketika ->setCollectShippingRates(true)diatur pada objek shippinAddress dan itu menghasilkan tingkat yang akan dikumpulkan dan disimpan dalam tabel tarif. Tabel ini dikosongkan sesudahnya dan diisi lagi berdasarkan permintaan tarif baru.

apa yang terjadi dalam kasus Anda adalah bahwa kesalahan dilemparkan dan permintaan diulang dan tarif tidak diminta tetapi diharapkan ada di sana. Jadi cobalah dan paksa pengumpulan tarif berakhir

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

dan kemudian coba untuk mengingat total juga jika itu tidak berhasil

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

diperingatkan bahwa memanggil collectTotals beberapa kali dapat mengacaukan total Anda jika beberapa ekstensi tidak mengimplementasikan objek total dengan benar (kesalahan umum)

Anton S
sumber
Terima kasih, masuk akal. Adakah yang tahu mengapa hal ini jarang terjadi? Jika kesalahan pembayaran mengatur ulang harga, saya berharap itu terjadi setiap kali ada kesalahan pembayaran.
kalenjordan
ini tergantung pada flag-flag dan apakah itu dipanggil atau tidak jika Anda dapat mereplikasi ini pada kesalahan maka mudah untuk dilacak dengan debugger. Namun jika kesalahan metode pembayaran Anda tidak melakukan bolak-balik penuh ke server dan hanya memecah permintaan dengan keluar, itu hanya dapat menghancurkan semua eksekusi pengamat tergantung dll.
Anton S
Menambahkan beberapa kode dan masih gagal. Aku memang lupa $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)kalimatnya jadi aku akan mencobanya sekarang.
kalenjordan
Masalah ini muncul kembali, dan kode yang saya miliki memang mencegah pengecualian terjadi. Tetapi transaksi masih gagal karena braintree SIMULTAN turun selama beberapa menit. Luar biasa.
kalenjordan
1
Oke goreskan itu. Alasan itu terjadi kali ini adalah untuk alasan yang sama sekali berbeda. Pesanan berlangganan sedang berusaha dibuat untuk alamat di mana sebenarnya tidak ada tarif pengiriman yang tersedia, sehingga pesan kesalahan itu valid. @ProxiBlue
kalenjordan
3

Mungkin sudah menemukan ini. Saya memiliki pengecualian terkait yang dilemparkan dengan frekuensi yang sama dengan yang ini, yaitu "Metode Pembayaran yang diminta tidak tersedia".

Ternyata alasan mengapa hal itu terjadi adalah karena salah satu pengamat saya sales_place_order_aftermembuat objek kutipan (dan menyimpannya) untuk menghasilkan beberapa harga berlangganan.

Saya dapat membuatnya untuk mereproduksi dengan terlebih dahulu memeriksa dengan kartu kredit yang buruk sebagai pelanggan baru (tidak masuk), kemudian kembali dan memperbaiki kartu kredit dan mencoba checkout lagi.

Pengecualian dilemparkan karena dalam loadCustomerQuotepengamat customer_login, itu akan menggabungkan kutipan Anda bersama-sama jika Anda memiliki lebih dari satu kutipan, dan dengan melakukan itu kehilangan beberapa informasi metode pembayaran pada kutipan.

Cara mengatasinya adalah menghapus kutipan baru yang saya buat di pengamat langganan saya.

PEMBARUAN: Tidak, perbaikan untuk "Metode Pembayaran yang diminta tidak tersedia" tidak menyelesaikan masalah ini, masih terjadi.

kalenjordan
sumber
Cukup terlambat, tapi ini sebabnya saya tidak menggunakan acara itu lagi (tempat pesanan penjualan). Jika saya perlu sesuatu terjadi setelah pesanan saya mengambil antrian.
philwinkle
Sama seperti Anda akan membantu saya untuk menyelesaikan "Silakan tentukan metode pengiriman" dalam kesalahan halaman checkout: magento.stackexchange.com/q/225297/57334
zus
0

Hanya mencatat, kadang-kadang PayPal Express akan memberikan kesalahan yang mengatakan "Pembayar tidak diidentifikasi" pada saat penempatan pesanan. Kesalahan ini berasal dari pengecualian "Silakan tentukan metode pengiriman" yang sama. Dalam Magento 1.8.1.0 ini mudah direproduksi dengan menyebabkan "gabungan kutipan" atau "gabungan keranjang" saat penempatan pesanan. Penggabungan penawaran atau gerobak akan menyebabkan tarif pengiriman dihapus tetapi tidak dihitung ulang. Dan sebenarnya, Anda tidak ingin memperbaikinya, karena pelanggan mungkin membayar lebih dari yang mereka setujui! Alih-alih, Anda ingin menghapus fungsionalitas penggabungan - atau meningkatkan Magento.

Ini diperbaiki dalam 1.9; pelanggan harus login terlebih dahulu sebelum diarahkan ke PayPal.

Erfan
sumber
0

Dalam kasus saya kesalahan ini berasal dari nullnilai dalam $methoddan$rate

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

jadi saya menetapkan nilai dari ini. dalam metode dan nilai yang tersedia di magento Anda

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