using System.Text; using Newtonsoft.Json; using ServicesExternos.API.Models; using Dapper; using Npgsql; namespace ServicesExternos.API.Services; public class TransbankService { private readonly HttpClient _client; private readonly string _apiKey; private readonly string _commerceCode; private readonly string _connectionString; private readonly string _environment; public TransbankService(HttpClient client, IConfiguration configuration) { _client = client; _apiKey = configuration["Transbank:ApiKey"] ?? throw new Exception("Transbank:ApiKey required"); _commerceCode = configuration["Transbank:CommerceCode"] ?? throw new Exception("Transbank:CommerceCode required"); _connectionString = configuration.GetConnectionString("Default")!; _environment = configuration["Transbank:Environment"] ?? "integration"; var baseUrl = _environment == "production" ? "https://webpay3g.transbank.cl" : "https://webpay3gint.transbank.cl"; _client.BaseAddress = new Uri(baseUrl); _client.DefaultRequestHeaders.Add("Tbk-Api-Key-Id", _commerceCode); _client.DefaultRequestHeaders.Add("Tbk-Api-Key-Secret", _apiKey); } public async Task CrearTransaccionAsync(TransbankTransactionRequest request) { var payload = new { buy_order = request.BuyOrder, session_id = request.SessionId, amount = request.Amount, return_url = request.ReturnUrl }; var json = JsonConvert.SerializeObject(payload); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _client.PostAsync("/rswebpaytransaction/api/webpay/v1.2/transactions", content); return await response.Content.ReadAsStringAsync(); } public async Task ConfirmarTransaccionAsync(string tokenWs) { var response = await _client.PutAsync($"/rswebpaytransaction/api/webpay/v1.2/transactions/{tokenWs}", null); return await response.Content.ReadAsStringAsync(); } public async Task GrabarVoucherAsync(string token, string accountingDate, string buyOrder, string cardNumber, string authCode, string paymentType, string sharesNumber, int amount) { using var connection = new NpgsqlConnection(_connectionString); await connection.ExecuteAsync( "caja_tbk.GrabaVoucher", new { token_id = token, xaccountingDate = accountingDate, xbuyOrder = buyOrder, xcardDetailcardNumber = cardNumber, xdetailOutputAuthorizationCode = authCode, xdetailOutputPaymentTypeCode = paymentType, xdetailOutputSharesNumber = sharesNumber, xdetailOutputAmount = amount }, commandType: System.Data.CommandType.StoredProcedure); return "ok"; } public async Task BuscarTransaccionAsync(string token) { using var connection = new NpgsqlConnection(_connectionString); var rows = await connection.QueryAsync( "caja_tbk.BuscarInfoToken", new { tokenid = token }, commandType: System.Data.CommandType.StoredProcedure); return JsonConvert.SerializeObject(rows); } }