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