我正在尝试使用Magento Enterprise 1.10 XML-RPC API来处理Magento安装之外的购物车/目录功能。我遇到的问题是当我加入购物车时。我可以很好地连接到API端点,登录和检索数据。以下是我用来发现Magento API工作原理的代码。
<?php
require $_SERVER['DOCUMENT_ROOT'].'/Zend/XmlRpc/Client.php';
$url = 'http://mymagento.com/api/xmlrpc';
$user = 'apiuser';
$pass = 'apipass';
$proxy = new Zend_XmlRpc_Client( $url );
$sess = $proxy->call( 'login', array( $user, $pass ) );
$cartId = $proxy->call( 'call', array( $sess, 'cart.create', array( 1 ) ) );
$pList = $proxy->call( 'call', array( $sess, 'product.list', array() ) );
$cList = $proxy->call( 'call', array( $sess, 'customer.list', array() ) );
$cList[0]['mode'] = 'customer';
$setCart = $proxy->call( 'call', array( $sess,
'cart_customer.set',
array( $cartId, $cList[0] ) ) );
foreach( $pList as $prod)
{
if( $prod['product_id'] == 5 )
{
$prod['qty'] = 5;
$addCart = $proxy->call( 'call', array( $sess,
'cart_product.add',
array( $cartId, $pAdd ) ) );
}
}
$cList = $proxy->call( 'call', array( $sess, 'cart.info', array( $cartId ) ) );
print_r( $cList );
输出:
[store_id] => 1
[created_at] => 2011-05-27 13:30:57
[updated_at] => 2011-05-27 13:31:00
[converted_at] => 0000-00-00 00:00:00
[is_active] => 0
[is_virtual] => 0
[is_multi_shipping] => 0
[items_count] => 1
[items_qty] => 5.0000
[orig_order_id] => 0
[store_to_base_rate] => 1.0000
[store_to_quote_rate] => 1.0000
[base_currency_code] => USD
[store_currency_code] => USD
[quote_currency_code] => USD
[grand_total] => 0.0000
[base_grand_total] => 0.0000
[checkout_method] => customer
...
[items] => Array
(
[0] => Array
(
[item_id] => 93
[quote_id] => 119
[created_at] => 2011-05-27 13:31:00
[updated_at] => 2011-05-27 13:31:00
[product_id] => 5
[store_id] => 1
[parent_item_id] =>
[is_virtual] => 1
[sku] => product1
[name] => product
[description] =>
[applied_rule_ids] =>
[additional_data] =>
[free_shipping] => 0
[is_qty_decimal] => 0
[no_discount] => 0
[weight] =>
[qty] => 5
[price] => 0.0000
[base_price] => 0.0000
[custom_price] =>
[discount_percent] => 0.0000
[discount_amount] => 0.0000
[base_discount_amount] => 0.0000
但是,我只是使用相同的上述会话来调用以下内容
<?php
$pInfo = $proxy->call( 'call', array( $sess, 'catalog_product.info', '5' ) );
print_r( $pInfo );
我收到有关该产品的以下信息:
[product_id] => 5
[sku] => product1
[set] => 9
[type] => virtual
[categories] => Array
(
)
[websites] => Array
(
[0] => 1
)
[type_id] => virtual
[name] => product
[description] => Test
[short_description] => Test
[news_from_date] =>
[old_id] =>
[news_to_date] =>
[status] => 1
[visibility] => 4
...
[created_at] => 2011-05-25 15:11:34
[updated_at] => 2011-05-25 15:11:34
...
[price] => 10.0000
最后,API看到商品的价格实际上是10.00美元,但是当通过API添加到购物车时,价格没有得到正确反映。
答案 0 :(得分:6)
就这样它可以是一个正式回答的问题,这是找到的解决方案,http://magentocommerce.com/boards/viewthread/227044我花了两天时间搜索这个,今天拿出一个模糊的搜索词试图找到解决方案
答案 1 :(得分:1)
我一直在看这个问题几天了。如果你通过普通的网络界面[... Mage_Checkout_CartController::addAction()
]将产品添加到购物车,对我来说没有意义。它在没有您提供地址的情况下知道价格。我终于找到了两者之间的区别。在addAction()
中,他们创建Mage_Checkout_Model_Cart
的实例,将产品添加到该实例,然后保存。在api中,他们使用Mage_Sales_Model_Quote
代替。如果你看Mage_Checkout_Model_Cart::save()
,你会看到以下两行:
$this->getQuote()->getBillingAddress();
$this->getQuote()->getShippingAddress();
这两行实际上创建了空的Mage_Sales_Model_Quote_Address
对象,这些对象将保存到数据库中。
如果您愿意/能够修改magento的代码,您可以修改Mage_Checkout_Model_Cart_Api::create()
并在$quote->save()
之前添加对这两种方法的调用,并且api和Web界面将以相同的方式工作。
我只测试了一下这个,但我真的认为这是一个错误,而不是一个功能。我会在实际的magento开发人员面前看到它,也许他们会在下一个版本中包含它。
答案 2 :(得分:0)
Magento前端和API都不同。在注册客户后的前端,它为客户创建报价,并使用创建的报价ID设置地址。但在API中,它仅使用shoppingCartCreate
服务创建引用。为了正确我们需要自定义创建服务。我做了,它对我有用。
这里提供解决方案:
编辑文件中的功能 - Mage/Checkout/Model/Cart/Api.php
public function create($store = null)
{
$storeId = $this->_getStoreId($store);
try {
/*@var $quote Mage_Sales_Model_Quote*/
$quote = Mage::getModel('sales/quote');
$quote->setStoreId($storeId)
->setIsActive(false)
->setIsMultiShipping(false)
->save();
/* Customized this for saving default address for quote and it will show price in cart info*/
$quote->getBillingAddress();
$quote->getShippingAddress()->setCollectShippingRates(true);
$quote->collectTotals();
$quote->save();
/* End cart here */
} catch (Mage_Core_Exception $e) {
$this->_fault('create_quote_fault', $e->getMessage());
}
return (int) $quote->getId();
}