Magento Cart API 未显示价格

Posted

技术标签:

【中文标题】Magento Cart API 未显示价格【英文标题】:Magento Cart API not showing prices 【发布时间】:2011-09-03 10:20:18 【问题描述】:

我正在尝试使用 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 添加到购物车时,价格没有正确反映。

【问题讨论】:

solution found,magentocommerce.com/boards/viewthread/227044我花了两天时间搜索这个,今天想出一个晦涩的搜索词来尝试找到解决方案。 您可以回答自己的问题并将其关闭,仅供参考。 我没有足够高的贡献,不能再回答4个小时。 =\ 【参考方案1】:

正好可以正式回答问题,这里是找到的解决方案,http://magentocommerce.com/boards/viewthread/227044我花了两天时间寻找这个,今天想出一个晦涩的搜索词来尝试找到解决方案

【讨论】:

您答案中的链接已更改,不再指向解决方案。这个可以:web.archive.org/web/20120624021427/http://…【参考方案2】:

我这几天一直在研究这个问题。如果您通过正常的 Web 界面 [即 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-&gt;save()之前添加对这两个方法的调用,并且api和web界面将以相同的方式工作。

我只测试了一点,但我真的认为这是一个错误而不是一个功能。我会在实际的 magento 开发人员面前看到这个,也许他们会在下一个版本中包含它。

【讨论】:

【参考方案3】:

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();

【讨论】:

以上是关于Magento Cart API 未显示价格的主要内容,如果未能解决你的问题,请参考以下文章

magento 1.8.1中未在销售订单视图上显示原始价格?

Magento 2.3.5:使用自定义选项和价格将产品添加到购物车

Magento PayPal Express 未显示

Magento 在贝宝付款前下订单

如何使用Magento中的getQuoteItem()在购物车中添加可配置产品

Magento 试图在产品展示和类别页面上根据“尺寸属性”显示产品价格范围?