我一直在使用相关方法 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)
});