magento在程序中创建订单(create order by code)

在magento的电子商务流程中,按照正常的支付流程就能够创建订单,但有的时候我们需要在程序中自己创建订单,比如当我们的产品不需要支付(比如软件),甚至不需要登录就能下载时,我们就需要在程序中创建这样一个订单,并且为订单开发票

下面就是只需要产品Id信息就能够创建订单的代码


 protected function _createOrder($productId) {
        $post['product_id'][0]=$productId;
        $post['product_qty'][0]=1;

        $shoppingCart = array();
        for ($i = 0; $i<count($post['product_id']); $i++) {
            $productId = $post['product_id'][$i];
            $productQty = $post['product_qty'][$i];
            $product = Mage::getModel('catalog/product')->load($productId);
            $shoppingCart[] = array('product'=>$product, 'productQty'=>$productQty);
        }
        //$customer = Mage::getModel('customer/customer')->load($post['customer_id']);
        $customer=null;
        $params=array('customer'=>$customer, 'shoppingCart'=>$shoppingCart,);

        $quote = $this->_prepareOrder($params);
        $order = $this->_confirmOrder($quote);
        
        /*$order->addStatusToHistory(
        $order->getStatus(),
        Mage::helper('alipay')->__('Customer successfully returned from Alipay')
        );

        $order->save();
        $this->saveInvoice($order);*/
        $invoice=$this->_invoiceOrder($order);
    }
    
     protected function _prepareOrder($params) {
        foreach($params as $k=>$v) { $$k=$v; }
        $storeId = Mage::app()->getStore()->getId();

        $quote = Mage::getModel('sales/quote'); //sets ship/bill address
        //$quote->getBillingAddress()->setShouldIgnoreValidation(true);
        //$quote->getShippingAddress()->setShouldIgnoreValidation(true);

        $store = $quote->getStore()->load($storeId);
        $quote->setStore($store);

        foreach($shoppingCart as $shoppingItem) {
            foreach($shoppingItem as $k=>$v) { $$k=$v; }
            $quoteItem=Mage::getModel('sales/quote_item')->setProduct($product);
            $quoteItem->setQuote($quote);
            $quoteItem->setQty($productQty);
            $quote->addItem($quoteItem);
        }

        $shippingAddress = $quote->getShippingAddress();
        $shippingAddress->setShippingMethod('freeshipping');
        $rate = new Mage_Sales_Model_Quote_Address_Rate();
        $rate->setCode('freeshipping');
        $shippingAddress->addShippingRate($rate);
        $shippingAddress->setCollectShippingRates(true);
                
        $quote->getPayment()->setMethod('purchaseorder');
        $quote->collectTotals()->save();

        return $quote;
    }
    protected function _confirmOrder($quote) {
        $service = Mage::getModel('onepagecheckout/service_quote', $quote);
        $service->submitAll();
        Mage::getSingleton('checkout/session')->setLastQuoteId($quote->getId())
            ->setLastSuccessQuoteId($quote->getId())
            ->clearHelperData();
        return $service->getOrder();
    }

    protected function saveInvoice(Mage_Sales_Model_Order $order)
    {
        if ($order->canInvoice())
        {
            $convertor = Mage::getModel('sales/convert_order');
            $invoice = $convertor->toInvoice($order);
            foreach ($order->getAllItems() as $orderItem)
            {
                if (!$orderItem->getQtyToInvoice())
                {
                    continue ;
                }
                $item = $convertor->itemToInvoiceItem($orderItem);
                $item->setQty($orderItem->getQtyToInvoice());
                $invoice->addItem($item);
            }
            $invoice->collectTotals();
            $invoice->register()->capture();
            Mage::getModel('core/resource_transaction')
            ->addObject($invoice)
            ->addObject($invoice->getOrder())
            ->save();
            return true;
        }

        return false;
    }
    
    protected function _invoiceOrder($order) {
        $convertOrder=Mage::getSingleton('sales/convert_order');
        $invoice=$convertOrder->toInvoice($order);

        foreach ($order->getAllItems() as $item) {
            $invoiceItem = $convertOrder->itemToInvoiceItem($item);
            if ($item->getParentItem()) {
                $invoiceItem->setParentItem($invoice->getItemById($item->getParentItem()->getId()));
            }
            $invoiceItem->setQty($item->getQtyToInvoice());
            $invoice->addItem($invoiceItem);
        }

        $invoice->collectTotals();
        $invoice->register();

        $orderPayment=$order->getPayment();
        $orderPayment->pay($invoice);

        // workaround for magento 1.4
        $invoice->getOrder()->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_SHIP, false);
        $order = $invoice->getOrder();
        $order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE);
        $status = $order->getConfig()->getStateDefaultStatus(Mage_Sales_Model_Order::STATE_COMPLETE);
        $order->addStatusToHistory($status);

        $transaction = Mage::getModel('core/resource_transaction');
        $transaction->addObject($invoice);
        $transaction->addObject($invoice->getOrder());
        $transaction->save();

        $invoice->save();

        return $invoice;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值