รับข้อยกเว้น "โปรดระบุวิธีการจัดส่ง" ในระหว่างการชำระเงิน


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

คุณใช้ส่วนขยายการจัดส่งของบุคคลที่สามหรือไม่ การทดสอบด้วยวิธี Magento แบบดั้งเดิมเช่น flatrate อาจให้ข้อมูลเชิงลึกไม่ว่าจะเป็นส่วนขยายการชำระเงินหรือส่วนขยายการจัดส่ง
Sander Mangel

1
ฉันเคยเห็นร้านค้าที่มีสิ่งนี้เกิดขึ้นในการผลิตบ่อยครั้งหลายครั้งติดต่อกัน เราไม่สามารถทำซ้ำตัวเองในสภาพแวดล้อมใด ๆ
Peter O'Callaghan

@ แซนเดอร์ใช่เราใช้ส่วนขยายจากบุคคลที่สาม ฉันค่อนข้างแน่ใจว่ามันไม่ใช่สาเหตุที่แท้จริงเพราะมันส่งคืนอัตราผ่านวิธี collectRates () ได้ดีและแม้กระทั่งในกรณีที่สิ่งนี้ล้มเหลวฉันสามารถดูว่าอัตราถูกส่งคืนผ่าน API ก็ใช้ได้
kalenjordan

@Cags จริงๆ ??! เป็นการดีที่ควรทราบเราอาจต้องติดแท็กทีมนี้ มันเป็นหนึ่งในสิ่งเหล่านั้นที่สำคัญ แต่เนื่องจากมันผลิตซ้ำได้ไม่บ่อยนัก
kalenjordan

@SanderMangel แต่น่าเสียดายที่การทดลองใช้ flatrate ไม่ใช่ทางเลือกเพราะเราไม่สามารถหยุดให้บริการอัตราการจัดส่งที่ถูกต้องให้กับลูกค้าหลายร้อยรายในการผลิตเพื่อพยายามสร้างปัญหาขึ้นมาใหม่ ถ้าฉันสามารถทำซ้ำสิ่งนี้ได้ในสภาพแวดล้อมท้องถิ่นของฉันการทดสอบวิธีการจัดส่งวานิลลาอย่างแน่นอนจะเป็นหนึ่งในสิ่งแรกที่ฉันจะลอง
kalenjordan

คำตอบ:


8

คุณต้องเข้าใจวิธีการทำงานของอัตราและวิธีการขอ โดยทั่วไปจะมีการร้องขออัตราเมื่อ->setCollectShippingRates(true)ตั้งค่าบนวัตถุ shippinAddress และจะส่งผลให้อัตราการรวบรวมและจัดเก็บในตารางอัตรา ตารางนี้จะถูกทำให้ว่างหลังจากนั้นและเติมลงในคำขออัตราใหม่อีกครั้ง

สิ่งที่เกิดขึ้นในกรณีของคุณคือข้อผิดพลาดที่เกิดขึ้นและมีการร้องขอซ้ำและไม่มีการขออัตรา แต่คาดว่าจะมี ดังนั้นลองบังคับให้มีการเก็บอัตรามากกว่า

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

แล้วพยายามจำผลรวมทั้งหมดเช่นกันถ้ามันไม่ทำงาน

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

ถูกเตือนว่าการเรียก collectTotals หลายครั้งอาจทำให้ผลรวมของคุณยุ่งเหยิงหากส่วนขยายบางอย่างไม่สามารถใช้วัตถุผลรวมได้อย่างถูกต้อง (ข้อบกพร่องทั่วไป)


ขอบคุณที่ทำให้รู้สึก ความคิดใดที่ว่าทำไมสิ่งนี้ถึงเกิดขึ้นได้น้อยมาก หากการชำระเงินผิดพลาดกำลังรีเซ็ตอัตราฉันคาดว่าจะเกิดขึ้นทุกครั้งที่มีข้อผิดพลาดในการชำระเงิน
kalenjordan

สิ่งนี้ขึ้นอยู่กับการตั้งค่าสถานะและถ้ามันถูกเรียกหรือไม่ถ้าคุณสามารถทำซ้ำนี้กับข้อผิดพลาดแล้วมันเป็นเรื่องง่ายที่จะติดตามด้วยดีบักเกอร์ อย่างไรก็ตามหากข้อผิดพลาดวิธีการชำระเงินของคุณไม่ได้ส่งไปยังเซิร์ฟเวอร์อย่างเต็มรูปแบบและเพียงแค่แบ่งการร้องขอด้วยการออกมันก็สามารถทำลายการดำเนินการของผู้สังเกตการณ์ที่ขึ้นอยู่ทั้งหมด
Anton S

เพิ่มในบางรหัสและมันยังคงล้มเหลว ฉันลืม$this->getQuote()->getShippingAddress()->setCollectShippingRates(true)เส้นไปดังนั้นฉันจะลองดู
kalenjordan

ปัญหาเกิดขึ้นอีกครั้งและรหัสที่ฉันมีอยู่ได้ป้องกันข้อยกเว้นไม่ให้เกิดขึ้น แต่การทำธุรกรรมยังคงล้มเหลวเพราะ Braintree ได้หยุดลงเพียงไม่กี่นาที เหลือเชื่อ.
kalenjordan

1
ตกลงรอยขีดข่วนที่ เหตุผลที่เกิดขึ้นในครั้งนี้มีสาเหตุที่แตกต่างกันโดยสิ้นเชิง คำสั่งซื้อสมาชิกพยายามที่จะสร้างขึ้นสำหรับที่อยู่ที่ไม่มีอัตราการส่งจริงดังนั้นข้อความแสดงข้อผิดพลาดจึงถูกต้อง @ProxiBlue
kalenjordan

3

อาจจะคิดออก ฉันมีข้อยกเว้นที่เกี่ยวข้องที่ถูกส่งไปด้วยเกี่ยวกับความถี่เดียวกันกับอันนี้ซึ่งเป็น "วิธีการชำระเงินที่ร้องขอไม่พร้อมใช้งาน"

ปรากฎว่าเหตุผลที่เกิดขึ้นนั้นเป็นเพราะผู้สังเกตการณ์คนหนึ่งของฉันออกจากsales_place_order_afterการสร้างวัตถุคำพูด (และบันทึกไว้) เพื่อสร้างการกำหนดราคาการสมัครสมาชิก

ฉันสามารถทำซ้ำได้โดยเช็คเอาท์ด้วยบัตรเครดิตที่ไม่ดีในฐานะลูกค้าใหม่ (ไม่ใช่เข้าสู่ระบบ) จากนั้นย้อนกลับไปแก้ไขบัตรเครดิตและพยายามเช็คเอาต์อีกครั้ง

ข้อยกเว้นเกิดขึ้นเนื่องจากในloadCustomerQuoteผู้สังเกตการณ์customer_loginจะรวมคำพูดของคุณเข้าด้วยกันถ้าคุณมีใบเสนอราคามากกว่าหนึ่งใบและการทำเช่นนั้นจะทำให้สูญเสียข้อมูลวิธีการชำระเงินบางส่วนในใบเสนอราคา

การแก้ไขคือการลบเครื่องหมายคำพูดใหม่ที่ฉันสร้างในผู้สังเกตการณ์การสมัครสมาชิก

อัปเดต: ไม่การแก้ไขสำหรับ "วิธีการชำระเงินที่ร้องขอไม่พร้อมใช้งาน" ไม่สามารถแก้ไขปัญหานี้ได้ แต่ยังคงเกิดขึ้น


ค่อนข้างช้า แต่นี่คือเหตุผลว่าทำไมฉันไม่ใช้เหตุการณ์นั้น (สั่งซื้อหลังจากนี้) อีกเลย หากฉันต้องการสิ่งที่จะเกิดขึ้นหลังจากการสั่งซื้อฉันดึงเข้าไปในคิว
philwinkle

เช่นเดียวกันคุณจะช่วยฉันแก้ปัญหา“ โปรดระบุวิธีการจัดส่ง” ในข้อผิดพลาดของหน้าชำระเงิน: magento.stackexchange.com/q/225297/57334
เวลา 18.00 น

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.