체크 아웃시 "배송 방법을 지정하십시오"예외가 발생합니다


18

프로덕션에서이 오류에 대한 예외 로그가 표시되었지만 로컬 또는 준비 환경에서 문제를 재현 할 수 없으므로 문제를 해결하기가 매우 어렵습니다.

반환 한 사람 이 비어 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.'));
        }
    }

타사 배송 확장 프로그램을 사용하고 있습니까? flatrate와 같은 기본 Magento 방법으로 테스트하면 결제 확장 또는 배송 확장에 대한 통찰력을 얻을 수 있습니다.
Sander Mangel

1
나는 또한 생산에서 종종 여러 번 연속으로 발생하는 상점을 보았습니다. 우리는 어떤 환경에서도 자신을 재현 할 수 없었습니다.
Peter O'Callaghan

@Sander, 예, 타사 확장 프로그램을 사용하고 있습니다. 그것은 그것이 근본 원인이 아니라고 확신합니다. collectRates () 메소드를 통해 속도를 올바르게 반환하기 때문에 이것이 실패하는 경우에도 API를 통해 속도가 제대로 반환되었음을 알 수 있습니다.
kalenjordan

@ 가방, 정말 ??! 알아두면 좋겠다. 팀에 태그를 지정해야 할 것이다. 그것은 중요한 것들 중 하나이지만 매우 드물게 재생산되기 때문에 주요 우선 순위는 아닙니다.
kalenjordan

@SanderMangel은 불행히도 정액을 사용하여 이것을 시도하는 것은 옵션이 아닙니다. 문제를 재현하기 위해 생산중인 수백 명의 고객에게 정확한 배송비를 제공하는 것을 멈출 수 없기 때문입니다. 현지 환경에서 이것을 재현 할 수 있다면 바닐라 배송 방법에 대한 테스트가 가장 먼저 시도해야 할 것 중 하나입니다.
kalenjordan

답변:


8

요금이 어떻게 작동하고 어떻게 요청되는지 이해해야합니다. 기본적으로 요금은 ->setCollectShippingRates(true)shippinAddress 객체에서 설정 될 때 요청 되며 결과 요금이 수집되어 요금 테이블에 저장됩니다. 이 테이블은 나중에 비워지고 새로운 요율 요청으로 다시 채워집니다.

귀하의 경우에 발생하는 일은 오류가 발생하고 요청이 반복되고 요금이 요청되지 않지만 거기에있을 것으로 예상됩니다. 그래서 요금 징수를 강제로 시도하십시오.

getQuote()->getShippingAddress()->setCollectShippingRates(true);

작동하지 않으면 총계를 다시 수집하십시오.

getQuote()->setTotalsCollectedFlag(false)->collectTotals();

일부 확장이 총계 개체를 올바르게 구현하지 않으면 (총계 결함) collectTotals를 여러 번 호출하면 총계가 엉망이 될 수 있습니다.


감사합니다. 왜 이런 일이 드물게 일어날 지 아십니까? 지불 오류가 요율을 재설정하는 경우 지불 오류가 발생할 때마다 발생합니다.
kalenjordan

이것은 플래그에 따라 다르며 호출 여부에 따라 오류가 발생하면이를 복제 할 수 있으면 디버거를 사용하여 쉽게 추적 할 수 있습니다. 그러나 지불 방법 오류가 서버로의 전체 왕복을 수행하지 않고 종료와 함께 요청을 중단하면 모든 종속 관찰자 등 실행이 중단 될 수 있습니다.
Anton S

일부 코드에 추가되었지만 여전히 실패했습니다. 나는 $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)줄을 잊어 버렸 으므로 지금 시도해 볼 것입니다.
kalenjordan

이 문제가 다시 발생했고 내가 작성한 코드로 인해 예외가 발생하지 않았습니다. 그러나 SIMULTANEOUSLY braintree가 몇 분 동안 다운되어 트랜잭션이 계속 실패했습니다. 믿을 수 없는.
kalenjordan

1
알았어. 이번에 발생한 이유는 완전히 다른 이유 때문이었습니다. 실제로 사용 가능한 배송비가없는 주소에 대해 구독 주문을 생성하려고했기 때문에 오류 메시지가 유효했습니다. @ProxiBlue
kalenjordan

3

이것을 알아 냈을 수도 있습니다. "요청한 결제 수단을 사용할 수 없습니다."라는 것과 비슷한 빈도로 관련 예외가 발생했습니다.

내 관찰자 중 한 명이 sales_place_order_after구독 가격을 생성하기 위해 견적 객체를 생성하고 저장 했기 때문에 그 이유가 밝혀졌습니다 .

먼저 새로운 고객 (로그인하지 않은)으로 잘못된 신용 카드로 체크 아웃 한 다음, 돌아가서 신용 카드를 수정하고 다시 체크 아웃을 시도하여 재현 할 수있었습니다.

loadCustomerQuote관찰자에서 customer_login견적이 두 개 이상인 경우 견적을 병합하므로 견적에 대한 지불 방법 정보 중 일부가 손실 되기 때문에 예외가 발생 했습니다.

수정 사항은 구독 관찰자에서 만든 새 견적을 삭제하는 것이 었습니다.

업데이트 : 아니요, "요청한 결제 수단을 사용할 수 없습니다"에 대한 수정으로이 문제가 해결되지 않았습니다.


꽤 늦었지만 이것이 더 이상 이벤트 (판매 주문 후)를 사용하지 않는 이유입니다. 주문 후 무언가가 필요한 경우 대기열로 가져옵니다.
philwinkle

마찬가지로 결제 페이지 오류에서 "배송 방법을 지정하십시오"를 해결하는 데 도움이됩니다. magento.stackexchange.com/q/225297/57334
zus

0

다만 PayPal Express는 주문시 "지불되지 않음"이라는 오류를 표시합니다. 이 오류는 동일한 "배송 방법을 지정하십시오"예외에서 발생합니다. Magento 1.8.1.0에서는 주문시 "quote merge"또는 "cart merge"를 발생시켜 쉽게 재현 할 수 있습니다. 견적 또는 장바구니를 병합하면 배송비가 지워지지 만 다시 계산되지는 않습니다. 실제로 고객은 합의한 것보다 더 많은 금액을 지불하기 때문에이 문제를 해결하고 싶지 않습니다. 대신 병합 기능을 제거하거나 Magento를 업그레이드해야합니다.

이것은 1.9에서 수정되었습니다. 고객은 먼저 PayPal로 리디렉션되기 전에 로그인해야합니다.


0

내 경우에는이 오류가 그것에서 발생하는 null가치 $method$rate

$method= $address->getShippingMethod();
$rate  = $address->getShippingRateByCode($method);
    if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
Mage::throwException(Mage::helper('sales')->__('Please specify a 
shipping method.'));
}

그래서 나는 이것으로부터 속도를 설정했습니다. 마 젠토에서 사용 가능한 방법 및 속도

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.