0

我正在使用开源库 xmlrpc.net 并尝试调用具有作为关联数组的输入参数的服务。

待命文档(我正在尝试与一个名为 Magento 的 phpsite 集成,并且通过它抛出的错误,我知道它正在使用 Zend xmlrpc 库。)

方法名称:sales_order_shipment.create 为订单创建新货件

返回:字符串 - 发货增量 id

论据:

字符串 orderIncrementId - 订单增量 id 数组 itemsQty - 作为关联数组 (order_item_id ⇒ qty) 运送的商品数量 字符串评论 - 发货评论(可选) boolean email - 发送电子邮件标志(可选) boolean includeComment - 在电子邮件标志中包含评论(可选的)

所以在.Net中我已经能够得到以下工作

proxy.Create(sessionId, "sales_order_shipment.create", new object[] { 100000010, new object[] { }, "Shipment Created", true, true });

但我似乎无法弄清楚我应该为 itemsQty 传递什么 .Net 类型。new object[]{} 有效,但我需要能够传递已发货的商品,而不仅仅是创建一个包含 0 件商品的发货。可以使用哪种 .Net 类型,将使用 xmlrpc.net 映射到关联数组

4

2 回答 2

2

没有看到应该生成的 XML-RPC 请求,规范对我来说不是很清楚,但是像这样使用 XmlRpcStruct 怎么样:

XmlRpcStruct items = new XmlRpcStruct();
items["orderid1"] = 1;
items["orderid2"] = 2;

(假设订单 id 是一个字符串)

于 2011-03-11T09:05:43.450 回答
1

我一直在使用相关方法 sales_order_invoice.create 并遇到了与您相同的问题。我刚刚发现,无论出于何种原因,如果我在发票上包含注释,我都必须在传递给服务器的参数数组中插入一个额外的元素。

我正在运行 Magento EE 版本。1.11.0.2 使用 C# 和 XML-RPC.Net v2 库 (CookComputing.XmlRpcV2.dll) 将数据与 Magento 集成。

我偶然发现了这个决议,注意到空发票上的评论是“0”,这是我为该Send invoice on email (optional)字段提供的值,并决定尝试在评论之前插入一个空元素,评论出现了,但项目是仍然没有收到发票。然后我将空元素移到项目列表之前,一切正常。我检查了 API /app/code/core/Mage/Sales/Model/Order/Invoice/Api.php 的代码,但找不到出现这种情况的位置或原因。我唯一的猜测是它与解析 XML-RPC 请求的库有关,因为这个调用在其他参数的中间有一个数组,所以没有得到正确的结果。

在尝试诊断这一点时,我使用了 XML-RPC 记录器

logger = new RequestResponseLogger();
logger.Directory = "C:\Temp\";
magentoProxy.AttachLogger(logger);
logger.UnsubscribeFrom(magentoProxy);

然后,任何时候我想查看调用中的请求响应是什么,我只需在 XML-RPC 调用之前和之后放置这些调用

logger.SubscribeTo(magentoProxy);
// call to Magento that I want to see the XML for request and responses to
logger.UnsubscribeFrom(magentoProxy);

我没有看到发送给 Magento 以进行 API 调用的 XML 有任何问题。我唯一能想到的另一件事是启动带有调试器的magento,并观察当它到达Api.php文件中的那个create方法时会发生什么,或者在事情变得混乱之前的堆栈中会发生什么,但我没有当时我没有设置用于主动调试 Magento 代码的开发环境,并且现在不想花时间深入研究这方面的事情。

我所做的解决方法是在调用创建发票后添加一些代码,该发票再次从 Magento 拉下 order_info 并检查订单上的所有项目是否已开票,如果没有,它会抛出一个丑陋的错误。我认为如果在某个时候这个“错误”或导致这种情况发生的任何事情得到修复或更改,我至少会知道它是否会影响从这个电话中获得发票的订单项目。

        // Get the order items that need to be invoiced
        // this.orderInfo is the XmlRpcStruct returned from a sales_order.info call
        XmlRpcStruct[] orderItems = this.orderInfo.Contains("items") ? (XmlRpcStruct[]) this.orderInfo["items"] : new XmlRpcStruct[] { };

        XmlRpcStruct orderItemsToInvoice = new XmlRpcStruct();
        Int32 orderItemId;
        Int32 qtyOrdered;
        Int32 qtyInvoiced;
        Int32 qtyToInvoice;

        foreach (XmlRpcStruct item in orderItems)
        {
            orderItemId = item.Contains("item_id") ? Convert.ToInt32(item["item_id"]) : 0;
            qtyOrdered = item.Contains("qty_ordered") ? Convert.ToInt32(Convert.ToDecimal(item["qty_ordered"])) : 0;
            qtyInvoiced = item.Contains("qty_invoiced") ? Convert.ToInt32(Convert.ToDecimal(item["qty_invoiced"])) : 0;
            qtyToInvoice = qtyOrdered - qtyInvoiced;

            orderItemsToInvoice[Convert.ToString(orderItemId)] = Convert.ToString(qtyToInvoice);
        }

        // Invoice This Order with a comment
        String newInvoiceId = magentoProxy.salesOrderInvoiceCreate(sessionId: sessionId, arguments: new Object[] {
                this.MageIncrementId, // Order increment ID
                "", // this should not need to be here, but for some reason if I want to include a comment
                    // on the invoice I have to thave this extra empty element before the array of order items
                    // if no comment is included on the invoice this extra element is not needed, rather weird, I can not explain it.
                orderItemsToInvoice, // array    itemsQty    Array of orderItemIdQty (quantity of items to invoice)
                "Automatically invoiced prior to CounterPoint import." // Invoice Comment (optional)
                //"0", // Send invoice on email (optional) defaults to false
                //"0" // Include comments in email (optional) defaults to false
            });

        // Invoice This Order without a comment
        String newInvoiceId = magentoProxy.salesOrderInvoiceCreate(sessionId: sessionId, arguments: new Object[] {
                this.MageIncrementId, // Order increment ID
                orderItemsToInvoice // array    itemsQty    Array of orderItemIdQty (quantity of items to invoice)
            });
于 2012-09-28T18:36:25.393 回答