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 $rate
dikembalikan 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 $method
berisi 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 $method
memiliki 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.'));
}
}
Jawaban:
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
dan kemudian coba untuk mengingat total juga jika itu tidak berhasil
diperingatkan bahwa memanggil collectTotals beberapa kali dapat mengacaukan total Anda jika beberapa ekstensi tidak mengimplementasikan objek total dengan benar (kesalahan umum)
sumber
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)
kalimatnya jadi aku akan mencobanya sekarang.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_after
membuat 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
loadCustomerQuote
pengamatcustomer_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.
sumber
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.
sumber
Dalam kasus saya kesalahan ini berasal dari
null
nilai dalam$method
dan$rate
jadi saya menetapkan nilai dari ini. dalam metode dan nilai yang tersedia di magento Anda
sumber