Eu recebi logs de exceção para esse erro na produção, mas não consigo reproduzir o problema no meu ambiente local ou intermediário, por isso tem sido muito difícil solucionar problemas.
O erro se origina Mage_Sales_Model_Service_Quote::_validate()
porque o $rate
retornado por $rate = $address->getShippingRateByCode($method)
está vazio.
Eu adicionei alguns logs para tentar ter uma idéia melhor do que estava acontecendo, e vejo que ele $method
contém o método de envio correto.
Meu melhor palpite é que, em algum momento do processo, as taxas de remessa sejam excluídas antes de quando deveriam ser.
Percebi que toda vez que essa exceção ocorre, ocorre imediatamente após uma exceção legítima, como um cartão de crédito inválido. Tentei reproduzir o problema usando um cartão de crédito inválido e, em seguida, um válido, mas ele não é reproduzido para mim - na preparação, produção ou local.
Meu palpite inicial foi que talvez o método de envio estivesse se perdendo em algum lugar após a primeira exceção válida, mas esse não é o caso, porque vejo que $method
tem o valor correto no momento em que essa exceção é lançada.
O módulo de checkout que estou usando é o AwesomeCheckout - realmente não tenho nenhuma lógica personalizada ao criar pedidos que devem causar problemas aqui, mas podem estar relacionados.
ATUALIZAÇÃO: adicionei um código para tentar recuperar as taxas, caso estejam ausentes.
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.'));
}
}
Respostas:
Você precisa entender como as taxas funcionam e como elas são solicitadas. Basicamente, as taxas são solicitadas quando
->setCollectShippingRates(true)
definidas no objeto shippinAddress e resultam em taxas a serem coletadas e armazenadas na tabela de taxas. Esta tabela é esvaziada posteriormente e preenchida novamente na nova solicitação de tarifa.o que está acontecendo no seu caso é que o erro é gerado e a solicitação é repetida e as taxas não são solicitadas, mas espera-se que elas estejam lá. Portanto, tente forçar a cobrança de taxas
e tente lembrar os totais também, se não funcionar
esteja avisado que a chamada collectTotals várias vezes pode atrapalhar seus totais se alguma extensão não implementar corretamente os objetos totais (uma falha comum)
fonte
$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)
linha, então vou tentar isso agora.Pode ter descoberto isso. Eu tinha uma exceção relacionada que estava sendo lançada com a mesma frequência que esta, que era "O método de pagamento solicitado não está disponível".
Acontece que o motivo disso estava acontecendo porque um dos meus observadores
sales_place_order_after
estava criando um objeto de cotação (e salvando-o) para gerar alguns preços de assinatura.Consegui fazê-lo se reproduzir primeiro com um cartão de crédito inválido como novo cliente (não conectado), depois voltando e consertando o cartão de crédito e tentando fazer o checkout novamente.
A exceção foi lançada porque, no
loadCustomerQuote
observador decustomer_login
, ele mesclará suas cotações se você tiver mais de uma cotação e, ao fazer isso, perderá algumas das informações da forma de pagamento na cotação.A correção foi excluir a nova cotação que eu estava criando no meu observador de assinaturas.
UPDATE: Não, a correção para "O método de pagamento solicitado não está disponível" não resolveu esse problema, ainda ocorrendo.
fonte
Apenas observe que, algumas vezes, o PayPal Express apresenta um erro dizendo "Pagador não identificado" na realização do pedido. Este erro deriva da mesma exceção "Especifique um método de envio". No Magento 1.8.1.0, isso é facilmente reproduzível, causando uma "mesclagem de cotação" ou "mesclagem de carrinho" na colocação do pedido. A fusão de cotações ou carrinhos fará com que as taxas de remessa sejam limpas, mas não recalculadas. E, na verdade, você não deseja corrigir isso, porque o cliente pode estar pagando mais do que concordou! Em vez disso, você deseja remover a funcionalidade de mesclagem - ou atualizar o Magento.
Isso é corrigido em 1.9; primeiro, os clientes precisam fazer login antes de serem redirecionados para o PayPal.
fonte
No meu caso, esse erro é originário do
null
valor em$method
e$rate
então eu defino uma taxa a partir disso. no método e avalie o que está disponível no seu magento
fonte