実稼働環境でこのエラーの例外ログを取得していますが、ローカル環境またはステージング環境で問題を再現できないため、トラブルシューティングが非常に困難でした。
の戻り値が空である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.'));
}
}