using Lava.NET.Types.Enums; using Lava.NET.Types.LavaAPI; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json.Nodes; namespace Lava.NET { /// /// Ограниченный класс, который используется как базовый для бизнес части и публичной части Lava API. Использование нежелательно! /// /// Токен от Lava.ru /// Тип вашего аккаунта public class LavaAPI(string token, LavaType type) { internal readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new("https://api.lava.ru/") }; /// /// Отправка запроса на сервер /// /// 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, _httpClient.BaseAddress + path)) { message.Content = body == null ? new StringContent(body.ToString()) : null; var req = await _httpClient.SendAsync(message); return await req.Content.ReadAsStringAsync(); } } /// /// Создание ссылки на оплату (Выставление счета) /// /// Данные, передаваемые в запрос. Смотреть АПИ /// Ответ от сервера или null public virtual async Task CreatePaymentAsync(PaymentRequest data) => JsonConvert.DeserializeObject(await SendRequest("invoice/create", LavaType.any, HttpMethod.Post, data.ToString())); /// /// Получение информации о выставленном счете, в т.ч. о том, оплачен ли счет /// /// айди выставленного счета /// Ответ от сервера или 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 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)); } /// /// В РАЗРАБОТКЕ /// Часть 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) { method ??= HttpMethod.Post; if (neededType != LavaType.any && neededType != LavaType.business) throw new Exceptions.TypeException("Your Lava.ru account type is not equals needed type"); _httpClient.DefaultRequestHeaders.Authorization = new("", token); if (isSpecial) { _httpClient.DefaultRequestHeaders.Accept.Add(new("application/json")); _httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json"); } using (var message = new HttpRequestMessage(method, path)) { message.Content = body == null ? new StringContent(body.ToString()) : null; var req = await _httpClient.SendAsync(message); 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) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/info", body: request.ToString())); public async Task GetPayoffTariffAsync(PayoffTariffRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/get-tariffs", body: request.ToString())); public async Task CheckPayoffTariffAsync(PayoffCheckoutRequest request) => JsonConvert.DeserializeObject(await SendRequest("business/payoff/check-wallet", body: request.ToString())); // В разработке... } }