Как отправить ответ OK 200 на TinkoffPayments

#c# #asp.net-core

Вопрос:

У меня есть этот метод POST, который получает уведомления от API TinkoffPayments, и теперь я возвращаюсь Tasklt;HttpResponseMessagegt; , но Tinkoff не получает статус ОК 200 ответа. Вот как они советуют сделать этот ответ в своей документации

 @POST @Path("/ok") public Response NotifyResponse() {  return Response.status(200).entity("OK").build(); }  

Но я не похож на профессионального программиста, я не знаю, как провести правильную аналогию в asp.net. Я попытался вернуть значение моего метода IActionResult и вернуть Ok(«ОК»). Я пытался определить значения HttpContext.Response , но ничего не работает. Тинькофф всегда показывает эту ошибку в тестах: "Notification Error: we don't receive answer "OK" for next notification requests: CONFIRMED. Check and fix notification management: CONFIRMED. Then try test case again" в чем может быть проблема?

 [HttpPost]  public async Tasklt;HttpResponseMessagegt; New()  {  string t1 = "";  try  {  StreamReader sr = new StreamReader(Request.Body);  t1 = await sr.ReadToEndAsync();  }  catch (Exception e){}   BotContext _dbContext = new BotContext(Environment.GetEnvironmentVariable("ConnectionString"));   Notification notification = new Notification();  try  {  TinkoffNotification tn = JsonConvert.DeserializeObjectlt;TinkoffNotificationgt;(t1);   notification.Amount = tn.Amount;  notification.Status = tn.Status;  notification.OrderId = tn.OrderId;  notification.PaymentId = tn.PaymentId;  notification.Pan = tn.Pan;  notification.RebillId = tn.RebillId;  notification.Amount = tn.Amount;  notification.CardId = tn.CardId;  }  catch{}  try  {  _dbContext.Notifications.Add(not);  _dbContext.SaveChanges();  _dbContext.Database.Connection.Close();  }  catch { }   HttpResponseMessage ht = new HttpResponseMessage();  ht.StatusCode = HttpStatusCode.OK;  ht.Content = JsonContent.Create("OK");  ht.ReasonPhrase = "OK";  return ht;  }  

Комментарии:

1. Я не уверен, на каком языке написан этот пример, но, похоже, вам просто нужно return Ok("OK"); ?

2. Как насчет того, чтобы использовать что-то вроде Fiddler4 и точно видеть, какой контент работает, а какой нет.

3. Это говорит о notification requests: CONFIRMED том , в то время как ваше действие названо New . Может быть, в этом что-то есть?

4. В настройках учетной записи Тинькофф есть поле «URI уведомлений», и только одно. Итак, я полагаю, что мне нужен только один метод для управления всеми уведомлениями. И в уведомлениях есть много разных статусов, таких как «ПОДТВЕРЖДЕНО», «ОТКЛОНЕНО» и т. Д. Так что я не думаю, что в этом проблема.

Ответ №1:

Вы не должны возвращать an HttpResponseMessage , так как это конструкция более низкого уровня. Измените тип возвращаемого значения на Tasklt;IActionResultgt; и верните OK объект.

 public async Tasklt;IActionResultgt; New() {  ...  return Ok(); }  

Комментарии:

1. Ты уверен, что это одно и то же? А как насчет OK текста?

2. Вы можете поставить return Ok("OK") , если хотите, но если это действительно не требуется, обычно достаточно 200 ок.

3. Ну, это зависит от того, чего ожидает их API. Я просто отхожу от их примера кода.

4. И ошибка, которую ОП получает от них, похоже, предполагает именно это.

5. Если Ok(«ОК») не работает, я бы предположил, что проблема не в вашем конце. Как я предлагал ранее, используйте что-то вроде fiddler, чтобы точно изучить, что отправляется обратно из вашего приложения.

Ответ №2:

Совет Нила использовать скрипача действительно помог.Тинькофф действительно хотел ответить.Тело должно быть «В порядке», а не просто стандартно реагировать на 200 ок. И когда я написал «ОК» ранее Телу, они не приняли его, потому что я не установил длину содержимого и мой фактический запрос.Тело было чем-то вроде этого:

 2 OK 0  

Использование скрипача помогло понять это. Итак, этот код работает

 [HttpPost]  public async Tasklt;IActionResultgt; New() ... StreamWriter sw = new StreamWriter(Response.Body);  Response.ContentType = "application/json";  Response.ContentLength = 2;  Response.StatusCode = 200;  await sw.WriteAsync("OK");   await sw.FlushAsync(); return Ok(); }