(주문 ID를 가정 할 문자열입니다). 어떤 이유로 든 송장에 주석을 포함하면 서버에 전달 된 인수 배열에 추가 요소를 삽입해야한다는 것을 알았습니다.
Magento EE ver을 실행 중입니다. 1.11.0.2 C# 및 XML-RPC.Net v2 라이브러리 (CookComputing.XmlRpcV2.2.ll)를 사용하여 Magento와 데이터를 통합합니다.
빈 인보이스에 대한 설명을 알아 채어이 해결 방법을 발견 한 것은 Send invoice on email (optional)
필드에 대해 입력 한 값인 "0"이며 주석 앞에 빈 요소를 삽입하기로 결정했습니다. 하지만 항목은 여전히 송장을받지 못했습니다. 그런 다음 항목 목록 앞에 빈 요소를 이동하고 모든 것이 작동했습니다. API /app/code/core/Mage/Sales/Model/Order/Invoice/Api.php에 대한 코드를 확인했지만 이것이 어디서 또는 왜 그런지를 찾을 수 없었습니다. 내 유일한 추측은 XML-RPC 요청을 구문 분석하는 라이브러리와 관련이 있다는 것이이 호출이 다른 인수의 중간에 배열을 가지고 있기 때문에 무언가를 얻지 못한다는 것입니다.내가 사용했던
logger = new RequestResponseLogger();
logger.Directory = "C:\Temp\";
magentoProxy.AttachLogger(logger);
logger.UnsubscribeFrom(magentoProxy);
그럼 언제 난 그냥 전에 이러한 호출을 넣어 무엇을 요청 응답 통화중인 표시 할 XML-RPC 로거를이 진단을 위해 노력 속과 XML- 후
RPC 호출
logger.SubscribeTo(magentoProxy);
// call to Magento that I want to see the XML for request and responses to
logger.UnsubscribeFrom(magentoProxy);
API 호출을 위해 Magento에 전송 된 XML에는 아무런 문제가 없습니다. 내가 생각할 수있는 유일한 다른 것은 디버거가 부착 된 상태에서 magento를 시작하고 Api.php 파일이나 스택에있는 메소드를 생성 할 때 일어나는 일을 지켜 보는 것입니다. 먼저 스택이 엉망이되어 버렸지 만, 당시 Magento 코드의 활성 디버깅을위한 내 dev 환경 설정이 있었고 지금 당장의 일들을 파헤치는 시간을 보내고 싶지 않았습니다.
해결 방법 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 호출에 많은 버그를 수정했습니다. 또한 EE 1.13에서 SOAP 예제를 쉽게 얻을 수 있었기 때문에 XML-RPC를 사용하는 대안이 있습니다. SOAP 및 EE 1.13을 사용하여 개념 증명 프로젝트 (선물 카드로 작업)를 수행했으며 코드 작성이 훨씬 간단했습니다. Magento API 호출을 위해 XML-RPC에서 SOAP로 전환하고 싶습니다. – mttjohnson