Integrar pagos en una aplicación web puede parecer complicado, pero con ASP.NET Core y Stripe es posible crear un sistema de pagos seguro y escalable sin tener que implementar directamente toda la lógica relacionada con tarjetas.
Stripe proporciona un SDK oficial para .NET que permite trabajar con sus APIs desde C#. Actualmente, la biblioteca oficial es Stripe.net.
1. Instalar Stripe.NET
Si tienes un proyecto ASP.NET Core, comienza instalando el paquete mediante NuGet:
dotnet add package Stripe.net
Después podrás utilizar las clases de Stripe directamente desde C#.
2. Configurar las claves de Stripe
Desde el Dashboard de Stripe puedes obtener las claves para trabajar en modo de prueba.
Nunca debes colocar una clave secreta directamente en el código fuente. Es mejor utilizar appsettings.json, variables de entorno o un sistema de secretos.
Por ejemplo:
{
"Stripe": {
"SecretKey": "sk_test_xxxxxxxxx",
"PublishableKey": "pk_test_xxxxxxxxx"
}
}
En producción debes utilizar las claves correspondientes al entorno real y protegerlas adecuadamente.
3. Crear un Checkout Session
Una de las formas más sencillas de implementar pagos es utilizando Stripe Checkout. Tu aplicación crea una sesión y posteriormente redirige al usuario a la página de pago de Stripe.
Un controlador podría tener una estructura similar a:
using Microsoft.AspNetCore.Mvc;
using Stripe.Checkout;
public class PaymentController : Controller
{
private readonly IConfiguration _configuration;
public PaymentController(IConfiguration configuration)
{
_configuration = configuration;
}
public IActionResult CreateCheckout()
{
Stripe.StripeConfiguration.ApiKey =
_configuration["Stripe:SecretKey"];
var options = new SessionCreateOptions
{
Mode = "payment",
SuccessUrl = "https://localhost:5001/payment/success",
CancelUrl = "https://localhost:5001/payment/cancel",
LineItems = new List<SessionLineItemOptions>
{
new SessionLineItemOptions
{
PriceData = new SessionLineItemPriceDataOptions
{
Currency = "usd",
UnitAmount = 2500,
ProductData = new SessionLineItemPriceDataProductDataOptions
{
Name = "Curso de ASP.NET Core"
}
},
Quantity = 1
}
}
};
var service = new SessionService();
var session = service.Create(options);
return Redirect(session.Url);
}
}
En este ejemplo, 2500 representa 25,00 USD, porque Stripe trabaja con la unidad mínima de la moneda, como centavos en USD.
4. Confirmar el pago mediante Webhooks
Una parte fundamental de una integración profesional es utilizar webhooks.
No deberías confiar únicamente en que el usuario llegue a la página SuccessUrl. Stripe puede enviar un evento a tu servidor cuando el pago realmente se completa.
Por ejemplo, puedes escuchar:
checkout.session.completed
El endpoint podría recibir el evento:
[HttpPost]
public async Task<IActionResult> Webhook()
{
var json = await new StreamReader(
HttpContext.Request.Body).ReadToEndAsync();
var signature = Request.Headers["Stripe-Signature"];
var stripeEvent = EventUtility.ConstructEvent(
json,
signature,
"whsec_xxxxxxxxx");
if (stripeEvent.Type ==
EventTypes.CheckoutSessionCompleted)
{
// Confirmar pedido
// Actualizar base de datos
// Enviar correo
}
return Ok();
}
Stripe recomienda verificar la firma del webhook utilizando el secreto correspondiente para evitar que terceros puedan enviar eventos falsos a tu aplicación. Además, el cuerpo original de la petición debe conservarse para realizar correctamente la validación.
5. Flujo completo
Una arquitectura típica sería:
Cliente → ASP.NET Core → Stripe Checkout → Stripe → Webhook → ASP.NET Core → Base de datos
Por ejemplo, cuando un usuario compra un producto:
- ASP.NET Core crea la sesión de pago.
- El usuario es enviado a Stripe Checkout.
- El cliente completa el pago.
- Stripe procesa la transacción.
- Stripe envía un webhook.
- ASP.NET Core verifica el evento.
- La aplicación marca el pedido como pagado.
- Finalmente, puede entregar el producto o servicio.
Buenas prácticas
Para una integración real, evita almacenar información sensible de tarjetas en tu propia base de datos. Utiliza Stripe para manejar los datos de pago.
También es recomendable separar la lógica de Stripe en un servicio, utilizar variables de entorno para las claves, registrar los eventos recibidos y controlar posibles pagos duplicados. Stripe recomienda precisamente implementar mecanismos para detectar eventos duplicados y escuchar únicamente los tipos de eventos que realmente necesita tu aplicación.
Integrar Stripe con ASP.NET Core no consiste solamente en crear un botón de pago. Una implementación profesional debe considerar seguridad, webhooks, validación de eventos, manejo de errores y actualización de pedidos. Con esta estructura puedes construir una base sólida para tiendas online, sistemas de suscripciones, plataformas SaaS y aplicaciones que necesiten procesar pagos.

