Проверка подписи уведомления PayU POST

Я интегрирую службу API PayU в свое веб-приложение (.NET MVC Core 2.1). После того, как клиент оплачивает заказ, PayU отправляет подтверждение уведомления в виде запроса POST на мой метод API.

Пример уведомления о подтверждении PayU.

В услышанном уведомлении ставится подпись MD5.

OpenPayu-Signature:
                sender=checkout;
                signature=c33a38d89fb60f873c039fcec3a14743;
                algorithm=MD5;
                content=DOCUMENT
string incoming_signature = c33a38d89fb60f873c039fcec3a14743;

Что я должен сделать, чтобы проверить это уведомление:

Здесь приведена инструкция по проверке подписи уведомления.

1. Объедините тело входящего уведомления со значением second_key (второй ключ доступен на странице моей учетной записи в payu):

string concatenated = JSONnotification + second_key;

2. Выберите ожидаемое значение подписи, применив функцию хеширования (например, md5) к полученной цепочке символов:

string expected_signature = md5(concatenated)

3. Сравните строки: expect_signature и incoming_signature:

bool signature_is_correct = (expected_signature == incoming_signature);

Проблема в том, что контрольные суммы не совпадают.

Я обрабатываю это уведомление в своем методе контроллера:

[HttpPost]
[AllowAnonymous]
[Route("notify")]
public IActionResult TransactionConfirm([FromBody] dynamic content)

content переменная анализируется как object

и я обращаюсь к строке JsonBody как к методу content.ToString().

Возможно ли, что хэши не совпадают, потому что метод content.ToString() может возвращать не ту же строку, что и в теле запроса?

Есть ли способы обрабатывать json в качестве аргумента в методе .Net Core? (Я уже пытался разместить JObject, но метод ToString() также вернул строку, сгенерированную для хэша, не совпадающую)


person Andrew    schedule 21.01.2019    source источник


Ответы (1)


Чтобы вычислить соответствующий хэш, вам нужно прочитать входящий запрос как есть, без его десериализации. Так что да, ваш сгенерированный JSON, вероятно, отличается от отправленного (пробелы).

Я не совсем знаком с ASP.NET Core, но в старой ASP.NET вы могли прочитать содержимое запроса, используя:

var json = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
person jahu    schedule 18.11.2019