Files
rm-ventas/services-externos/src/ServicesExternos.API/Services/TransbankService.cs
T
Nurfog c43dbcce8b feat: fase 2 - services externos (dte, transbank, email)
- New solution ServicesExternos.slnx with standalone API project
- DteService + DteController (LibreDTE: emitir, generar PDF, consultar folio)
- TransbankService + TransbankController (crear transacción, confirmar, voucher SP)
- EmailService + EmailController (MailKit: send with HTML + attachments)
- Models for DTE, Transbank, Email requests/responses
- Dockerfile + appsettings.json with all service configs
- HttpClient factory for Transbank and LibreDTE
- Build: 0 errors
2026-07-08 10:33:21 -04:00

87 lines
3.3 KiB
C#

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<string> 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<string> ConfirmarTransaccionAsync(string tokenWs)
{
var response = await _client.PutAsync($"/rswebpaytransaction/api/webpay/v1.2/transactions/{tokenWs}", null);
return await response.Content.ReadAsStringAsync();
}
public async Task<string> 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<string> 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);
}
}