我一直在玩一個相關的方法sales_order_invoice.create跑進你做了同樣的問題。我只是發現,無論出於何種原因,如果我在發票上添加了評論,我必須在傳遞給服務器的參數數組中插入額外的元素。
我正在運行Magento EE ver。 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文件或堆棧中創建方法時會發生什麼情況,但事先會出現混亂的情況,沒有我的開發環境設置,用於當時對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)
});
謝謝 - XmlRpcStruct真的很有用! – Eleasar
Magento EE 1.13修復了很多API調用的bug。我還發現,我能夠輕鬆地獲得一個SOAP示例以使用EE 1.13,所以有一種使用XML-RPC的替代方案。我使用SOAP和EE 1.13做了一個概念證明項目(使用禮品卡),並且代碼更加簡單。我希望將XML-RPC轉換爲SOAP,以便繼續進行Magento API調用。 – mttjohnson