c43dbcce8b
- 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
87 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|