在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;
}