В прошлой статье я рассказывал о том, как можно при помощи регистрации своего телеграм бота или сайта в клиенте Yoomoney получать токен и с его помощью получать доступ к информации об аккаунте (истории операций, деталей операций и информации о счете), это в принципе единственный вариант получить доступ к этим данным и в целом это позволяло как-то проверять оплату на своем сайте или в телеграм боте, но все же с точки зрения пользователя такой подход в котором ему нужно прикладывать какие-то усилия для того, чтобы произвести банальную оплату явно не лучший вариант, всегда хочется все сделать уже привычным способом, а именно просто ввести данные с карты и получить услугу или товар. В этой статье мы научимся это делать! Все, что вам нужно это ваш ip адрес или доменное имя и порт. Настройка уведомлений Создание ссылки для оплаты Проверка оплаты Как я уже сказал все, что вам нужно это ip адрес вашего хостинга или доменное имя и порт. Я буду пользоваться утилитой Ngrok, для тех кто не знает, Ngrok - это такой инструмент который позволяет создать защищенное туннельное соединение между локальным компьютером и интернетом. Он позволяет временно выставить локальный сервер или другие локальные сервисы наружу, делая их доступными через общедоступный url, короче говоря ваш localhost будет доступен из внешней сети «интернет». Мне это необходимо для примера, так как весь пример будет выполняться на локальной машине Видео туториал есть на GitHub проекта Заходим в кошелек ЮMoney. Если кошелька нет, создаем его, после этого нам нужно подключить HTTP/HTTPS уведомления к нашему кошельку Yoomoney. Указываем url на который хотим принимать уведомления и обязательно сохраняем секретное слово (оно нам еще понадобиться).  Ставим галочку «Отправлять HTTP‑уведомления».  Нажимаем кнопку «Готово». Отлично, наш кошелек готов к отправке уведомлений! Для дальнейших действий нам понадобиться библиотека yoomoney-api, ее можно установить с помощью следующей CLI команды: вставляем код, изменяем нужные вам параметры и запускаем его: в свойстве quickpay.LinkPayment будет находится ссылка для оплаты, а так же в консоли отобразиться следующая информация: Что произойдет в приложении на данном этапе? В данный момент у нас выполнится код который отправит на сервер Yoomoney указанные вами параметры и вернет ссылку для оплаты, а так же асинхронно сервер будет ожидать TCP подключений в течении 12 минут или до успешной оплаты (почему именно 12 расскажу далее), после чего его время жизни будет перкращено. Какие наши следующие действия? Прежде чем проводить оплату давайте все‑таки проверим, что все работает. Для этого нам нужно перейти на страницу, на которой мы подключали уведомления и нажать кнопку «Протестировать». Отлично, Ngrok показывает 2 POST / запроса, смотрим что же у нас там в консоли программы: А наша программа отлично приняла эти 2 запроса. Я не стал обозначать тестовые запросы, поэтому программа нам указывает на то, что это не текущий платеж (так как это не платеж, а просто тестовый запрос). Теперь нам осталось перейти по ссылке и произвести оплату (программу можно не перезапускать). После того как мы перешли по ссылке, ввели данные карты и код, нам нужно дождаться уведомления об оплате от нашего банка с которого мы оплачиваем, уведомление о списании придет раньше чем о зачислении. Как только пришло уведомление о списании денег в Ngrok поступил еще один пост запрос: отлично, проверяем консоль нашего приложения: Ура, мы отследили наш платеж!Что произойдет в приложении на данном этапе? После того как к нам придет в консоль «Подключен клиент», приложение асинхронно установит TCP соединение с Yoomoney и будет ожидать HTTP POST / или HTTPS POST / запрос, после того как данные придут, создастся массив байтов в который из потока мы прочитаем данные запроса, но почему мы уверены что это именно наш платеж и он пришел именно от Yoomoney?  Все просто, дело в том, что у нас есть такой уникальный параметр как Label который мы передаем при создании ссылки для оплаты, этот параметр прикрепляется к платежу и приходит нам обратно с уведомлением. Так же параметр DateTime который тоже возвращается в запросе, и вот тут нам пригождается наше секретное слово, на основе переданных параметров Yoomoney генерирует хеш который приходит нам параметром sha1_hash .  Для менее опытных следует сказать, что конечно стоит закреплять каждый платеж пользователя за этим самым пользователем (например в бд, достаточно сохранять туда дату, параметр label и amount, этого достаточно, чтобы отследить любой платеж). На этапе обработки запроса наша программа тоже генерирует хеш-код на основе параметров запроса вместе с уникальным label который мы создали при генерации ссылки и серкетным словом которое мы получили при регистрации уведомлений. После того как все данные приняты мы сверяем параметры: label + DataTime.Date + sha1_hash из запроса с нашими сохраненными, если все эти данные совпадают платеж считается «Успешным». Почему именно 12 минут? Дело в том, что Yoomoney после успешного пополнения счета отправляет на зарегистрированный url 3 уведомления (сразу после поступления средств на текущий счет, через 10 и через час), логично предположить, что если уведомление не пришло сразу и через 10 минут, оно не придет и через час, 2 минуты выделяется на то, чтобы пользователь произвел оплату (при нормальных обстоятельствах этого вполне достаточно), если он не уложится в эти 2 минуты, то 10 минут ему точно предостаточно! Если же после оплаты при нормальных обстоятельствах сообщение не придет сразу, то оно отследится через 10 минут. Если же все-таки каким-то загадочным образом платеж зачислился, но уведомление не пришло, то мы берем datetime и label этого платежа и обращаемся к коду предыдущей статьи, благодаря которому мы можем получить доступ к истории операций и по указанным параметрам его найти и проверить параметр status является ли он success ( то есть успешным). Следует сделать вывод: «Не один платеж не останется незамеченным, если средства действительно поступили насчет». Так же стоит отметить, что только по протоколу HTTPS можно будет иметь доступ к контактной информации (однако в текущей версии api с этим возникаю проблемы, а поддержка Yoomoney пока что игнорирует вопросы и просьбы). Пример того как должно было быть: Вывод: Но ничего страшного тут нет учитывая, что по уникальному параметру label  мы можем отследить любого пользователя, это не вызывает особых проблем. Отлично, теперь мы можем принимать платежи! Если данный пост вам помог, то поставьте звезду на GitHub. Мне будет очень приятно!