Search code examples
c#winformsebay-apiebay-sdk

Error using eBay SDK while trying to add Item Compatibilities


I have a winform c# app that is used as an inventory management system and posts items on eBay auction. We're trying to add compatibility to the parts and when trying to revise the listing to add compatibility info, I'm getting the following error:

"No <Item.LookupAttributeArray.LookupAttribute> exists or <Item.LookupAttributeArray.LookupAttribute> is specified as an empty tag."

However, the API reference states this:

ConditionID (added): ConditionID is supported in the Sandbox for a few categories. Starting in May 2010, it will be functional in production for most categories. Use ConditionID instead of AttributeSetArray, LookupAttributeArray, or ItemSpecifics to specify the item's condition when GetCategoryFeatures shows ConditionEnabled=Enabled or Required for the listing's primary category.

public partial class MainForm : Form
{
    public List<string[]> CsvData { get; set; } = [];
    public string? SerialNumber { get; set; }
    public string? File { get; set; }

    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        Logger.Logger.LogInfo("Starting Up...");
    }

    private void TbSerial_TextChanged(object sender, EventArgs e)
    {
        SerialNumber = tbSerial.Text;
    }

    private void btnCSV_Click(object sender, EventArgs e)
    {
        var dialog = new OpenFileDialog();
        dialog.ShowDialog();
        File = dialog.FileName;

        CreateDataTable();
    }

    private void CreateDataTable()
    {
        var dataTable = new DataTable();
        dataTable.Columns.Add("Year");
        dataTable.Columns.Add("Make");
        dataTable.Columns.Add("Line");
        dataTable.Columns.Add("Model");

        if (File != null)
        {
            var streamReader = new StreamReader(File);
            while (!streamReader.EndOfStream)
            {
                var totalData = streamReader.ReadLine()?.Split(',');
                if (totalData is not { Length: > 0 }) continue;

                CsvData.Add(totalData);

                dataTable.Rows.Add(totalData[0], totalData[1], totalData[2], totalData[3]);
            }
        }

        dataGridView1.DataSource = dataTable;
    }

    private void BtnEbayUpdate_Click(object sender, EventArgs e)
    {
        if (CsvData.Count <= 0)
            Logger.Logger.LogError("You must upload a fitment file first!!");

        if (string.IsNullOrEmpty(SerialNumber))
            Logger.Logger.LogError("You must input a serial number!!");

        var itemCompatibilityTypeCollection = new ItemCompatibilityTypeCollection();

        for (var i = 0; i < CsvData.Count; i++)
        {
            var line = CsvData[i];
            if (i == 0) { continue; }
            var year = line[0];
            var make = line[1];
            var model = line[3];

            var fitmentYear = new NameValueListType
            {
                Name = "Year",
                Value = [year]
            };
            var fitmentMake = new NameValueListType
            {
                Name = "Make",
                Value = [make]
            };
            var fitmentModel = new NameValueListType
            {
                Name = "Model",
                Value = [model]
            };

            NameValueListTypeCollection fitmentData =
            [
                fitmentYear,
                fitmentMake,
                fitmentModel
            ];

            var itemCompatibilityType = new ItemCompatibilityType
            {
                NameValueList = fitmentData
            };

            itemCompatibilityTypeCollection.Add(itemCompatibilityType);
        }

        var db = new GWDB.GWDB();
        var invRecord = db.Inventories
            .Where(s => s.SerialNumber == SerialNumber && s.Status == "Auction")
            .Select(x => x)
            .FirstOrDefault();
        if (invRecord == null) return;

        var eBayId = invRecord.eBayID;
        var auction = eBay.eBay.GetItemRequest(eBayId);
        if (auction.Item == null) return;

        auction.Item.ItemCompatibilityList = new ItemCompatibilityListType
        {
            Compatibility = itemCompatibilityTypeCollection
        };

        auction.Item.ConditionID = 4000;

        var response = eBay.eBay.ReviseItem(auction.Item);
        if (response.Ack != AckCodeType.Success) return;

        Logger.Logger.LogInfo(@$"Auction {eBayId} has been updated with fitment info.");
    }
}
    public class eBay
    {
        public static eBayAPIInterfaceService eBayServiceCall(string callName)
        {
            var endpoint = "https://api.ebay.com/wsapi";
            const string siteId = "100";
            var appId = AppSettingsHelper.AppID;     // use your app ID
            var devId = AppSettingsHelper.DevID;     // use your dev ID
            var certId = AppSettingsHelper.CertID;   // use your cert ID
            const string version = "965";
            // Build the request URL
            var requestURL = endpoint
                             + "?callname=" + callName
                             + "&siteid=" + siteId
                             + "&appid=" + appId
                             + "&version=" + version
                             + "&routing=default";

            var service = new eBayAPIInterfaceService();
            // Assign the request URL to the service locator.
            service.Url = requestURL;
            // Set credentials
            service.RequesterCredentials = new CustomSecurityHeaderType
            {
                eBayAuthToken = AppSettingsHelper.Token, // use your token
                Credentials = new UserIdPasswordType
                {
                    AppId = appId,
                    DevId = devId,
                    AuthCert = certId
                }
            };
            return service;
        }

        /// <summary>
        /// Verify whether item is ready to be added to eBay.
        /// </summary>
        public static string AddEbayItem(ItemType item)
        {
            var service = eBayServiceCall("VerifyAddItem");

            var request = new VerifyAddItemRequestType
            {
                Version = "949",
                ErrorLanguage = "en_US",
                WarningLevel = WarningLevelCodeType.High,
                Item = item
            };

            try
            {
                var response = service.VerifyAddItem(request);
                if (response != null)
                {
                    switch (response.Ack)
                    {
                        case AckCodeType.Warning:
                            {
                                for (var i = 0; i < response.Errors.Count; i++)
                                {
                                    Logger.Logger.LogWarning(response.Errors[i].LongMessage);
                                    i++;
                                }
                                break;
                            }
                        case AckCodeType.Failure:
                            {
                                for (var i = 0; i < response.Errors.Count; i++)
                                {
                                    Logger.Logger.LogError(response.Errors[i].LongMessage);
                                    i++;
                                }
                                break;
                            }
                        case AckCodeType.Success:
                            {
                                Logger.Logger.LogInfo((response.Message));
                                break;
                            }
                        case AckCodeType.PartialFailure:
                            break;
                        case AckCodeType.CustomCode:
                            break;
                        default:
                            throw new ArgumentOutOfRangeException();
                    }

                    // If item is verified, the item will be added.
                    if (response.ItemID != "0") return null;
                }

                var ebayID = AddItemRequest(item);
                return ebayID;
            }
            catch (Exception ex)
            {
                Logger.Logger.LogError(@"Exception:");
                Logger.Logger.LogError($@"{ex.Message}");
                return null;
            }
        }

        /// <summary>
        /// Add item to eBay. Once verified.
        /// </summary>
        /// <param name="item">Accepts ItemType object from VerifyAddItem method.</param>
        public static string AddItemRequest(ItemType item)
        {
            try
            {
                var service = eBayServiceCall("AddItem");

                var request = new AddItemRequestType
                {
                    Version = "949",
                    ErrorLanguage = "en_US",
                    WarningLevel = WarningLevelCodeType.High,
                    Item = item
                };

                var response = service.AddItem(request);

                Logger.Logger.LogInfo($@"ItemID: {response.ItemID}");

#if DEBUG
                //Process.Start($@"http://ebay.com/itm/{response.ItemID}");
#else
                //Process.Start($@"http://ebay.com/itm/{response.ItemID}");
#endif
                return response.ItemID;
            }
            catch (Exception ex)
            {
                Logger.Logger.LogError(@"Exception:");
                Logger.Logger.LogError($@"{ex.Message}");
                return null;
            }
        }

        /// <summary>
        /// Retrieve item details.
        /// </summary>
        /// <param name="ItemID">eBay Item ID</param>
        public static GetItemResponseType GetItemRequest(string ItemID)
        {
            var service = eBayServiceCall("GetItem");
            var request = new GetItemRequestType
            {
                Version = "949",
                ItemID = ItemID
            };
            var response = service.GetItem(request);
            return response;


            //MessageBox.Show(@"=====================================");
            //MessageBox.Show(@"Item Iitle - {0}", response.Item.Title);
            //MessageBox.Show(@"=====================================");

            //MessageBox.Show(@"ItemID: {0}", response.Item.ItemID);
            //MessageBox.Show(@"Primary Category: {0}", response.Item.PrimaryCategory.CategoryName);
            //MessageBox.Show(@"Listing Duration: {0}", response.Item.ListingDuration);
            //MessageBox.Show(@"Start Price: {0} {1}", response.Item.StartPrice.Value, response.Item.Currency);
            //MessageBox.Show(@"Payment Type[0]: {0}", response.Item.PaymentMethods[0]);
            //MessageBox.Show(@"PayPal Email Address: {0}", response.Item.PayPalEmailAddress);
            //MessageBox.Show(@"Postal Code: {0}", response.Item.PostalCode);
            // ...Convert response object to JSON to see all
        }

        public static ReviseItemResponseType ReviseItem(ItemType item)
        {
            var service = eBayServiceCall("ReviseItem");
            var request = new ReviseItemRequestType
            {
                Version = "949",
                Item = item
            };
            var response = service.ReviseItem(request);
            return response;
        }

        public static bool EndEbayItem(string itemID)
        {
            try
            {
                var status = false;

                var service = eBayServiceCall("EndItem");

                var request = new EndItemRequestType
                {
                    Version = "949",
                    ErrorLanguage = "en_US",
                    WarningLevel = WarningLevelCodeType.High,
                    EndingReason = EndReasonCodeType.NotAvailable,
                    ItemID = itemID
                };

                var response = service.EndItem(request);
                if (response.Ack == AckCodeType.Success)
                    status = true;

                Logger.Logger.LogInfo($@"Auction ID {itemID} ended: {response.Ack}");
                return status;
            }
            catch (Exception ex)
            {
                Logger.Logger.LogError(@"Exception:");
                Logger.Logger.LogError($@"{ex.Message}");
                return false;
            }
        }
    }

Solution

  • Disregard. There was an issue w/ the version.