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
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user