Введение

Начну с того, что я делал себе телеграмм бота и в какой-то момент решил прикрутить ему оплату, и столкнулся с такой проблемой, что готовых решений для физ-лиц на с# как будто бы нету, по этому пришлось написать свое. В итоге я создал свою библиотеку 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. Мне будет очень приятно!

Комментарии (5)


  1. akurilov
    08.11.2023 13:12

    Что, даже оформлять юрлицо не надо?

    И кстати, работает ли в РФ Stripe?


    1. willdiealone Автор
      08.11.2023 13:12

      это для физ лиц, страйп нет, по этому и начал искать выход какой-то, но я знаю еще способ как можно сделать, в регистрации приложения можно указать свой домен если есть, если нет есть сервис ngrok через него можно http принимать локалхост(ну это для тестов), а у себя временный серв разворачивать на время оплаты (минут на 10 или до первого уведомления от юмани) можно через Quartz наприер. Так вот юмани на указанный урл при регистрации приложения кидает http post, его можно просто принять и проверить, потом серв закрыть, ресурсы освободить


      1. willdiealone Автор
        08.11.2023 13:12

        ну это конечно же зависит от цели ибо в больших обьемах это уже один из самых не оптимальных вариантов...


        1. akurilov
          08.11.2023 13:12
          +1

          Я пока остановился на донатах с ботом donate и провайдером smart-glocal. Работает везде, нет заморочек с юрлицом


  1. mrrnvaa
    08.11.2023 13:12
    +1

    Спасибо за информацию!