프로덕션에서이 오류에 대한 예외 로그가 표시되었지만 로컬 또는 준비 환경에서 문제를 재현 할 수 없으므로 문제를 해결하기가 매우 어렵습니다.
반환 한 사람 이 비어 Mage_Sales_Model_Service_Quote::_validate()
있기 때문에 오류가 발생 합니다.$rate
$rate = $address->getShippingRateByCode($method)
나는 어떤 일이 일어나고 있는지 더 잘 알기 위해 로깅에 추가했으며 $method
올바른 배송 방법 이 포함되어 있음을 알 수 있습니다.
가장 좋은 추측은 프로세스의 어느 시점에서 배송료가 언제 이전에 삭제되는지입니다.
이 예외가 발생할 때마다 유효하지 않은 신용 카드와 같은 합법적 인 예외 직후에 발생합니다. 잘못된 신용 카드를 사용한 다음 유효한 신용 카드를 사용하여 문제를 재현하려고 시도했지만 준비, 프로덕션 또는 로컬에서 재현하지 않습니다.
내 첫 직감은 아마도 첫 번째 유효한 예외 이후 어딘가에서 배송 방법이 손실 될 수 있었지만 $method
이 예외가 발생했을 때 올바른 값 을 가지고 있기 때문에 그렇지 않습니다 .
내가 사용하는 체크 아웃 모듈은 AwesomeCheckout입니다. 실제로 문제를 일으키는 주문을 만들 때 관련 지식이있는 것은 아닙니다.
업데이트 : 누락 된 경우 요금을 다시 수집하려고 일부 코드를 추가했습니다.
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.'));
}
}