Nhận một quảng cáo Vui lòng chỉ định một phương thức vận chuyển Ngoại lệ trong khi thanh toán


18

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()$ratetrả 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 $methodcó 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ó $methodcó 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.'));
        }
    }

Bạn đang sử dụng tiện ích mở rộng vận chuyển của bên thứ 3? Thử nghiệm với phương pháp Magento bản địa như căn hộ có lẽ sẽ giúp bạn hiểu rõ hơn về việc đó là phần mở rộng thanh toán hay phần mở rộng vận chuyển
Sander Mangel

1
Tôi cũng đã thấy một cửa hàng với điều này xảy ra trong sản xuất, thường là nhiều lần liên tiếp. Chúng tôi chưa bao giờ có thể sinh sản trong bất kỳ môi trường nào.
Peter O'Callaghan

@Sander, Có, chúng tôi đang sử dụng tiện ích mở rộng của bên thứ 3. Tôi khá chắc chắn rằng đó không phải là nguyên nhân gốc bởi vì nó trả về tỷ lệ so với phương thức collRates () tốt và ngay cả đối với những trường hợp không thành công, tôi có thể thấy rằng tỷ lệ được trả về qua API rất tốt.
kalenjordan

@Cags, thật sao ??! Điều tốt để biết, có lẽ chúng ta sẽ phải gắn thẻ nhóm này. Đó là một trong những điều quan trọng nhưng vì nó tái tạo rất ít khi, nó không phải là ưu tiên chính.
kalenjordan

@SanderMangel, không may dùng thử điều này với căn hộ không phải là một lựa chọn, bởi vì chúng tôi không thể ngừng phục vụ mức giá vận chuyển chính xác cho hàng trăm khách hàng trong sản xuất để cố gắng tái tạo vấn đề. Nếu tôi có thể tái tạo điều này trong môi trường địa phương của mình, chắc chắn thử nghiệm phương pháp vận chuyển vanilla sẽ là một trong những điều đầu tiên tôi thử.
kalenjordan

Câu trả lời:


8

Bạn phải hiểu cách thức hoạt động của giá và cách chúng được yêu cầu. Về cơ bản tỷ lệ được yêu cầu khi ->setCollectShippingRates(true)được đặt trên đối tượng shippinAddress và tỷ lệ kết quả sẽ được thu thập và lưu trữ trong bảng tỷ lệ. Bảng này được làm trống sau đó và điền lại theo yêu cầu giá mới.

những gì đang xảy ra trong trường hợp của bạn là lỗi được ném và yêu cầu được lặp lại và tỷ lệ không được yêu cầu nhưng dự kiến ​​sẽ có. Vì vậy, hãy thử và buộc thu thập giá

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

và sau đó cố gắng nhớ lại tổng số nếu nó không hoạt động

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

được cảnh báo rằng việc gọi collTotals nhiều lần có thể làm rối tổng số của bạn nếu một số tiện ích mở rộng không triển khai chính xác các đối tượng (một lỗi phổ biến)


Cảm ơn, có ý nghĩa. Bất cứ ý tưởng tại sao điều này sẽ xảy ra rất hiếm khi? Nếu lỗi thanh toán được đặt lại tỷ lệ, tôi hy vọng nó sẽ xảy ra mỗi khi có lỗi thanh toán.
kalenjordan

điều này phụ thuộc vào các cờ và nếu nó được gọi hay không nếu bạn có thể sao chép lỗi này thì rất dễ theo dõi với trình gỡ lỗi. Tuy nhiên, nếu lỗi phương thức thanh toán của bạn không thực hiện một vòng hoàn chỉnh đến máy chủ và chỉ phá vỡ yêu cầu khi thoát, nó có thể phá vỡ tất cả sự thực thi của người quan sát phụ thuộc v.v.
Anton S

Đã thêm vào một số mã và nó vẫn thất bại. Tôi đã quên $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)dòng mặc dù vậy tôi sẽ thử nó ngay bây giờ.
kalenjordan

Vấn đề xảy ra lại và mã tôi có tại chỗ đã ngăn chặn ngoại lệ xảy ra. Nhưng giao dịch vẫn thất bại vì braintree SIMULTaneOUSLY đã ngừng hoạt động trong vài phút. Không thể tin được.
kalenjordan

1
Được rồi gãi mà. Lý do nó xảy ra lần này là vì những lý do hoàn toàn khác nhau. Một đơn đặt hàng đã cố gắng được tạo cho một địa chỉ nơi thực sự không có giá vận chuyển có sẵn, vì vậy thông báo lỗi là hợp lệ. @ProxiBlue
kalenjordan

3

Có thể đã tìm ra điều này. Tôi đã có một ngoại lệ liên quan được đưa ra với cùng tần số với tần suất này, đó là "Phương thức thanh toán được yêu cầu không khả dụng".

Hóa ra lý do nó xảy ra là vì một trong những người quan sát của tôi sales_place_order_afterđã tạo ra một đối tượng trích dẫn (và lưu nó) để tạo ra một số giá đăng ký.

Tôi đã có thể sao chép lại bằng cách kiểm tra trước bằng thẻ tín dụng xấu với tư cách là khách hàng mới (chưa đăng nhập), sau đó quay lại và sửa thẻ tín dụng và cố gắng kiểm tra lại.

Ngoại lệ được đưa ra bởi vì trong người loadCustomerQuotequan sát customer_login, nó sẽ hợp nhất các trích dẫn của bạn với nhau nếu bạn có nhiều hơn một trích dẫn và làm như vậy sẽ mất một số thông tin về phương thức thanh toán trên báo giá.

Cách khắc phục là xóa trích dẫn mới mà tôi đang tạo trong trình quan sát đăng ký của mình.

CẬP NHẬT: Không, cách khắc phục cho "Phương thức thanh toán được yêu cầu không khả dụng" không giải quyết được vấn đề này, vẫn xảy ra.


Khá muộn, nhưng đây là lý do tại sao tôi không sử dụng sự kiện đó (đơn đặt hàng bán sau) nữa. Nếu tôi cần một cái gì đó xảy ra sau khi đặt hàng, tôi tìm nạp vào hàng đợi.
philwinkle

Cũng giống như vậy, bạn sẽ giúp tôi giải quyết Vui lòng chỉ định một phương thức vận chuyển Lỗi trong trang thanh toán: magento.stackexchange.com/q/225297/57334
zus

0

Chỉ cần lưu ý, đôi khi PayPal Express sẽ báo lỗi "Không xác định được người trả tiền" khi đặt hàng. Lỗi này xuất phát từ cùng một ngoại lệ "Vui lòng chỉ định phương thức giao hàng". Trong Magento 1.8.1.0, điều này có thể được tái tạo dễ dàng bằng cách tạo ra "hợp nhất trích dẫn" hoặc "hợp nhất giỏ hàng" khi đặt hàng. Sáp nhập báo giá hoặc giỏ hàng sẽ làm cho giá vận chuyển bị xóa nhưng không được tính toán lại. Và thực tế, bạn không muốn sửa lỗi này, vì khi đó khách hàng có thể phải trả nhiều hơn số tiền họ đã thỏa thuận! Thay vào đó, bạn sẽ muốn xóa chức năng hợp nhất - hoặc nâng cấp Magento.

Điều này được cố định trong 1.9; trước tiên khách hàng phải đăng nhập trước khi được chuyển hướng đến PayPal.


0

Trong trường hợp của tôi, lỗi này bắt nguồn từ nullgiá trị trong $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.'));
}

vì vậy tôi đặt một tỷ lệ từ đây. trong phương pháp và tỷ lệ có sẵn trong magento của bạn

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.