Tôi đã nhận được các bản ghi ngoại lệ cho lỗi này trong sản xuất, nhưng tôi không thể tái tạo vấn đề trong môi trường địa phương hoặc dàn dựng của mình, vì vậy rất khó để khắc phục sự cố.
Lỗi bắt nguồn từ Mage_Sales_Model_Service_Quote::_validate()
vì $rate
trả về $rate = $address->getShippingRateByCode($method)
là trống.
Tôi đã thêm vào một số bản ghi để thử và hiểu rõ hơn về những gì đang diễn ra và tôi có thể thấy rằng $method
có chứa phương thức vận chuyển chính xác.
Dự đoán tốt nhất của tôi là tại một số điểm trong quy trình, giá vận chuyển sẽ bị xóa trước khi chúng cần.
Tôi đã nhận thấy rằng mỗi khi ngoại lệ này xảy ra, nó sẽ xảy ra ngay sau một ngoại lệ hợp pháp, chẳng hạn như thẻ tín dụng không hợp lệ. Tôi đã cố gắng tái tạo vấn đề bằng cách sử dụng thẻ tín dụng không hợp lệ, sau đó là thẻ hợp lệ, nhưng nó không tái tạo cho tôi - trong dàn dựng, sản xuất hoặc địa phương.
Linh cảm ban đầu của tôi là có thể phương thức vận chuyển đã bị mất ở đâu đó sau ngoại lệ hợp lệ đầu tiên, nhưng đó không phải là trường hợp, bởi vì tôi thấy rằng nó $method
có giá trị chính xác tại thời điểm ngoại lệ này được ném.
Mô-đun thanh toán mà tôi đang sử dụng là AwesomeCheckout - thực sự theo hiểu biết của tôi có bất kỳ logic tùy chỉnh nào khi tạo các đơn hàng gây ra sự cố ở đây, nhưng có thể có liên quan.
CẬP NHẬT: Tôi đã thêm vào một số mã để cố gắng nhớ lại tỷ lệ nếu chúng bị thiếu.
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.'));
}
}