Введение
Начну с того, что я делал себе телеграмм бота и в какой-то момент решил прикрутить ему оплату, и столкнулся с такой проблемой, что готовых решений для физ-лиц на с# как будто бы нету, по этому пришлось написать свое. В итоге я создал свою библиотеку yoomoney-api для на С#
Если данный пост вам помог, то поставьте звезду на GitHub. Мне будет очень приятно!
Описание
Получаем токен
Информация о счете
История операций
Детали операции
Как выставить счет на оплату
Проверка оплаты
Получаем токен.
Весь туториал есть на GitHub проекта. Для того, чтобы пользоваться API Yoomoney нужно получить специальный токен. Первым делом регистрируем приложение:
1. Заходим в кошелек ЮMoney. Если кошелька нет, создаем его.
2. Переходим на страницу Регистрация приложения.
3. Указываем параметры приложения:
4. Нажимаем на кнопку Подтвердить.
Откроется страница Данные приложения, где будут указаны название вашего приложения, его идентификатор (client_id) и, если выбрана соответствующая опция, сгенерированное секретное слово (client_secret).
Готово!
Запоминаем client_id и redirect_uri, они нам еще нужны. Теперь самое сложное: заменяем на свои данные и запускаем код. Следуйте всем шагам программы.
Скачать библиотеку вы можете с помощью следующей .Net CLI команды
аdotnet add package yoomoney-api --version 1.2.0
Вставляем код и запускаем его.
using yoomoney_api.authorize;
Authorize authorize = new(clientId:"YOUR_CLIENT_ID",redirectUl:"YOUR_REDIRECT_URL",scope:new []
{
"account-info",
"operation-history",
"operation-details",
"incoming-transfers",
"payment-p2p",
});
После этого в консоли мы получим специальную ссылку по которой нужно перейти
https://yoomoney.ru/oauth/authorize?client_id=XXXXXXXXXXXXXXXXXXXXXXXXXX
Помимо консоли данную ссылку мы можем получить обратившись к свойству
authorize.AuthorizeUrl
После того как мы получили данную ссылку, переходим по ней. Нам откроется страница авторизации где мы должны будем ввести код который нам придет по номеру телефона или зарегистрированной почте, мы вводим данный код и нажимаем кнопку Подтвердить.
Далее нас перекинет на указанный вами redirect_url при регистрации приложения и вот на этой странице мы должны скопировать ее полный адрес
https://example/k/?code=A54AB5755DFA80B0167532E413C87F90CBD8677C72758EAAD6E7F1AAD341FEBEBAD7B3754D2A6E42101029C134E55CB55A382412D953497D9CE5FCC7F96FE47B92615B0167BA727E49DC81F21A36312FDF440CAD5A1813E9849167C5B7307661504D134A432DDB727FDA302E040326425F82D41F3237FCFD6A9A6DE3C904D4A1
и отдать нашему приложению параметром метода GetAccessToken
после чего в переменную token
вернется нужный нам токен доступа для дальнейших шагов.
Вставляем код и запускаем его.
var token = await authorize.GetAccessToken(code: "YOUR_СODE", clientId: "YOUR_CLIENT_ID", redirectUri: "YOUR_REDIRECT_URL");
Ура, мы получили токен!
Your access token:
4100118408605024.16F0ADB9BFE2156AF44828F2B7A7347A146B487DF8AF88343832A44F39691B888E3FFAEFE6087AD8F8C425809360F712E8A9BE9C1EC0B1906A967413A8FD66A132D786C4097D8EA4D60F086666FDABEF0FD89EFDCFB29CA4936A10E7F89463C337DED49799349B0D3A8581F7D7434A0938F3E0A9E75256752C4A78484630762A
Поздравляю, мы закончили с самой сложной частью!
Информация о счете.
Вы можете скопировать полученный токен или получить его из свойства TokenUrl класса Authorize после авторизации.
Вставьте YOUR_TOKEN и запустите этот код:
using yoomoney_api.account;
using yoomoney_api.authorize;
var client = new Client(token:authorize.TokenUrl);
var accountInfo = client.GetAccountInfo(token:YOUR_TOKEN);
accountInfo.Print();
Вывод:
Account number: 550019014512302
Account balance: 999999999999.99
Account currency code in ISO 4217 format: 643
Account status: identified
Account type: personal
Extended balance information:
--> total: 999999999999.99
--> available: 999999999999.99
--> deposition_pending: Null
--> blocked: Null
--> debt: Null
--> hold: Null
Information about linked bank cards:
No card is linked to the account
Ура, наш токен работает!
История операций.
Замените YOUR_TOKEN и запустите этот код:
var operationrHistory = client.GetOperationHistory(token:YOUR_TOKEN);
operationrHistory.Print();
Вывод:
List of operations:
operation id: --> 752413347835145104
status --> success
datetime --> 04.11.2023 11:42:27
title --> Пополнение с карты ****5769
pattern id --> Null
direction --> in
amount --> 145,50
label --> b5c57192-e7d0-4ecc-8d9d-623b8426890d
type --> deposition
amount_currency --> RUB
is_sbp_operations --> false
Как выставить счет на оплату.
Для этого воспользуемся классом Quickpay.
Способ оплаты.
Возможные значения:
PC – оплата с кошелька yoomoney,
АС – с банковской карты.
var quickpay = new Quickpay(receiver: "4100118408605024", quickpayForm: "shop",
targets: "Sponsor this project", sum: 150, label: Guid.NewGuid().ToString(),
successUrl: "YOUR_REDIRECT_URL", paymentType: "AC");
Console.WriteLine(quickpay.RedirectUri);
Получаем ссылку:
https://yoomoney.ru/quickpay/confirm?receiver=4100118408605024&quickpay-form=shop&targets=Sponsor%20this%20project&paymentType=AC&sum=150&label=e7db8012-53ee-4a1a-afa6-b448232116e7
Оплатить можно либо картой, либо переводом из кошелька.
Теперь вопрос: Как нам определить, что именно этот человек оплатил счет?
Для этого воспользуемся параметром label - параметр, который сайт или приложение присваивает конкретному переводу. Например, в качестве параметра label можно указывать код или идентификатор заказа, то есть делаем ее уникальной для того, чтобы мы могли проверить успешную оплату и сохраняем label где-то еще после генерации ссылки для оплаты для дальнейшего сравнения.
Проверка оплаты
Для этого воспользуемся еще раз воспользуемся методом GetOperationHistory
класса client.
var operationrHistory = client.GetOperationHistory(token:YOUR_TOKEN);
userHistory.Print();
Вывод:
List of operations:
operation id: --> 752413347835145104
status --> success
datetime --> 04.11.2023 11:42:27
title --> Пополнение с карты ****5769
pattern id --> Null
direction --> in
amount --> 145,50
label --> b5c57192-e7d0-4ecc-8d9d-623b8426890d
type --> deposition
amount_currency --> RUB
is_sbp_operations --> false
Для большей точности можем ориентироваться на дату datetime + label + status. В принципе этих трех параметром достаточно, чтобы отследить любой успешный перевод, но у вас ориентиры могут быть свои.
Всё! Больше ничего не нужно для приема платежей.
Заключение
Если данный пост вам помог, то поставьте звезду на GitHub. Мне будет очень приятно!
akurilov
Что, даже оформлять юрлицо не надо?
И кстати, работает ли в РФ Stripe?
willdiealone Автор
это для физ лиц, страйп нет, по этому и начал искать выход какой-то, но я знаю еще способ как можно сделать, в регистрации приложения можно указать свой домен если есть, если нет есть сервис ngrok через него можно http принимать локалхост(ну это для тестов), а у себя временный серв разворачивать на время оплаты (минут на 10 или до первого уведомления от юмани) можно через Quartz наприер. Так вот юмани на указанный урл при регистрации приложения кидает http post, его можно просто принять и проверить, потом серв закрыть, ресурсы освободить
willdiealone Автор
ну это конечно же зависит от цели ибо в больших обьемах это уже один из самых не оптимальных вариантов...
akurilov
Я пока остановился на донатах с ботом donate и провайдером smart-glocal. Работает везде, нет заморочек с юрлицом