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