EnglishEN EspañolES FrançaisFR DeutschDE ItalianoIT PortuguêsPT 中文ZH 日本語JA 한국어KO РусскийRU NederlandsNL
← Back to all articles

Cómo añadir Stripe Checkout a un sitio web PHP personalizado (sin plugins)

Stripe es la API de pagos más limpia disponible, y conectarla directamente a PHP significa sin tarifas SaaS mensuales, sin la sobrecarga de WooCommerce y sin la comisión por transacción de Shopify. Lo que sigue es la implementación exacta que funciona en tiendas reales de clientes de BuiltToWinWeb: PHP puro, el SDK oficial de Stripe, webhooks seguros y confirmaciones por correo automatizadas. Verás cómo encajan las piezas —sesión de pago, redirección, verificación del webhook, entrega— para que puedas cobrar pagos en vivo sin ceder una parte a una plataforma. Todo aquí es código de producción, no una demostración desechable.

Por qué PHP nativo + Stripe supera a cualquier constructor de páginas

Shopify cobra entre 0,5 y 2% por transacción además de la propia comisión de Stripe. WooCommerce añade más de 14 dependencias de plugins que ralentizan el LCP de tu página de pago a 3,8 s. Una integración PHP personalizada entrega un checkout que carga en menos de 0,6 s y conserva cada céntimo de margen.

  • Cero comisiones de plataforma por transacción – solo el 2,9 % + 30 ¢ de Stripe
  • Puntuación Lighthouse de la página de pago: 98 frente al típico 61 de Shopify
  • Control total de webhooks – cumplimiento personalizado, inventario, email
  • Sin coste de suscripción recurrente a la plataforma de e-commerce
  • Tú eres dueño del código, hospeda donde quieras, migra libremente

Paso 1 — Instalar el SDK de PHP de Stripe

Composer es el enfoque más limpio. Si tu servidor no soporta Composer, descarga el ZIP del SDK y colócalo en la raíz de tu proyecto.

composer require stripe/stripe-php

Luego cárgalo al principio de tu script de checkout:

require_once __DIR__ . '/vendor/autoload.php';
\Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));

Paso 2 — Crear una sesión de Checkout (lado del servidor)

Nunca pongas tu clave secreta en el navegador. Crea un endpoint del lado del servidor al que el frontend haga POST:

<?php
require_once __DIR__ . '/vendor/autoload.php';
\Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));

$session = \Stripe\Checkout\Session::create([
    'payment_method_types' => ['card'],
    'line_items' => [[
        'price_data' => [
            'currency'     => 'usd',
            'unit_amount'  => 300000,
            'product_data' => ['name' => 'Business Pro Website'],
        ],
        'quantity' => 1,
    ]],
    'mode'        => 'payment',
    'success_url' => 'https://yoursite.com/success?session_id={CHECKOUT_SESSION_ID}',
    'cancel_url'  => 'https://yoursite.com/pricing',
]);

header('Content-Type: application/json');
echo json_encode(['url' => $session->url]);

Paso 3 — Redirigir al usuario desde el frontend

Una sencilla llamada fetch en el botón de tu página de precios:

document.getElementById('buy-btn').addEventListener('click', async () => {
    const res  = await fetch('/create-checkout-session.php', { method: 'POST' });
    const data = await res.json();
    window.location.href = data.url;
});

Paso 4 — Gestionar webhooks (cumplimiento del pedido)

Stripe envía un POST a tu endpoint de webhook cuando el pago se completa. Aquí es donde debes activar el email, actualizar el inventario y registrar el pedido – NO en la página de éxito.

<?php
$payload   = file_get_contents('php://input');
$sig       = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$secret    = getenv('STRIPE_WEBHOOK_SECRET');

try {
    $event = \Stripe\Webhook::constructEvent($payload, $sig, $secret);
} catch (\Exception $e) {
    http_response_code(400); exit;
}

if ($event->type === 'checkout.session.completed') {
    $session = $event->data->object;
    fulfill_order($session);
}

http_response_code(200);

Registra la URL de tu webhook en el panel de Stripe en Desarrolladores → Webhooks. Prueba localmente con: `stripe listen --forward-to localhost/webhook.php`.

Paso 5 — Enviar un email de confirmación con PHPMailer

Dentro de tu función `fulfill_order()`, obtén el email del cliente de la sesión y ejecuta PHPMailer:

function fulfill_order($session) {
    $email = $session->customer_details->email;
    $name  = $session->customer_details->name;

    $mail = new PHPMailer\PHPMailer\PHPMailer(true);
    $mail->isSMTP();
    $mail->Host     = 'smtp.yourhost.com';
    $mail->Username = getenv('SMTP_USER');
    $mail->Password = getenv('SMTP_PASS');
    $mail->setFrom('[email protected]', 'Tu Negocio');
    $mail->addAddress($email, $name);
    $mail->Subject = '¡Pago recibido — Gracias!';
    $mail->Body    = "Hola $name, tu pedido está confirmado.";
    $mail->send();
}

Comparativa de plataformas: PHP personalizado vs Shopify vs WooCommerce

Métrica PHP personalizado + Stripe Shopify WooCommerce
LCP del checkout 0,6s 1,9s 2,8s
Puntuación Lighthouse 98 61 55
Comisión de plataforma/txn 0% 0,5–2% 0%*
Coste mensual plataforma 0 $ 39–399 $ 0 $*
Dependencias de plugins 0 n/a 14+
Propiedad del código 100% 0% ~60%

Impacto real en el negocio

En una tienda con 50.000 $/mes de ventas, el 2,9 % + 30 ¢ de Stripe es inevitable. Pero la comisión adicional de plataforma de Shopify del 0,5–2 % cuesta entre 250 y 1.000 $ extra al mes. PHP personalizado elimina eso.

  • Shopify Advanced (399 $/mes) + 0,5 % sobre 50.000 $ = 649 $/mes en costes de plataforma
  • PHP personalizado + Stripe = 0 $/mes en costes de plataforma (solo las tarifas estándar de Stripe)
  • Punto de equilibrio en una tienda de 8.000 $: en menos de 9 meses
  • Las páginas de checkout cargan 3× más rápido = tasa de abandono de carrito mediblemente menor

La matemática es simple: si procesas más de 15.000 $/mes, una tienda PHP personalizada se amortiza en menos de un año.

Lista de verificación de seguridad

  • Almacena las claves en variables de entorno – nunca las codifiques directamente en archivos PHP
  • Siempre verifica las firmas de webhook de Stripe con `constructEvent()`
  • Usa HTTPS en todas partes – Stripe lo requiere
  • Idempotencia: comprueba si el pedido ya existe antes de procesarlo
  • Limita la tasa en `/create-checkout-session.php` (10 solicitudes/hora por IP)

Preguntas frecuentes

¿Necesito Composer para usar Stripe con PHP?

Se recomienda Composer pero no es obligatorio. Puedes descargar el SDK de PHP de Stripe como archivo ZIP e incluirlo manualmente con require_once. Composer solo facilita las actualizaciones.

¿Es seguro procesar pagos sin una plataforma como Shopify?

Sí. Stripe está certificado como PCI-DSS Nivel 1. Tu servidor nunca maneja números de tarjeta sin procesar – el JS de Stripe los tokeniza en el lado del cliente. Tu PHP solo recibe un ID de sesión.

¿Cómo pruebo Stripe sin cobrar tarjetas reales?

Usa el modo de prueba de Stripe con el prefijo de clave sk_test_. Usa la tarjeta de prueba 4242 4242 4242 4242 con cualquier fecha de vencimiento futura y cualquier CVC de 3 dígitos.

¿Puedo añadir suscripciones con este enfoque?

Sí. Cambia el modo de la sesión de Checkout de "payment" a "subscription" y pasa un ID de precio recurrente en lugar de price_data. Stripe gestiona los ciclos de facturación automáticamente.

¿Quieres una tienda Stripe personalizada construida para ti?

BuiltToWinWeb construye tiendas de e-commerce PHP personalizadas con integración nativa de Stripe, puntuaciones Lighthouse 98+, y cero comisiones mensuales de plataforma. Tarifa única y plana – eres dueño del código para siempre.

Las tiendas suelen entregarse en 3–4 semanas. Respuesta garantizada en 24 horas.

Obtener presupuesto gratis

Datos de referencia de pruebas controladas en hosting Hostinger VPS idéntico. Número de plugins de WooCommerce medido en instalación estándar de WooCommerce 8.x con tema Storefront.