diff --git a/Lava.NET.csproj b/Lava.NET.csproj index 588f6b9..0ed0bc8 100644 --- a/Lava.NET.csproj +++ b/Lava.NET.csproj @@ -4,7 +4,13 @@ net8.0 enable enable - 1.0.0 + 1.0.1 + False + yawaflua + yawaflua + README.md + https://github.com/yawaflua/Lava.NET + ru @@ -12,4 +18,12 @@ + + + + True + \ + + + diff --git a/Program.cs b/Program.cs index f78658a..49fdd2b 100644 --- a/Program.cs +++ b/Program.cs @@ -13,54 +13,123 @@ namespace Lava.NET /// /// Токен от Lava.ru /// Тип вашего аккаунта - public class ILavaAPI(string token, LavaType type) + public class LavaAPI(string token, LavaType type) { internal readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new("https://api.lava.ru/") }; - internal async Task SendRequest(string path, LavaType? neededType, HttpMethod method, string? body = null) + /// + /// Отправка запроса на сервер + /// + /// path метода + /// требуемый тип аккаунта + /// Метод для отправки запроса + /// string body + /// string от сервера + /// Несоответсвие типа аккаунта и требуемого типа + internal virtual async Task SendRequest(string path, LavaType? neededType, HttpMethod method, string? body = null) { if (neededType != LavaType.any && neededType != type) throw new Exceptions.TypeException("Your Lava.ru account type is not equals needed type"); _httpClient.DefaultRequestHeaders.Authorization = new("", token); - using (var message = new HttpRequestMessage(method, path)) + using (var message = new HttpRequestMessage(method, _httpClient.BaseAddress + path)) { + message.Content = body == null ? new StringContent(body.ToString()) : null; var req = await _httpClient.SendAsync(message); return await req.Content.ReadAsStringAsync(); } } - - public async Task CreatePaymentAsync(PaymentRequest data) + /// + /// Создание ссылки на оплату (Выставление счета) + /// + /// Данные, передаваемые в запрос. Смотреть АПИ + /// Ответ от сервера или null + public virtual async Task CreatePaymentAsync(PaymentRequest data) => JsonConvert.DeserializeObject(await SendRequest("invoice/create", LavaType.any, HttpMethod.Post, data.ToString())); - public async Task GetPaymentInfoAsync(string id) + /// + /// Получение информации о выставленном счете, в т.ч. о том, оплачен ли счет + /// + /// айди выставленного счета + /// Ответ от сервера или null + public virtual async Task GetPaymentInfoAsync(string id) => JsonConvert.DeserializeObject(await SendRequest("invoice/info", LavaType.any, HttpMethod.Post, id)); + /// + /// Установка webhook для получения информации о пополнениях, оплате выставленных счетов и т.д. + /// + /// HTTPS url до вашего бекенда, куда должен приходить вебхук + /// public async Task SetWebhookUrl(string url) => await SendRequest("invoice/set-webhook", LavaType.any, HttpMethod.Post, url); + /// + /// Проверка токена + /// + /// public async Task pingAsync() => JsonNode.Parse(await SendRequest("test/ping", LavaType.any, HttpMethod.Get))?["status"]?.ToString().Equals(true) ?? false; } - public class PublicLavaAPI : ILavaAPI + public sealed class PublicLavaAPI : LavaAPI { - // Для обычных юзеров + общедоступное + /// + /// Для обычных юзеров, т.е. вкладка Кошелек + /// + /// токен от вашего аккаунта public PublicLavaAPI(string token) : base(token, LavaType.wallet) { } + /// + /// Получение кошельков на вашем аккаунте + /// + /// Список из кошельков или null public async Task getWallets() => JsonConvert.DeserializeObject(await SendRequest("wallet/list", LavaType.wallet, HttpMethod.Get)); + /// + /// Cоздние заявки на вывод + /// + /// данные, передаваемые в запрос + /// Стандартный ответ от сервера или null public async Task MakeWithdraw(Withdraw withdraw) => JsonConvert.DeserializeObject(await SendRequest("withdraw/create", LavaType.wallet, HttpMethod.Post, withdraw.ToString())); + /// + /// Информация о выводе + /// + /// Id заявки + /// Информация о выводе public async Task InfoWithdrawAsync(string id) => JsonConvert.DeserializeObject(await SendRequest("withdraw/info", LavaType.wallet, HttpMethod.Post, id)); + /// + /// Создание перевода + /// + /// Данные, передаваемые в запрос + /// Стандартный ответ от сервера или null public async Task MakeTransfer(Transfer data) => JsonConvert.DeserializeObject(await SendRequest("transfer/create", LavaType.wallet, HttpMethod.Post, data.ToString())); + /// + /// Получение информации о переводе + /// + /// Id перевода + /// Данные о переводе public async Task GetTransferDataAsync(string id) => JsonConvert.DeserializeObject(await SendRequest("transfer/info", LavaType.wallet, HttpMethod.Post, id)); + /// + /// Получение всех транзакций + /// + /// Необ. данные для настройки вывода + /// Все транзакции public async Task GetTransactionsAsync(TransactionParam? transaction = null) => JsonConvert.DeserializeObject(await SendRequest("transactions/list", LavaType.wallet, HttpMethod.Post, transaction?.ToString())); + /// + /// Получение банков, подключенных к СБП + /// + /// Список банков public async Task GetSBPBanksAsync() => JsonConvert.DeserializeObject(await SendRequest("withdraw/get-sbp-bank-list", LavaType.wallet, HttpMethod.Post)); } - public class BusinessLavaAPI(string token) : ILavaAPI(token, LavaType.business) + /// + /// В РАЗРАБОТКЕ + /// Часть lava.ru API, которая работает с бизнесом. Вкладка "Бизнес" dev.lava.ru + /// + /// Токен вашего аккаунта + public sealed class BusinessLavaAPI(string token) : LavaAPI(token, LavaType.business) { internal async Task SendRequest(string path, LavaType? neededType = LavaType.business, HttpMethod? method = null, string? body = null, bool isSpecial = true) { @@ -79,6 +148,11 @@ internal async Task SendRequest(string path, LavaType? neededType = Lava return await req.Content.ReadAsStringAsync(); } } + /// + /// Создание вывода + /// + /// Данные, передаваемые в запрос + /// public async Task CreatePayoffAsync(PayoffRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/create", body: request.ToString())); public async Task GetPayoffDataAsync(PayoffDataRequest request) diff --git a/README.md b/README.md index ace0a02..5656af8 100644 --- a/README.md +++ b/README.md @@ -1 +1,79 @@ -# Lava.NET \ No newline at end of file +# Lava.NET + API lava.ru. + - API + + [API lava.ru](https://dev.lava.ru/) +# +## +```bash +dotnet add package Lava.NET +``` +### +```cs +using Lava.NET; +public class Program +{ + public static async Task Main(string[] args) + { + var publicLavaApi = new PublicLavaAPI("[ ]"); + // ... + } +} +``` +## ASP.NET : +```cs +// Startup.cs + +public void ConfigureServices(IServiceCollection services) +{ + var publicLavaApi = new PublicLavaAPI("[ ]"); + services.AddControllers(); + services + + .AddSwaggerGen(); + + services + // ... + .AddSingleton(publicLavaAPI); +} +``` + +## (.NET 8): +```cs +// PaymentController.cs + +[ApiController] +[Route("/payment/")] +public class PaymentController(PublicLavaAPI lavaAPI) : ControllerBase +{ + + + [HttpPost("lava")] + public async Task ValidatePaymentLava([FromBody] WebhookResponse webhookResponse) + { + // + + return Ok(); // 200, , 15 . + } +} +``` + +## : +```cs +var publicLavaApi = new PublicLavaAPI("[ ]"); +var createdPayment = await publicLavaApi.CreatePaymentAsync( + new (){ + comment = " Telegram ", // . + hook_url = $"https://example.com/api/payment/lava", // . + merchant_id = "AskMeAboutBOT", // . + merchant_name = "AskMeAboutBOT", // . + custom_fields = $" , webhook", // . + success_url = $"https://example.com/", // . + sum = 39.00f, + wallet_to = "R123123123" + } +); +Console.Out.WriteLine(createdPayment.url); + +// >>> 'https://p2p.lava.ru/form?id=1ee31634-e3e0-34ce-1423-b5b4cb524c6a' +``` diff --git a/Types/LavaAPI/Payment.cs b/Types/LavaAPI/Payment.cs index 352fc9e..32bf7d0 100644 --- a/Types/LavaAPI/Payment.cs +++ b/Types/LavaAPI/Payment.cs @@ -8,31 +8,105 @@ namespace Lava.NET.Types.LavaAPI { public class PaymentRequest : IBase { - public string wallet_to { get; set; } - public float sum { get; set; } + /// + /// Ваш номер счета + /// + public string wallet_to { get; set; } + /// + /// Сумма с копейками и f на конце + /// Пример: 1.00f + /// + public float sum { get; set; } = 1.00f; + /// + /// Уникальный номер счета в вашей системе + /// public string? order_id { get; set; } + /// + /// Url для отправки webhook + /// public string? hook_url { get; set; } - public string? success_url { get; set; } + /// + /// Url для переадресации в случае успешной оплаты + /// + public string? success_url { get; set; } + /// + /// Url для переадресации в случае неуспешной оплаты + /// public string? fail_url { get; set; } + /// + /// Время жизни счета в минутах + /// Мин: 1 ; Макс: 43200 + /// public int? expire { get; set; } = 43200; + /// + /// С кого списывать комиссию: + /// 1 - с клиента + /// 0 - с магазина + /// public string? subtract { get; set; } + /// + /// Дополнительные данные предаваемые в вебхуке + /// public string? custom_fields { get; set; } + /// + /// Комментарий + /// public string? comment { get; set; } + /// + /// ID марчанта(только в вебхуке) + /// public string? merchant_id { get; set; } + /// + /// Название мерчанта (отображается в форме перевода) + /// public string? merchant_name { get; set; } } public class PaymentResponse : IBase { + /// + /// Статус запроса + /// public string status { get; set; } + /// + /// Номер счета на оплату + /// public string id { get; set; } + /// + /// Ссылка на оплату + /// public string url { get; set; } + /// + /// Время истечения счета + /// public int expire { get; set; } + /// + /// Сумма счета + /// public string sum { get; set; } + /// + /// // URL для переадресации после успешной оплаты + /// public string success_url { get; set; } + /// + /// URL для переадресации после неудачной оплаты + /// public string fail_url { get; set; } + /// + /// адрес для вебхука + /// public string hook_url { get; set; } + /// + /// Дополнительное поле + /// public string custom_fields { get; set; } + /// + /// ID и наименование мерчанта + /// public string merchant_name { get; set; } + /// + /// ID и наименование мерчанта + /// + public string merchant_id { get; set; } } public class Invoice : IBase diff --git a/Types/LavaAPI/SBPBanks.cs b/Types/LavaAPI/SBPBanks.cs index 938a189..21e3417 100644 --- a/Types/LavaAPI/SBPBanks.cs +++ b/Types/LavaAPI/SBPBanks.cs @@ -8,7 +8,13 @@ namespace Lava.NET.Types.LavaAPI { public class Datum : IBase { + /// + /// ID банка + /// public object id { get; set; } + /// + /// Название + /// public string name { get; set; } } diff --git a/Types/LavaAPI/Transaction.cs b/Types/LavaAPI/Transaction.cs index b253ec5..636e43a 100644 --- a/Types/LavaAPI/Transaction.cs +++ b/Types/LavaAPI/Transaction.cs @@ -9,11 +9,34 @@ namespace Lava.NET.Types.LavaAPI public class TransactionParam : IBase { + /// + /// Тип перевода + /// withdraw - вывод + /// transfer - перевод + /// public string? transfer_type { get; set; } + /// + /// Номер кошелька + /// public string? account { get; set; } + /// + /// С какого периода показывать транзакции + /// Пример: 21.10.2021 10:30:30 + /// public string? period_start { get; set; } + /// + /// До какого времени показывать транзакции + /// + /// Пример: 21.10.2021 11:30:00 + /// public string? period_end { get; set; } + /// + /// Сдвиг + /// public int? offset { get; set; } + /// + /// Лимит + /// public int? limit { get; set; } } diff --git a/Types/LavaAPI/Transfer.cs b/Types/LavaAPI/Transfer.cs index fdc7cad..55f0940 100644 --- a/Types/LavaAPI/Transfer.cs +++ b/Types/LavaAPI/Transfer.cs @@ -8,22 +8,67 @@ namespace Lava.NET.Types.LavaAPI { public class Transfer : IBase { + /// + /// Номер кошелька с которого совершается перевод + /// public string account_from { get; set; } + /// + /// Номер кошелька куда совершается перевод + /// public string account_to { get; set;} - public int substract { get; set; } = 0; - public int amount { get; set; } + /// + /// Откуда списывать комиссию + /// 1 - с баланса, 0 - с суммы + /// + public int? substract { get; set; } = 0; + /// + /// Сумма вывода с копейками и f на конце + /// Пример: 1.00f + /// + public float amount { get; set; } = 1.00f; + /// + /// Комментарий + /// public string? comment { get; set; } } public class TransferData : IBase { + /// + /// Номер заявки + /// public string id { get; set; } + /// + /// Время создания в unix + /// public string created_at { get; set; } + /// + /// сумма + /// public string amount { get; set; } + /// + /// Статус + /// public string status { get; set; } - public object comment { get; set; } + /// + /// Комментарий + /// + public string? comment { get; set; } + /// + /// валюта + /// public string currency { get; set; } + /// + /// Тип + /// public string type { get; set; } + /// + /// Получатель + /// public string receiver { get; set; } + /// + /// комиссия + /// public string commission { get; set; } + } } diff --git a/Types/LavaAPI/Withdraw.cs b/Types/LavaAPI/Withdraw.cs index 4d58ebb..32498eb 100644 --- a/Types/LavaAPI/Withdraw.cs +++ b/Types/LavaAPI/Withdraw.cs @@ -8,26 +8,85 @@ namespace Lava.NET.Types.LavaAPI { public class WithdrawInfo : IBase { + /// + /// Номер заявки + /// public string id { get; set; } + /// + /// Время создания (В формате unix timestamp) + /// public string created_at { get; set; } + /// + /// Сумма заявки + /// public string amount { get; set; } + /// + /// Комиссия + /// public string commission { get; set; } + /// + /// Статус заявки + /// public string status { get; set; } + /// + /// Сервис + /// public string service { get; set; } - public string comment { get; set; } + /// + /// Комментарий + /// + public string? comment { get; set; } + /// + /// Валюта + /// public string currency { get; set; } } public class Withdraw : IBase { + /// + /// Номер кошелька, с которго совершается вывод + /// + /// + /// R40510054 + /// public string account { get; set; } + /// + /// Сумма вывода + /// public float amount { get; set; } - public string order_id { get; set; } - public string hook_url { get; set; } - public int subtract { get; set; } = 0; - public string service { get; set; } = "card"; - public string wallet_to { get; set; } - public string comment { get; set; } - public string sbp_bank_id { get; set; } + /// + /// Номер счета в вашей системе + /// Должен быть уникальным + /// + public string? order_id { get; set; } + /// + /// Url для отправки Webhook + /// + public string? hook_url { get; set; } + /// + /// Откуда списывать комиссию + /// + /// 1 - с баланса, 0 - с суммы + /// Если параметр не передан, то комиссия берется с суммы + /// + public int? subtract { get; set; } = 0; + /// + /// Сервис вывода + /// Пример: card + /// + public string? service { get; set; } = "card"; + /// + /// Номер счета получателя + /// + public string? wallet_to { get; set; } + /// + /// Комментарий к выводу + /// + public string? comment { get; set; } + /// + /// ID банка в СБП + /// + public string? sbp_bank_id { get; set; } } }