QrRapido/Controllers/PagamentoController.cs
Ricardo Carneiro 6aafb1d067
All checks were successful
Deploy QR Rapido / test (push) Successful in 3m34s
Deploy QR Rapido / build-and-push (push) Successful in 7m33s
Deploy QR Rapido / deploy-staging (push) Has been skipped
Deploy QR Rapido / deploy-production (push) Successful in 1m20s
feat: ajustes de pagamento e account/logoff
2025-08-21 22:00:56 -03:00

173 lines
6.1 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using QRRapidoApp.Services;
using System.Security.Claims;
using System.Threading.Tasks;
using QRRapidoApp.Models.ViewModels;
using System.Linq;
namespace QRRapidoApp.Controllers
{
[Authorize]
public class PagamentoController : Controller
{
private readonly IPlanService _planService;
private readonly AdDisplayService _adDisplayService;
private readonly IUserService _userService;
private readonly StripeService _stripeService;
private readonly ILogger<PagamentoController> _logger;
private readonly List<string> languages = new List<string> { "pt-BR", "es-PY", "es" };
public PagamentoController(IPlanService planService, IUserService userService, StripeService stripeService, ILogger<PagamentoController> logger, AdDisplayService adDisplayService)
{
_planService = planService;
_userService = userService;
_stripeService = stripeService;
_logger = logger;
_adDisplayService = adDisplayService;
}
[HttpGet]
public async Task<IActionResult> SelecaoPlano()
{
var plans = await _planService.GetActivePlansAsync();
var countryCode = GetUserCountryCodeComplete(); // Implement this method based on your needs
_adDisplayService.SetViewBagAds(ViewBag);
var model = new SelecaoPlanoViewModel
{
Plans = plans,
CountryCode = countryCode
};
return View(model);
}
[HttpPost]
public async Task<IActionResult> CreateCheckout(string planId, string lang)
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (string.IsNullOrEmpty(userId))
{
return Json(new { success = false, error = "User not authenticated" });
}
var plan = await _planService.GetPlanByIdAsync(planId);
if (plan == null)
{
return Json(new { success = false, error = "Plan not found" });
}
var countryCode = GetUserCountryCode();
if (countryCode != lang && languages.Contains(lang))
{
countryCode = lang;
}
var priceId = plan.PricesByCountry.ContainsKey(countryCode)
? plan.PricesByCountry[countryCode].StripePriceId
: plan.StripePriceId;
try
{
var checkoutUrl = await _stripeService.CreateCheckoutSessionAsync(userId, priceId, lang);
return Json(new { success = true, url = checkoutUrl });
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error creating checkout session for user {userId} and plan {planId}");
return Json(new { success = false, error = ex.Message });
}
}
[HttpGet]
public IActionResult Sucesso()
{
_adDisplayService.SetViewBagAds(ViewBag);
ViewBag.SuccessMessage = "Pagamento concluído com sucesso! Bem-vindo ao Premium.";
return View();
}
[HttpGet]
public async Task<IActionResult> Cancelar()
{
_adDisplayService.SetViewBagAds(ViewBag);
ViewBag.CancelMessage = "O pagamento foi cancelado. Você pode tentar novamente a qualquer momento.";
var plans = await _planService.GetActivePlansAsync();
var countryCode = GetUserCountryCode(); // Implement this method based on your needs
_adDisplayService.SetViewBagAds(ViewBag);
var model = new SelecaoPlanoViewModel
{
Plans = plans,
CountryCode = countryCode
};
return View("SelecaoPlano", model);
}
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> StripeWebhook()
{
try
{
using var reader = new StreamReader(HttpContext.Request.Body);
var json = await reader.ReadToEndAsync();
var signature = Request.Headers["Stripe-Signature"].FirstOrDefault();
if (string.IsNullOrEmpty(signature))
{
return BadRequest("Missing Stripe signature");
}
await _stripeService.HandleWebhookAsync(json, signature);
return Ok();
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing Stripe webhook");
return BadRequest(ex.Message);
}
}
private string GetUserCountryCode()
{
// Check current culture from URL first
var culture = HttpContext.Request.RouteValues["culture"]?.ToString() ??
HttpContext.Features.Get<Microsoft.AspNetCore.Localization.IRequestCultureFeature>()?.RequestCulture?.Culture?.Name;
var countryMap = new Dictionary<string, string>
{
{ "pt-BR", "BR" },
{ "es-PY", "PY" },
{ "es", "PY" }
};
if (!string.IsNullOrEmpty(culture) && countryMap.ContainsKey(culture))
{
return countryMap[culture];
}
// Fallback to Cloudflare header or default
return HttpContext.Request.Headers["CF-IPCountry"].FirstOrDefault() ?? "BR";
}
private string GetUserCountryCodeComplete()
{
// Check current culture from URL first
var culture = HttpContext.Request.RouteValues["culture"]?.ToString() ??
HttpContext.Features.Get<Microsoft.AspNetCore.Localization.IRequestCultureFeature>()?.RequestCulture?.Culture?.Name;
if (languages.Contains(culture))
{
return culture;
}
// Fallback to Cloudflare header or default
return HttpContext.Request.Headers["CF-IPCountry"].FirstOrDefault() ?? "BR";
}
}
}