Following on from my article: ZohoCRM: Get All eBay Active Listings, this is how to get all the orders from a client's eBay.
Why?
Our use-case is a data migration from eBay to a fresh instance of Zoho Inventory. In this task, we are simply getting a CSV with all the order IDs for a particular year output as a spreadsheet.
How?
Similar to how we retrieved the eBay active listings (see article link above), we're going to use the GetOrders call for order (sales) management.
copyraw
/* Function: fn_GetEbayOrders() Purpose: Queries eBay for all orders for a specified year Date Created: 2023-03-29 (Joel Lipman) - Initial release Date Modified: 2023-03-29 (Joel Lipman) - Added in ability to list errors and query order line item IDs (ErrCode: 21917182) - Modified to check that there are some orders. More Info: - API Explorer Test Tool: https://developer.ebay.com/DevZone/build-test/test-tool/default.aspx?index=0&env=production&api=trading - GetOrders Documentation: https://developer.ebay.com/Devzone/XML/docs/Reference/eBay/GetOrders.html - eBay Errors by Number: https://developer.ebay.com/devzone/xml/docs/Reference/ebay/Errors/errormessages.htm */ // // declare v_Page = 1; v_PerPage = 100; l_Pages = List(); // // specify the maximum number of orders you think you have on eBay (check eBay homepage and see number of sales [ will be rounded to nearest 1000 ]) // the actual number may be less than this but this is for pagination estimates v_MaximumOrders = 10000; v_Year = 2022; // // set the filter for orders by status to return: All, Active, Cancelled, CancelPending, Completed, Inactive, InProcess v_OrderStatus = "All"; // // calculate from and till v_OrdersFrom = v_Year + "-01-01T00:00:00.000Z"; v_OrdersTill = v_Year + "-12-31T23:59:59.000Z"; // // now let's generate the page list to have all the available pages v_TotalNumberOfPages = ceil(v_MaximumOrders / v_PerPage); l_AddPages = leftpad(" ",v_TotalNumberOfPages).replaceAll(" ",",").toList(); for each index v_Increment in l_AddPages { l_Pages.add(v_Increment + 1); } v_TotalNumberOfPages = l_Pages.size(); // // declare variables to store order details in a JSON or ZohoDeluge Map format m_Response = Map(); l_JsonOrders = List(); // // start preparing CSV file to email for export v_ReportCSV = "Date,Order ID,Status,Amount,Currency,Notes"; l_CsvFileRows = List(); l_CsvFileRows.add(v_ReportCSV); // // get access token v_AccessToken = standalone.fn_eBay_GetAccessToken(); // v_TradingAPIVersion = 967; v_Endpoint = "https://api.ebay.com/ws/api.dll"; // // build header m_Headers = Map(); m_Headers.put("X-EBAY-API-SITEID",3); m_Headers.put("X-EBAY-API-COMPATIBILITY-LEVEL",v_TradingAPIVersion); v_ApiCall = "GetOrders"; m_Headers.put("X-EBAY-API-CALL-NAME",v_ApiCall); m_Headers.put("X-EBAY-API-IAF-TOKEN",v_AccessToken); // // build params m_Params = Map(); m_Params.put("WarningLevel","High"); m_Params.put("ErrorLanguage","en_GB"); m_Params.put("DetailLevel","ReturnAll"); m_Params.put("OrderStatus","All"); m_Params.put("SortingOrder","Ascending"); m_Params.put("CreateTimeFrom",v_OrdersFrom); m_Params.put("CreateTimeTo",v_OrdersTill); // // select which fields to return l_OutputFields = List(); l_OutputFields.add("OrderID"); l_OutputFields.add("OrderStatus"); l_OutputFields.add("AmountPaid"); l_OutputFields.add("CreatedTime"); l_OutputFields.add("TotalNumberOfPages"); l_OutputFields.add("TotalNumberOfEntries"); m_Params.put("OutputSelector",l_OutputFields); // // now lets loop through a dynamic page list for each v_Page in l_Pages { // // specify which page m_Pagination = Map(); m_Pagination.put("PageNumber",v_Page); m_Pagination.put("EntriesPerPage",v_PerPage); m_Params.put("Pagination",m_Pagination); // // convert to xml and replace root nodes x_Params = m_Params.toXML(); x_Params = x_Params.toString().replaceFirst("<root>","<?xml version=\"1.0\" encoding=\"utf-8\"?><" + v_ApiCall + "Request xmlns=\"urn:ebay:apis:eBLBaseComponents\">"); x_Params = x_Params.toString().replaceFirst("</root>","</" + v_ApiCall + "Request>"); // //info "Request Sent to eBay:"; //info x_Params; // // send the request XML as a string x_ResponseBody = invokeurl [ url :v_Endpoint type :POST parameters:x_Params headers:m_Headers ]; //info "Response from eBay:"; //info x_ResponseBody; // // get pagination results from the first iteration/page if(v_Page == 1) { // // get page results x_PaginationResult = x_ResponseBody.subString(x_ResponseBody.indexOf("<PaginationResult"),x_ResponseBody.lastIndexOf("</PaginationResult") + 19); v_TotalNumberOfOrders = x_PaginationResult.executeXPath("/PaginationResult/TotalNumberOfEntries/text()").toLong(); // // determine total number of pages required v_TotalNumberOfPages = ceil(v_TotalNumberOfOrders / v_PerPage); info "Total Order(s): " + v_TotalNumberOfOrders; info "Total Page(s): " + v_TotalNumberOfPages; } // // loop through orders in response v_OrderNodePart = "Order"; v_OrderNodeName = v_OrderNodePart + "Array"; // // check node is paired to closing tag if(x_ResponseBody.contains("</" + v_OrderNodeName + ">")) { x_OrderNode = x_ResponseBody.subString(x_ResponseBody.indexOf("<" + v_OrderNodeName),x_ResponseBody.lastIndexOf(v_OrderNodeName) + v_OrderNodeName.length() + 1); l_Orders = x_OrderNode.executeXPath("/" + v_OrderNodeName + "/" + v_OrderNodePart).toXmlList(); for each x_Order in l_Orders { // // parse the XML v_ThisOrderID = x_Order.executeXPath("//OrderID/text()"); v_ThisOrderStatus = x_Order.executeXPath("//OrderStatus/text()"); v_ThisOrderAmountPaid = x_Order.executeXPath("//AmountPaid/text()").toDecimal(); v_ThisOrderCurrency = x_Order.executeXPath("//AmountPaid/@currencyID").executeXPath("/currencyID/text()"); v_ThisOrderDateCreated = x_Order.executeXPath("//CreatedTime/text()"); // // build JSON row m_Order = Map(); m_Order.put("OrderID",v_ThisOrderID); m_Order.put("OrderStatus",v_ThisOrderStatus); m_Order.put("AmountPaid",v_ThisOrderAmountPaid); m_Order.put("Currency",v_ThisOrderCurrency); // v_ThisOrderDateCreated = if(!isnull(v_ThisOrderDateCreated),v_ThisOrderDateCreated.getPrefix(".").replaceFirst("T"," ",true).toTime(),zoho.currenttime).toString("yyyy-MM-dd HH:mm:ssZ"); m_Order.put("CreatedTime",v_ThisOrderDateCreated); // l_JsonOrders.add(m_Order); // // generate CSV row for monitoring purposes l_CsvFileRow = List(); l_CsvFileRow.add(v_ThisOrderDateCreated); l_CsvFileRow.add("\"" + v_ThisOrderID + "\""); l_CsvFileRow.add("\"" + v_ThisOrderStatus + "\""); l_CsvFileRow.add(v_ThisOrderAmountPaid); l_CsvFileRow.add(v_ThisOrderCurrency); l_CsvFileRow.add(" "); // v_CsvRow = l_CsvFileRow.toString(); l_CsvFileRows.add(v_CsvRow); } } // // report on errors of this page as well v_ErrorNodePart = "Errors"; if(x_ResponseBody.contains("<" + v_ErrorNodePart)) { x_ErrorNode = "<" + v_ErrorNodePart + "_Root>" + x_ResponseBody.subString(x_ResponseBody.indexOf("<" + v_ErrorNodePart),x_ResponseBody.lastIndexOf(v_ErrorNodePart + ">") + v_ErrorNodePart.length() + 1) + "</" + v_ErrorNodePart + "_Root>"; l_Errors = x_ErrorNode.executeXPath("//" + v_ErrorNodePart).toXmlList(); for each x_Error in l_Errors { v_ThisErrorLineItemID = x_Error.executeXPath("//ErrorParameters/Value/text()"); v_ThisErrorMessage = x_Error.executeXPath("//LongMessage/text()"); // m_Error = Map(); m_Error.put("Error Line Item ID",v_ThisErrorLineItemID); m_Error.put("Error Message",v_ThisErrorMessage); l_JsonOrders.add(m_Error); // // generate CSV row for monitoring purposes l_CsvFileRow = List(); l_CsvFileRow.add("????"); l_CsvFileRow.add("\"" + v_ThisErrorLineItemID + "\""); l_CsvFileRow.add(" "); l_CsvFileRow.add(" "); l_CsvFileRow.add(" "); l_CsvFileRow.add(v_ThisErrorMessage); // v_CsvRow = l_CsvFileRow.toString(); l_CsvFileRows.add(v_CsvRow); } } // // break if page has exceeded max if(v_Page >= v_TotalNumberOfPages) { break; } } // m_Response.put("orders",l_JsonOrders); // // lets send the CSV and JSON by email if(l_JsonOrders.size() > 0) { // // generate a CSV list for monitoring purposes v_CSVFilename = "ebay-orders-" + zoho.currenttime.toString("yyyy-MM-dd-HH-mm-ss") + ".csv"; l_CsvFileRows.add("-----------------------------" + v_CSVFilename); // // usually \n works on some systems but this one works on systems that \n doesn't f_CSVFile = l_CsvFileRows.toString(zoho.encryption.urlDecode("%0A")).toFile(v_CSVFilename); // // just adding these in case v_JsonFilename = "ebay-orders-" + zoho.currenttime.toString("yyyy-MM-dd-HH-mm-ss") + ".json"; f_JsonFile = m_Response.toString().toFile(v_JsonFilename); // // send via Email v_CountRows = l_CsvFileRows.size() - 2; v_Subject = "NextWheelsTyres: " + l_JsonOrders.size() + " eBay Orders Export for year: " + v_Year; v_Message = "Hi there!<br /><br />Please find attached a log of <b>" + l_JsonOrders.size() + "</b> order(s) created in the year <b>"+v_Year+"</b> from eBay that was exported on <b>" + zoho.currenttime.toString("EEEE, dd-MMM-yyyy") + "</b><br /><br />This is an automated email. Please do not reply to it.<br /><br />Kind Regards,<br /><br />The Team"; sendmail [ from :zoho.adminuserid to :"Joel Lipman <This email address is being protected from spambots. You need JavaScript enabled to view it.>" subject :v_Subject message :v_Message Attachments :file:f_CSVFile,file:f_JsonFile ] } // // Output return "Exported " + l_JsonOrders.size() + " order(s)";
- /*
- Function: fn_GetEbayOrders()
- Purpose: Queries eBay for all orders for a specified year
- Date Created: 2023-03-29 (Joel Lipman)
- - Initial release
- Date Modified: 2023-03-29 (Joel Lipman)
- - Added in ability to list errors and query order line item IDs (ErrCode: 21917182)
- - Modified to check that there are some orders.
- More Info:
- - API Explorer Test Tool: https://developer.ebay.com/DevZone/build-test/test-tool/default.aspx?index=0&env=production&api=trading
- - GetOrders Documentation: https://developer.ebay.com/Devzone/XML/docs/Reference/eBay/GetOrders.html
- - eBay Errors by Number: https://developer.ebay.com/devzone/xml/docs/Reference/ebay/Errors/errormessages.htm
- */
- //
- // declare
- v_Page = 1;
- v_PerPage = 100;
- l_Pages = List();
- //
- // specify the maximum number of orders you think you have on eBay (check eBay homepage and see number of sales [ will be rounded to nearest 1000 ])
- // the actual number may be less than this but this is for pagination estimates
- v_MaximumOrders = 10000;
- v_Year = 2022;
- //
- // set the filter for orders by status to return: All, Active, Cancelled, CancelPending, Completed, Inactive, InProcess
- v_OrderStatus = "All";
- //
- // calculate from and till
- v_OrdersFrom = v_Year + "-01-01T00:00:00.000Z";
- v_OrdersTill = v_Year + "-12-31T23:59:59.000Z";
- //
- // now let's generate the page list to have all the available pages
- v_TotalNumberOfPages = ceil(v_MaximumOrders / v_PerPage);
- l_AddPages = leftpad(" ",v_TotalNumberOfPages).replaceAll(" ",",").toList();
- for each index v_Increment in l_AddPages
- {
- l_Pages.add(v_Increment + 1);
- }
- v_TotalNumberOfPages = l_Pages.size();
- //
- // declare variables to store order details in a JSON or ZohoDeluge Map format
- m_Response = Map();
- l_JsonOrders = List();
- //
- // start preparing CSV file to email for export
- v_ReportCSV = "Date,Order ID,Status,Amount,Currency,Notes";
- l_CsvFileRows = List();
- l_CsvFileRows.add(v_ReportCSV);
- //
- // get access token
- v_AccessToken = standalone.fn_eBay_GetAccessToken();
- //
- v_TradingAPIVersion = 967;
- v_Endpoint = "https://api.ebay.com/ws/api.dll";
- //
- // build header
- m_Headers = Map();
- m_Headers.put("X-EBAY-API-SITEID",3);
- m_Headers.put("X-EBAY-API-COMPATIBILITY-LEVEL",v_TradingAPIVersion);
- v_ApiCall = "GetOrders";
- m_Headers.put("X-EBAY-API-CALL-NAME",v_ApiCall);
- m_Headers.put("X-EBAY-API-IAF-TOKEN",v_AccessToken);
- //
- // build params
- m_Params = Map();
- m_Params.put("WarningLevel","High");
- m_Params.put("ErrorLanguage","en_GB");
- m_Params.put("DetailLevel","ReturnAll");
- m_Params.put("OrderStatus","All");
- m_Params.put("SortingOrder","Ascending");
- m_Params.put("CreateTimeFrom",v_OrdersFrom);
- m_Params.put("CreateTimeTo",v_OrdersTill);
- //
- // select which fields to return
- l_OutputFields = List();
- l_OutputFields.add("OrderID");
- l_OutputFields.add("OrderStatus");
- l_OutputFields.add("AmountPaid");
- l_OutputFields.add("CreatedTime");
- l_OutputFields.add("TotalNumberOfPages");
- l_OutputFields.add("TotalNumberOfEntries");
- m_Params.put("OutputSelector",l_OutputFields);
- //
- // now lets loop through a dynamic page list
- for each v_Page in l_Pages
- {
- //
- // specify which page
- m_Pagination = Map();
- m_Pagination.put("PageNumber",v_Page);
- m_Pagination.put("EntriesPerPage",v_PerPage);
- m_Params.put("Pagination",m_Pagination);
- //
- // convert to xml and replace root nodes
- x_Params = m_Params.toXML();
- x_Params = x_Params.toString().replaceFirst("<root>","<?xml version=\"1.0\" encoding=\"utf-8\"?><" + v_ApiCall + "Request xmlns=\"urn:ebay:apis:eBLBaseComponents\">");
- x_Params = x_Params.toString().replaceFirst("</root>","</" + v_ApiCall + "Request>");
- //
- //info "Request Sent to eBay:";
- //info x_Params;
- //
- // send the request XML as a string
- x_ResponseBody = invokeUrl
- [
- url :v_Endpoint
- type :POST
- parameters:x_Params
- headers:m_Headers
- ];
- //info "Response from eBay:";
- //info x_ResponseBody;
- //
- // get pagination results from the first iteration/page
- if(v_Page == 1)
- {
- //
- // get page results
- x_PaginationResult = x_ResponseBody.subString(x_ResponseBody.indexOf("<PaginationResult"),x_ResponseBody.lastIndexOf("</PaginationResult") + 19);
- v_TotalNumberOfOrders = x_PaginationResult.executeXPath("/PaginationResult/TotalNumberOfEntries/text()").toLong();
- //
- // determine total number of pages required
- v_TotalNumberOfPages = ceil(v_TotalNumberOfOrders / v_PerPage);
- info "Total Order(s): " + v_TotalNumberOfOrders;
- info "Total Page(s): " + v_TotalNumberOfPages;
- }
- //
- // loop through orders in response
- v_OrderNodePart = "Order";
- v_OrderNodeName = v_OrderNodePart + "Array";
- //
- // check node is paired to closing tag
- if(x_ResponseBody.contains("</" + v_OrderNodeName + ">"))
- {
- x_OrderNode = x_ResponseBody.subString(x_ResponseBody.indexOf("<" + v_OrderNodeName),x_ResponseBody.lastIndexOf(v_OrderNodeName) + v_OrderNodeName.length() + 1);
- l_Orders = x_OrderNode.executeXPath("/" + v_OrderNodeName + "/" + v_OrderNodePart).toXmlList();
- for each x_Order in l_Orders
- {
- //
- // parse the XML
- v_ThisOrderID = x_Order.executeXPath("//OrderID/text()");
- v_ThisOrderStatus = x_Order.executeXPath("//OrderStatus/text()");
- v_ThisOrderAmountPaid = x_Order.executeXPath("//AmountPaid/text()").toDecimal();
- v_ThisOrderCurrency = x_Order.executeXPath("//AmountPaid/@currencyID").executeXPath("/currencyID/text()");
- v_ThisOrderDateCreated = x_Order.executeXPath("//CreatedTime/text()");
- //
- // build JSON row
- m_Order = Map();
- m_Order.put("OrderID",v_ThisOrderID);
- m_Order.put("OrderStatus",v_ThisOrderStatus);
- m_Order.put("AmountPaid",v_ThisOrderAmountPaid);
- m_Order.put("Currency",v_ThisOrderCurrency);
- //
- v_ThisOrderDateCreated = if(!isnull(v_ThisOrderDateCreated),v_ThisOrderDateCreated.getPrefix(".").replaceFirst("T"," ",true).toTime(),zoho.currenttime).toString("yyyy-MM-dd HH:mm:ssZ");
- m_Order.put("CreatedTime",v_ThisOrderDateCreated);
- //
- l_JsonOrders.add(m_Order);
- //
- // generate CSV row for monitoring purposes
- l_CsvFileRow = List();
- l_CsvFileRow.add(v_ThisOrderDateCreated);
- l_CsvFileRow.add("\"" + v_ThisOrderID + "\"");
- l_CsvFileRow.add("\"" + v_ThisOrderStatus + "\"");
- l_CsvFileRow.add(v_ThisOrderAmountPaid);
- l_CsvFileRow.add(v_ThisOrderCurrency);
- l_CsvFileRow.add(" ");
- //
- v_CsvRow = l_CsvFileRow.toString();
- l_CsvFileRows.add(v_CsvRow);
- }
- }
- //
- // report on errors of this page as well
- v_ErrorNodePart = "Errors";
- if(x_ResponseBody.contains("<" + v_ErrorNodePart))
- {
- x_ErrorNode = "<" + v_ErrorNodePart + "_Root>" + x_ResponseBody.subString(x_ResponseBody.indexOf("<" + v_ErrorNodePart),x_ResponseBody.lastIndexOf(v_ErrorNodePart + ">") + v_ErrorNodePart.length() + 1) + "</" + v_ErrorNodePart + "_Root>";
- l_Errors = x_ErrorNode.executeXPath("//" + v_ErrorNodePart).toXmlList();
- for each x_Error in l_Errors
- {
- v_ThisErrorLineItemID = x_Error.executeXPath("//ErrorParameters/Value/text()");
- v_ThisErrorMessage = x_Error.executeXPath("//LongMessage/text()");
- //
- m_Error = Map();
- m_Error.put("Error Line Item ID",v_ThisErrorLineItemID);
- m_Error.put("Error Message",v_ThisErrorMessage);
- l_JsonOrders.add(m_Error);
- //
- // generate CSV row for monitoring purposes
- l_CsvFileRow = List();
- l_CsvFileRow.add("????");
- l_CsvFileRow.add("\"" + v_ThisErrorLineItemID + "\"");
- l_CsvFileRow.add(" ");
- l_CsvFileRow.add(" ");
- l_CsvFileRow.add(" ");
- l_CsvFileRow.add(v_ThisErrorMessage);
- //
- v_CsvRow = l_CsvFileRow.toString();
- l_CsvFileRows.add(v_CsvRow);
- }
- }
- //
- // break if page has exceeded max
- if(v_Page >= v_TotalNumberOfPages)
- {
- break;
- }
- }
- //
- m_Response.put("orders",l_JsonOrders);
- //
- // lets send the CSV and JSON by email
- if(l_JsonOrders.size() > 0)
- {
- //
- // generate a CSV list for monitoring purposes
- v_CSVFilename = "ebay-orders-" + zoho.currenttime.toString("yyyy-MM-dd-HH-mm-ss") + ".csv";
- l_CsvFileRows.add("-----------------------------" + v_CSVFilename);
- //
- // usually \n works on some systems but this one works on systems that \n doesn't
- f_CSVFile = l_CsvFileRows.toString(zoho.encryption.urlDecode("%0A")).toFile(v_CSVFilename);
- //
- // just adding these in case
- v_JsonFilename = "ebay-orders-" + zoho.currenttime.toString("yyyy-MM-dd-HH-mm-ss") + ".json";
- f_JsonFile = m_Response.toString().toFile(v_JsonFilename);
- //
- // send via Email
- v_CountRows = l_CsvFileRows.size() - 2;
- v_Subject = "NextWheelsTyres: " + l_JsonOrders.size() + " eBay Orders Export for year: " + v_Year;
- v_Message = "Hi there!<br /><br />Please find attached a log of <b>" + l_JsonOrders.size() + "</b> order(s) created in the year <b>"+v_Year+"</b> from eBay that was exported on <b>" + zoho.currenttime.toString("EEEE, dd-MMM-yyyy") + "</b><br /><br />This is an automated email. Please do not reply to it.<br /><br />Kind Regards,<br /><br />The Team";
- sendmail
- [
- from :zoho.adminuserid
- to :"Joel Lipman <This email address is being protected from spambots. You need JavaScript enabled to view it.>"
- subject :v_Subject
- message :v_Message
- Attachments :file:f_CSVFile,file:f_JsonFile
- ]
- }
- //
- // Output
- return "Exported " + l_JsonOrders.size() + " order(s)";
Error(s):
- ErrorCode (21917182) Version 1289 - Invalid orderlineids. OrderLineItemIDs 25#########-296######## could not be found. Associated Items may have been deleted or removed.: --> Get more information by querying the item in the order --> Order Array was blank using GetOrderTransactions. --> Unresolved: Ouput line item ID as order ID and error message in notes column.
- Invalid value for header "X-EBAY-API-DETAIL-LEVEL": --> I was trying to send JSON when it should be an XML request.
- One or more specified index values were invalid. Index value must range between 0 and the length of the text Line Number:173: --> Add check if <Errors> tag exists in response
Category: Zoho :: Article: 845
Add comment