Ebay API C# 不使用 AddDispute 取消订单
Ebay API C# Cancel Order without AddDispute
因此,通过查看下面的 link,我发现您可以通过与 API 提出争议来取消订单。
Cancel eBay order via API
但我不想为每次取消都提出争议。我想做的是能够以编程方式取消订单而不引发争议。看起来这应该是可能的,因为它在 GUI 中可用。在 GUI 中,如果您查找订单并单击订单屏幕的下拉菜单,您会看到一个取消按钮。然后在下一个屏幕上它会询问取消的原因并为您提供两个选项。我似乎无法在任何地方找到这方面的文档。我能找到的关于使用 API 取消订单的所有信息都会导致打开争议的方法。有谁知道怎么用这个方法取消订单?
我发现这可以通过使用 Post-Order API 来完成。
https://developer.ebay.com/Devzone/post-order/index.html
查看“取消”部分下的链接。
使用 KEVINUK 的代码示例更新答案:
这是我的工作示例。我用它作为一个布尔值来让我知道取消请求是否成功,这样我就可以看到从那里去哪里。
/// <summary>
///
/// </summary>
/// <param name="authToken"></param>
/// <param name="ebayFullOrderId"></param>
/// <param name="reason">Must be BUYER_ASKED_CANCEL or ADDRESS_ISSUES</param>
private static bool Cancellation_SubmitCancelRequest(string authToken, string ebayFullOrderId, string reason)
{
var status = false;
const string url = "https://api.ebay.com/post-order/v2/cancellation";
var cancelOrderRequest = (HttpWebRequest)WebRequest.Create(url);
cancelOrderRequest.Headers.Add("Authorization", "TOKEN " + authToken);
cancelOrderRequest.ContentType = "application/json";
cancelOrderRequest.Accept = "application/json";
cancelOrderRequest.Headers.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY_US");
cancelOrderRequest.Method = "POST";
//cancelOrderRequest.Headers.Add("legacyOrderId", ebayFullOrderId);
using (var streamWriter = new StreamWriter(cancelOrderRequest.GetRequestStream()))
{
string json = "{\"legacyOrderId\":\"" + ebayFullOrderId + "\",\"cancelReason\":\"" + reason + "\"}";
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
var response = (HttpWebResponse)cancelOrderRequest.GetResponse();
string result;
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
var reader = new JsonTextReader(new StringReader(result));
while (reader.Read())
{
if (reader.Value != null)
{
var pt = reader.Path;
var val = reader.Value.ToString();
var isNumeric = !string.IsNullOrEmpty(val) && val.All(Char.IsDigit);
if (pt == "cancelId" & isNumeric == true)
{
status = true;
break;
}
}
}
return status;
}
因此,通过查看下面的 link,我发现您可以通过与 API 提出争议来取消订单。
Cancel eBay order via API
但我不想为每次取消都提出争议。我想做的是能够以编程方式取消订单而不引发争议。看起来这应该是可能的,因为它在 GUI 中可用。在 GUI 中,如果您查找订单并单击订单屏幕的下拉菜单,您会看到一个取消按钮。然后在下一个屏幕上它会询问取消的原因并为您提供两个选项。我似乎无法在任何地方找到这方面的文档。我能找到的关于使用 API 取消订单的所有信息都会导致打开争议的方法。有谁知道怎么用这个方法取消订单?
我发现这可以通过使用 Post-Order API 来完成。
https://developer.ebay.com/Devzone/post-order/index.html
查看“取消”部分下的链接。
使用 KEVINUK 的代码示例更新答案:
这是我的工作示例。我用它作为一个布尔值来让我知道取消请求是否成功,这样我就可以看到从那里去哪里。
/// <summary>
///
/// </summary>
/// <param name="authToken"></param>
/// <param name="ebayFullOrderId"></param>
/// <param name="reason">Must be BUYER_ASKED_CANCEL or ADDRESS_ISSUES</param>
private static bool Cancellation_SubmitCancelRequest(string authToken, string ebayFullOrderId, string reason)
{
var status = false;
const string url = "https://api.ebay.com/post-order/v2/cancellation";
var cancelOrderRequest = (HttpWebRequest)WebRequest.Create(url);
cancelOrderRequest.Headers.Add("Authorization", "TOKEN " + authToken);
cancelOrderRequest.ContentType = "application/json";
cancelOrderRequest.Accept = "application/json";
cancelOrderRequest.Headers.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY_US");
cancelOrderRequest.Method = "POST";
//cancelOrderRequest.Headers.Add("legacyOrderId", ebayFullOrderId);
using (var streamWriter = new StreamWriter(cancelOrderRequest.GetRequestStream()))
{
string json = "{\"legacyOrderId\":\"" + ebayFullOrderId + "\",\"cancelReason\":\"" + reason + "\"}";
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
var response = (HttpWebResponse)cancelOrderRequest.GetResponse();
string result;
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
var reader = new JsonTextReader(new StringReader(result));
while (reader.Read())
{
if (reader.Value != null)
{
var pt = reader.Path;
var val = reader.Value.ToString();
var isNumeric = !string.IsNullOrEmpty(val) && val.All(Char.IsDigit);
if (pt == "cancelId" & isNumeric == true)
{
status = true;
break;
}
}
}
return status;
}