eBay GetOrders: как отличить комбинированные заказы от оригинальных транзакций

Моя интеграция с eBay сломалась после нескольких месяцев работы, и я не уверен, что это ошибка или нет.

Мой покупатель совершил 2 транзакции из двух разных предметов, а затем объединил их, чтобы сохранить доставку. Все это произошло за считанные минуты.

Это имело следующий результат:

  • Создана новая запись о продажах (которая случайно не отображается в менеджере продавца)
  • новый OrderId создан для комбинированного заказа. Содержит две транзакции (как и ожидалось). это OrderId был назначен исходным 2 заказам и объединенному (не ожидалось!)
  • Три заказа возвращены в вызов GetOrders, У всех одинаковое OrderId значение
  • CreatedTime на каждой OrderType возвращено отличается для каждого с самым последним заказом, имеющим самое позднее время (как ожидалось).

Я пытаюсь понять, как я должен знать, чтобы не отправлять все 3 заказа. Если бы мой код не пытался поместить эти заказы в словарь, я бы даже не знал, что их дублируют OrderId возвращаемые значения.

Я надеюсь, что где-то есть свойство, которое указывает, что запись заказа была объединена в другой заказ - но я не могу найти его.

Должен ли я посмотреть на время заказа и выбрать самый последний? Или есть способ исключить транзакции, которые впоследствии были объединены из результатов поиска.

3 ответа

Это мой код C# для проверки на наличие ошибок такого рода и возврата только последнего заказа. Здесь много проверок утверждений, но они еще не разбились - но опять же, я не знаю, где o.Count() != 1 когда-либо был поражен еще.

        // raw orders coming back from eBay
        var orderArrayRaw = getTransactions.ApiResponse.OrderArray.ToArray();

        // processed list to remove dupes
        var orderArray = orderArrayRaw.ToArray().GroupBy(x => x.OrderID).Select(o =>
        {
            // single unique order
            if (o.Count() == 1)
            {
                return o.Single();
            }
            else
            {
                // get most recent
                var mostRecent = o.OrderByDescending(x => x.CreatedTime).First();

                // get all the transaction IDs in the non-most-recent
                var allTransactions = o.Except(new[] { mostRecent }).SelectMany(x => x.TransactionArray.ToArray().Select(t => t.TransactionID)).OrderBy(x => x).ToArray();

                var combinedTransactions = mostRecent.TransactionArray.ToArray().Select(x => x.TransactionID).OrderBy(x => x).ToArray();

                if (allTransactions.SequenceEqual(combinedTransactions))
                {
                    // ok!
                    return mostRecent;
                }
                else
                {
                    var dupes = orderArrayRaw.ToArray().GroupBy(x => x.OrderID).Where(x => x.Count() > 1);
                    var dupeIds = dupes.Select(x => x.Key).ToArray();

                    throw new ApplicationException("The following orders were returned more than once in the response " + string.Join(", ", dupeIds));
                }
            }


        }).ToArray();

Это не гарантирует, что последний заказ - тот с объединенными узлами заказа. По моему опыту, более поздний заказ был только предполагаемой позицией предыдущего заказа. Мы сообщали бесчисленное количество раз о поддержке ebay по этому поводу, и они только говорят, что скоро это исправят.

Мое решение на данный момент - сравнить с транзакцией PayPal заказа, используя API GetTransactionDetails. Я предположил, что транзакция PayPal должна иметь объединенные записи заказов. Я создал карту позиций eBay ({ItemID: Количество}) и создал карту позиций транзакций PayPal ({Number: Количество}), а затем сравнил их с картой транзакций PayPal в качестве эталона. Если узел ордера eBay не совпадает с транзакцией PayPal, игнорируйте его и переходите к следующему узлу ордера до тех пор, пока не будет встречен узел с комбинированным ордером. Иногда тот, у которого есть объединенные записи о порядке, идет первым из узлов порядка GetOrdersResponse, поэтому просто игнорируйте следующие при обнаружении. Надеюсь, я помог.

Похоже, что заказы eBay создаются, когда покупатель совершает покупку, например, выиграв аукцион. Поэтому, когда они собираются произвести платеж, они могут объединить эти заказы вместе, и это создаст другой заказ с транзакциями. У меня такие же проблемы, просто думаю, что, если мы передадим статус заказа только для получения полных заказов?

Хорошая презентация eBay об API https://youtu.be/n4UDGrO6H_g?t=1111

Другие вопросы по тегам