चेकआउट के दौरान "कृपया शिपिंग विधि निर्दिष्ट करें" अपवाद प्राप्त करना


18

मुझे उत्पादन में इस त्रुटि के लिए अपवाद लॉग मिल रहे हैं, लेकिन मैं अपने स्थानीय या मंचन वातावरण में इस मुद्दे को पुन: पेश करने में असमर्थ हूं, इसलिए समस्या निवारण के लिए यह बहुत कठिन है।

त्रुटि उत्पन्न होती है Mage_Sales_Model_Service_Quote::_validate()क्योंकि $rateद्वारा दिया गया रिटर्न $rate = $address->getShippingRateByCode($method)खाली है।

मैंने कोशिश की है कि जो कुछ चल रहा है उसका बेहतर अंदाजा लगाने के लिए कुछ लॉगिंग में जोड़ा गया है, और मैं देख सकता हूं कि $methodइसमें सही शिपिंग विधि है।

मेरा सबसे अच्छा अनुमान है कि इस प्रक्रिया में कुछ बिंदु पर, शिपिंग दरों को हटा दिया जा रहा है जब उन्हें होना चाहिए।

मैंने देखा है कि हर बार यह अपवाद होता है, यह वैध अपवाद के तुरंत बाद होता है, जैसे कि अमान्य क्रेडिट कार्ड। मैंने एक अमान्य क्रेडिट कार्ड का उपयोग करके इस मुद्दे को फिर से शुरू करने की कोशिश की है, फिर एक वैध है, लेकिन यह मेरे लिए पुन: पेश नहीं करता है - मंचन, उत्पादन या स्थानीय में।

मेरा प्रारंभिक कूबड़ यह था कि शायद शिपिंग विधि पहले वैध अपवाद के बाद कहीं खो रही थी, लेकिन ऐसा नहीं है, क्योंकि मैं देख रहा हूं कि $methodउस समय इसका सही मूल्य है कि यह अपवाद फेंक दिया गया है।

चेकआउट मॉड्यूल जो मैं उपयोग कर रहा हूँ वह बहुत बढ़िया है - यह वास्तव में मेरे ज्ञान के लिए कोई कस्टम तर्क नहीं है जब आदेश दिया जाए कि यहाँ समस्याएँ पैदा हों, लेकिन संबंधित हो सकते हैं।

अद्यतन करें: मैंने कुछ कोड जोड़े हैं यदि वे गायब हैं तो दरों को याद करने का प्रयास करें।

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.'));
        }
    }

क्या आप 3th पार्टी शिपिंग एक्सटेंशन का उपयोग कर रहे हैं? Flatrate की तरह एक देशी Magento विधि के साथ परीक्षण शायद कुछ अंतर्दृष्टि यह चेकआउट विस्तार है कि क्या है या शिपिंग विस्तार देना होगा
Sander Mangel

1
मैंने इसके उत्पादन के साथ एक स्टोर भी देखा है, अक्सर उत्तराधिकार में कई बार। हम कभी भी किसी भी वातावरण में खुद को पुन: पेश करने में सक्षम नहीं हुए हैं।
पीटर ओ'कालाघन

@ सैंडर, हाँ हम एक 3rd पार्टी एक्सटेंशन का उपयोग कर रहे हैं। मुझे पूरा यकीन है कि यह मूल कारण नहीं है, क्योंकि यह कलेक्टोरेट्स पर दरों को लौटाता है () विधि ठीक है और यहां तक ​​कि उन मामलों के लिए भी जहां यह विफल रहता है, मैं देख सकता हूं कि एपीआई बस ठीक पर वापस कर दिए गए थे।
कालेंजॉर्डन

@ कैग्स, वास्तव में ?? जानकर अच्छा लगा, शायद हमें यह टीम को टैग करना होगा। यह उन चीजों में से एक है जो महत्वपूर्ण है, लेकिन क्योंकि यह बहुत ही बार-बार प्रजनन करता है, यह एक बड़ी प्राथमिकता नहीं है।
कालेंजर्डन

@SanderMangel, दुर्भाग्यवश, फ़्लैट्रेट के साथ इसे आज़माना एक विकल्प नहीं है, क्योंकि हम समस्या के पुनरुत्पादन के प्रयास के लिए उत्पादन में सैकड़ों ग्राहकों को सही शिपिंग दरों की सेवा देना बंद नहीं कर सकते हैं। अगर मैं अपने स्थानीय परिवेश में इसे पुन: पेश कर सकता हूं, तो निश्चित रूप से एक वेनिला शिपिंग विधि के खिलाफ परीक्षण करना पहली चीजों में से एक है जो मैं कोशिश करूंगा।
कालेंजर्डन

जवाबों:


8

आपको यह समझना होगा कि दरें कैसे काम करती हैं और उनसे कैसे अनुरोध किया जाता है। मूल रूप से दरों का अनुरोध तब किया जाता है जब ->setCollectShippingRates(true)shippinAddress ऑब्जेक्ट पर सेट किया जाता है और इसके परिणामस्वरूप दरों को एकत्र किया जाता है और रेट टेबल में संग्रहीत किया जाता है। इस तालिका को बाद में खाली किया जाता है और फिर से नए दर अनुरोध पर भरा जाता है।

आपके मामले में क्या हो रहा है कि त्रुटि को फेंक दिया जाता है और अनुरोध दोहराया जाता है और दरों का अनुरोध नहीं किया जाता है, लेकिन वहां होने की उम्मीद की जाती है। तो कोशिश करें और दरों के संग्रह को बल दें

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

और फिर योगों को याद करने की कोशिश करें अगर यह काम नहीं करता है

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

चेतावनी दी जाती है कि कई बार कॉलडॉटल्स को कॉल करना आपके योग को गड़बड़ कर सकता है यदि कुछ एक्सटेंशन ऑब्जेक्ट्स को सही तरीके से लागू नहीं करते हैं (एक सामान्य)


धन्यवाद, समझ में आता है। किसी भी विचार क्यों ऐसा होता है शायद ही कभी? यदि भुगतान त्रुटि दरों को रीसेट कर रही थी, तो मुझे उम्मीद है कि हर बार भुगतान त्रुटि होने पर ऐसा होगा।
कालेंजर्डन

यह झंडे पर निर्भर करता है और अगर यह कहा जाता है या नहीं यदि आप इसे त्रुटि पर दोहरा सकते हैं तो डिबगर के साथ ट्रेस करना आसान है। हालाँकि, यदि आपकी भुगतान विधि त्रुटि सर्वर के लिए एक पूर्ण राउंडट्रिप नहीं करती है और बस बाहर निकलने के अनुरोध को तोड़ देती है तो यह सभी आश्रित पर्यवेक्षक के निष्पादन को तोड़ सकता है
एंटोन एस

कुछ कोड में जोड़ा गया और यह अभी भी विफल रहा। मैं $this->getQuote()->getShippingAddress()->setCollectShippingRates(true)रेखा को भूल गया, हालांकि अब मैं कोशिश करने वाला हूं।
कलनज्योर्डन

समस्या फिर से हुई, और मेरे पास मौजूद कोड ने अपवाद को होने से रोक दिया। लेकिन लेनदेन अभी भी विफल रहा क्योंकि SIMULTANEOUSLY ब्रेइनट्री कुछ मिनटों के लिए नीचे था। अविश्वसनीय।
कलनजॉर्डन ० '

1
ठीक है कि खरोंच। इस बार जो कारण हुआ वह पूरी तरह से अलग कारणों से था। एक सदस्यता आदेश एक पते के लिए उत्पन्न होने की कोशिश कर रहा था जहां वास्तव में कोई शिपिंग दरें उपलब्ध नहीं थीं, इसलिए त्रुटि संदेश मान्य था। @ProxiBlue
kalenjordan

3

शायद यह पता लगा लिया है। मेरे पास एक संबंधित अपवाद था जिसे उसी आवृत्ति के साथ फेंका जा रहा था, जो कि "अनुरोधित भुगतान विधि उपलब्ध नहीं है"।

पता चलता है कि ऐसा इसलिए हो रहा था क्योंकि मेरे एक पर्यवेक्षक ने sales_place_order_afterकुछ सब्सक्रिप्शन प्राइस जेनरेट करने के लिए एक उद्धरण ऑब्जेक्ट (और इसे सहेज रहा था) बनाया था।

मैं इसे एक नए ग्राहक (लॉग इन नहीं) के रूप में खराब क्रेडिट कार्ड के साथ पहले चेक आउट करके फिर से प्राप्त करने में सक्षम था, फिर वापस जाकर क्रेडिट कार्ड को ठीक किया और फिर से चेकआउट करने का प्रयास किया।

अपवाद फेंक रहा था क्योंकि loadCustomerQuoteपर्यवेक्षक में customer_login, यह आपके उद्धरणों को एक साथ मर्ज कर देगा यदि आपके पास एक से अधिक उद्धरण हैं, और ऐसा करने पर वह उद्धरण पर भुगतान पद्धति की कुछ जानकारी खो देता है।

यह फिक्स था कि मैं अपने सब्सक्राइबर ऑब्जर्वर में जो नया उद्धरण बना रहा था, उसे हटा दूं।

अद्यतन: नहीं, "अनुरोधित भुगतान विधि उपलब्ध नहीं है" के लिए यह समस्या अभी भी हल नहीं हुई है।


काफी देर से, लेकिन यही कारण है कि मैं उस घटना (बिक्री आदेश जगह के बाद) का उपयोग बिल्कुल भी नहीं करता हूं। अगर मुझे आदेश के बाद कुछ होने की जरूरत है तो मैं एक कतार में लाऊंगा।
४।

जैसे आप चेकआउट पृष्ठ त्रुटि में "कृपया शिपिंग विधि निर्दिष्ट करें" को हल करने में मेरी मदद करेंगे: magento.stackexchange.com/q/225297/57334
zus

0

बस नोटिंग, कभी-कभी पेपाल एक्सप्रेस एक त्रुटि देगी, जो कहती है कि ऑर्डर पोजीशन पर "भुगतानकर्ता की पहचान नहीं की गई है"। यह त्रुटि उसी से उपजी है "कृपया शिपिंग विधि निर्दिष्ट करें" अपवाद। मैगेंटो 1.8.1.0 में ऑर्डर प्लेसमेंट पर "उद्धरण मर्ज" या "कार्ट मर्ज" के कारण यह आसानी से प्रतिलिपि प्रस्तुत करने योग्य है। उद्धरण या गाड़ियों को विलय करने से शिपिंग दरों को मंजूरी मिल जाएगी लेकिन पुनर्गणना नहीं होगी। और वास्तव में, आप इसे ठीक नहीं करना चाहते हैं, क्योंकि तब ग्राहक जितना वे सहमत थे उससे अधिक भुगतान कर सकते हैं! इसके बजाय आप विलय की कार्यक्षमता को हटाना चाहेंगे - या Magento को अपग्रेड करेंगे।

यह 1.9 में तय किया गया है; ग्राहकों को पहले पेपैल में रीडायरेक्ट होने से पहले लॉग इन करना होगा।


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.'));
}

इसलिए मैंने इससे एक दर निर्धारित की। विधि और दर में जो आपके Magento में उपलब्ध है

$quote = Mage::getSingleton('checkout/session')->getQuote();
$address = $quote->getShippingAddress();
$shippingMethod = 'amtable_amtable5';
$shippingMethod = 'flatrate_flatrate';
$address->setCollectShippingRates(true)->collectShippingRates()->setShippingMethod($shippingMethod);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.