我在Magento之外有一个订单流,该订单使用使用Magento的直接方法和API SOAP方法来创建订单。 (起初完全使用了API,直到我们发现它不会通过订单完成的付款来传递),在大多数情况下,除了捆绑产品方面,它都可以很好地运行。我们的捆绑产品有2种带有IN的简单产品,当订单完成后,其中一种产品在捆绑包中,另一种产品分别添加。我将其跟踪到我的自定义类获取报价而不是使用现有报价的时候,但是即使运输确实经过了运输方法,但没有添加运输。我不知道会发生什么。

我的自定义课:

class createOrder{
    // Variables, construct, and address stuff here
    function getParams($item){
        $super_group = array();
        $parentId = $item['parentID'];
        $children = array($item['childID']);
        $child_qty = $item['qty'];
        foreach($children as $child){
            if(intval($child)){
                $super_group[$child] = $child_qty;
            }
        }
        // set params for product
        if (!empty($super_group)) {
            $params = array('super_group' => $super_group);
        }
        else {
            // bundled product
            if ($parentId == 121) { //Product1:
                $params = array(
                    'product' => '121',
                    'related_product' => '',
                    'qty' => "{$item['qty']}",
                    'bundle_option' => array(7=>'3',8=>'14'),
                    'bundle_option_qty' => array(7=>'1',8=>'1'),
                );
            }
            else if ($parentId == 120) { //Product2:
                $params = array(
                    'product' => '120',
                    'related_product' => '',
                    'qty' =>"{$item['qty']}",
                    'bundle_option' => array(5=>"1",6=>"2"),
                );
            }
            else if ($parentId == 146) { //Product3:
                $params = array(
                    'product' => '146',
                    'related_product' => '',
                    'qty' => "{$item['qty']}",
                    'bundle_option' => array(13=>'9',14=>'10'),
                );
            }
            else if($parentId == 382){ //Product4:
                $params = array(
                    'product' => '382',
                    'related_product' => '',
                    'qty' => "{$item['qty']}",
                    'bundle_option' => array(15=>'11',16=>'12'),
                    'bundle_option_qty'=>array(15=>'1',16=>'1'),
                );
            }   
        }
        return $params;
    }

    function completeOrder($shopping_cart_id,$pay,$gift = null,$newOTO = false){
        Mage::log(' -- start completeOrder ---');
        $error = NULL;

        // Get quote and set stuff
        // With this uncommented, products added correctly, but no shipping
        // if(!empty($this->_quote))
            // $quote = $this->_quote;
        // else
            $quote = Mage::getModel('sales/quote')->load($shopping_cart_id);
        $quote->setIsMultiShipping(false);
        $quote->setCheckoutMethod('guest');
        $quote->setCustomerId(null);
        if(isset($_SERVER['REMOTE_ADDR']))
            $quote->setRemoteIp($_SERVER['REMOTE_ADDR']);

        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
            $quote->setXForwardedFor($_SERVER['HTTP_X_FORWARDED_FOR']);

        $quote->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID);
        $quote->reserveOrderId();

        // Add shipping
        $quote->getShippingAddress()->setCollectShippingRates(true);
        $quote->getShippingAddress()->collectShippingRates();

        // $quote->collectTotals();
        $quote->save();

        $payment=$quote->getPayment();
        $convertQuote = Mage::getSingleton('sales/convert_quote');
        $order = $convertQuote->addressToOrder($quote->getShippingAddress());

        $order->setPayment($convertQuote->paymentToOrderPayment($payment));
        $order->getPayment()->setCcNumber($pay['cc_number']);
        $order->getPayment()->setCcType($payment->getCcType());
        $order->getPayment()->setCcExpMonth($payment->getCcExpMonth());
        $order->getPayment()->setCcExpYear($payment->getCcExpYear());
        $order->getPayment()->setCcLast4(substr($pay['cc_number'],-4));

        $order->setBillingAddress($convertQuote->addressToOrderAddress($quote->getBillingAddress()));
        $order->setShippingAddress($convertQuote->addressToOrderAddress($quote->getShippingAddress()));
        foreach($quote->getAllItems() as $item){
            $orderItem = $convertQuote->itemToOrderItem($item);
            if ($item->getParentItem()) {
                $orderItem->setParentItem($order->getItemByQuoteItemId($item->getParentItem()->getId()));
            }
            $order->addItem($orderItem);
        }

        try{
            $order->place();
            $order->save();

            $this->orderID = $order->getIncrementId();
            if($newOTO)
                $order->sendNewOrderEmail();
        } catch (Exception $e){
            Mage::log($e->getMessage());
            Mage::log($e->getTraceAsString());
            if($e->getMessage() == "Error in capturing the payment") {
                $error = "A problem has occured with the credit card you are providing. Please try again, or call us at 1-877-371-1807.";
            }
            else {
                $error = "There has been an error placing your order. Please review the information below.";
            }
        }
        return $error;  
    }

这些被调用:

产品和运输:

foreach ($_SESSION['cart'] as $item) {
    Mage::log('item');
    $params = $OTOrder->getParams($item);
    $parentId = $item['parentID'];
    $parentIDs[] = $parentId;
    if($parentId) {
        try {
            //Get object of main grouped product
            $product = Mage::getModel('catalog/product')->load($parentId);

            //Check product availability
            if (!$product) {
                Mage::log("Error in product! ".$parentId);
                return;
            }

            //Get cart object
            $cart = Mage::getModel('checkout/cart');
            $quote = Mage::getModel('sales/quote')->load($shopping_cart_id);
            if (!$quote) {
                Mage::log("Error in quote! ".$parentId);
                return;
            }
            //Add product to cart with specified parameters and save the cart object
            $quote->addProduct($product, new Varien_Object($params))->save();
            $quote->collectTotals()->save();
            $OTOrder->setQuote($quote);
            Mage::getSingleton('checkout/session')->setCartWasUpdated(true);

        }
        catch (Mage_Core_Exception $e){
            $_SESSION['orderError'] = 'Error in "'.$item['desc'].'"';
            Mage::log("parentID: ".$e->getMessage());
            if (Mage::getSingleton('checkout/session')->getUseNotice(true)){
                header("Location: OrderForm.php?keycode=" . $keystring);
                exit;
            }
            else{
                $messages = array_unique(explode("\n", $e->getMessage()));
                foreach ($messages as $message) {
                    $_SESSION['orderError'] .= "<br />".$message;
                }
                header("Location: OrderForm.php?keycode=" . $keystring);
                exit;
            }
        }
        catch (Exception $e){
            $_SESSION['orderError'] = 'Error in "'.$item['desc'].'"';
            $_SESSION['orderError'] .= "Cannot add the item to shopping cart.";
            Mage::log("Adding product: ".$e->getMessage());
            header("Location: OrderForm.php?keycode=" . $keystring);
            exit;
        } 
    }
}
    $pass = false;
while(!$pass) {
    try{
        $methods = $soap->shoppingCartShippingList($session_id, $shopping_cart_id);
        foreach($methods as $method){
            if($method->method_title != 'Priority')
                $shipCode = $method->code;              
        }
        if(!empty($shipCode))
            $soap->shoppingCartShippingMethod($session_id, $shopping_cart_id, $shipCode);
        $pass = true;
    }
    catch(Exception $e)
    {
        if($e->getMessage() == 'Error Fetching http headers')
            $pass == false;
        else{
            $_SESSION['orderError'] = "Problem with billing or shipping address.";
            $_SESSION['error'] = true;
            Mage::log("shoppingCartShippingList: ".$e->getMessage());
            header("Location: OrderForm.php?keycode=" . $keystring);
            exit;
        }
    }
}

订单完成的要求:

$err = $OTOrder->completeOrder($shopping_cart_id,$paymentMethod,$giftOption);
有帮助吗?

解决方案 2

由于在我的功能开头重新提出报价使捆绑产品弄乱了,所以我只是清空了购物车并重新输入了所有产品。我创建了一个数组:

$allProducts[$parentId] = $params;

将其存储在$ otorder-> setProducts()中,然后更改我的功能:

function completeOrder($shopping_cart_id,$pay,$gift = null,$newOTO = false){
    Mage::log(' -- start completeOrder ---');
    $error = NULL;

    $quote = Mage::getModel('sales/quote')->load($shopping_cart_id);

    foreach($quote->getAllItems() as $item){
        $quote->removeItem($item->getId()); 
    }
    $quote->save();
    foreach($this->_products as $parentId=>$params)
    {
        //Get object of main grouped product
        $product = Mage::getModel('catalog/product')->load($parentId);

        //Check product availability
        if (!$product) {
            Mage::log("Error in product! ".$parentId);
            return;
        }

        //Get cart object
        $cart = Mage::getModel('checkout/cart');
        $quote = Mage::getModel('sales/quote')->load($shopping_cart_id);
        if (!$quote) {
            Mage::log("Error in quote! ".$parentId);
            return;
        }
        //Add product to cart with specified parameters and save the cart object
        $quote->addProduct($product, new Varien_Object($params))->save();
        $quote->collectTotals()->save();
        Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
    }

它比我想要的要笨重,但似乎有效。

其他提示

我能够使用以下代码创建捆绑产品的订单

<?php

require_once 'app/Mage.php';
define('MAGENTO_ROOT', getcwd());

$compilerConfig = MAGENTO_ROOT . '/includes/config.php';
if (file_exists($compilerConfig)) {
    include $compilerConfig;
}

class JLR_Orders_Create {
  public function CreateOrder2() {

        try {
            $storeObject = Mage::getModel('core/store')->load(4); // Store ID
        }
        catch(Exeception $ex)
        {
            echo $ex->getMessage();
        }


        $cart_api = Mage::getModel('checkout/cart_api');
        $quoteId = $cart_api->create($storeObject->getStoreId());
        $quote = Mage::getModel('sales/quote')->loadByIdWithoutStore($quoteId);

        $product = Mage::getModel('catalog/product');
        $productId = $product->getIdBySku('SBTEMP075'); // Bundle Product SKU

        $params = array(
            'product' =>  $productId,
            'related_product' => null,
            'bundle_option' => array(
                    164 => '3235', // Bundle Options
                    165 => '3240',
                    166 => '3241'

                ),
             'bundle_option_qty' => array(
                    164 => 1, // Bundle Quantities
                    165 => 1,
                    166 => 1
                ),
        );

        $request = new Varien_Object();
        $request->setData($params);

        $_value['Email'] = 'ZsdfsXcrtdfert@gmail.com';
        $_value['First Name'] = 'Jeffrey';
        $_value['Last Name'] = 'Roberts';
        $_value['Address'] = 'Biscayne Blvd';
        $_value['City'] = 'Miami';
        $_value['Post Code'] = '33137';
        $_value['Telephone'] = '305-555-1155';

        // create customer
        $customer = Mage::getModel('customer/customer');
        $password = 'stackexchange';

        $customer->setWebsiteId(4); // Set Website ID
        $customer->loadByEmail($_value['Email']);
        $customer->setWebsiteId(4); // Set Website ID AGAIN!

        if(!$customer->getId()) {
            $customer->setEmail($_value['Email']);
            $customer->setFirstname($_value['First Name']);
            $customer->setLastname($_value['Last Name']);
            $customer->setPassword($password);
            $customer->setMode(Mage_Checkout_Model_Cart_Customer_Api::MODE_REGISTER);
        }
        else
        {
            $customer->setMode(Mage_Checkout_Model_Cart_Customer_Api::MODE_CUSTOMER);
        }

        try {
            $customer->save();
            $customer->setConfirmation(null);
            $customer->save();
        }
        catch (Exception $ex) {
            error_log(var_dump($ex));
        }

        if (! $customer->getId() ){
            return $this;                
        }

        $dataShipping = array(
            'firstname'  => $_value['First Name'],
            'lastname'   => $_value['Last Name'],
            'street'     => $_value['Address'],
            'city'       => $_value['City'],
            'region'     => '',
            'region_id'  => '',
            'postcode'   => $_value['Post Code'],
            'country_id' => 'CZ', //todo: un-hardcode this.
            'telephone'  => $_value['Telephone'],
        );

        $customerAddress = Mage::getModel('customer/address');

        if ($defaultShippingId = $customer->getDefaultShipping()){
             $customerAddress->load($defaultShippingId); 
        } else {   
             $customerAddress
                ->setCustomerId($customer->getId())
                ->setIsDefaultShipping('1')
                ->setSaveInAddressBook('1')
             ;
             $customer->addAddress($customerAddress);
        }            

        try {
            $customerAddress
                ->addData($dataShipping)
                ->save()
            ;           
        } catch(Exception $e){
            Mage::log('Address Save Error::' . $e->getMessage());
        }

        $customer->save();

        $product = new Mage_Catalog_Model_Product();
        $product->load($productId);

        $quote->addProduct($product, $request);
        $quote->setCustomer($customer);
        $quote->assignCustomer($customer);
        $quote->getShippingAddress()->addData($dataShipping)->setShippingMethod('tablerate_bestway');
        $quote->getShippingAddress()->setShippingMethod('tablerate_bestway');
        $quote->getShippingAddress()->setCollectShippingRates(true);
        $quote->getShippingAddress()->collectShippingRates(); 
        $quote->setPayment($quote->getPayment()->setMethod('free'));
        $quote->collectTotals();
        $quote->save();

        $convertQuoteObj = Mage::getModel('sales/convert_quote');
        $orderObj = $convertQuoteObj->toOrder($quote);

        $orderPaymentObj=$convertQuoteObj->paymentToOrderPayment($quote->getPayment());

        $orderObj->setBillingAddress($convertQuoteObj->addressToOrderAddress($quote->getBillingAddress()));
        $orderObj->setPayment($convertQuoteObj->paymentToOrderPayment($quote->getPayment()));
        $orderObj->setShippingAddress($convertQuoteObj->addressToOrderAddress($quote->getShippingAddress()));


        $qty=1;
        foreach ($quote->getShippingAddress()->getAllItems() as $item) {
            //@var $item Mage_Sales_Model_Quote_Item
            $item->setQty($qty);
            $orderItem = $convertQuoteObj->itemToOrderItem($item);
            if ($item->getParentItem()) {
                $orderItem->setParentItem($orderObj->getItemByQuoteItemId($item->getParentItem()->getId()));
            }
            $orderObj->addItem($orderItem);
        }

        $orderObj->setCanShipPartiallyItem(false);

        $totalDue=$orderObj->getTotalDue();
        echo "<p>total due: $totalDue</p>";
        $orderObj->place(); //calls _placePayment
        $orderObj->save();
        $orderId=$orderObj->getId();
        echo "<p>orderId: $orderId</p>";

    }
}

Mage::app();

$JLR = new JLR_Orders_Create();
$JLR->CreateOrder2();
许可以下: CC-BY-SA归因
scroll top