1
<?php
declare(strict_types=1);
// 1. Contrato: Interfaz de Pago
interface PasarelaPagoInterface
{
public function cobrar(float $monto): bool;
public function getNombre(): string;
}
// 2. Implementación A: Stripe
final class StripePasarela implements PasarelaPagoInterface
{
public function getNombre(): string
{
return "Stripe Credit Card Gateway";
}
public function cobrar(float $monto): bool
{
echo "<p style='color:#6366f1;'>💳 Conectando con Stripe API... Cobro de $" . number_format($monto, 2) . " procesado con token cifrado.</p>";
return true;
}
}
// 3. Implementación B: PayPal
final class PayPalPasarela implements PasarelaPagoInterface
{
public function getNombre(): string
{
return "PayPal Express Checkout";
}
public function cobrar(float $monto): bool
{
echo "<p style='color:#0284c7;'>🅿️ Redirigiendo a PayPal Orders... Autorización de $" . number_format($monto, 2) . " aprobada.</p>";
return true;
}
}
// 4. Implementación C: Mock Fake para Pruebas Unitarias de Clase
final class FakeMockPasarela implements PasarelaPagoInterface
{
public function getNombre(): string
{
return "Mock Testing Gateway (Sin Dinero Real)";
}
public function cobrar(float $monto): bool
{
echo "<p style='color:#10b981;'>🧪 Simulación de cobro exitoso para tests unitarios: $" . number_format($monto, 2) . "</p>";
return true;
}
}
// 5. Servicio de Facturación Desacoplado (Inversión de Dependencias)
final class CheckoutService
{
// Solo depende de la INTERFAZ, no de una empresa en particular
public function __construct(
private PasarelaPagoInterface $pasarela
) {}
public function procesarPedido(string $cliente, float $total): void
{
echo "<h4>Procesando pedido para {$cliente} mediante: <em>{$this->pasarela->getNombre()}</em></h4>";
$exito = $this->pasarela->cobrar($total);
if ($exito) {
echo "<p style='font-weight:bold; color:#16a34a;'> Pedido confirmado y factura generada con éxito.</p><hr>";
}
}
}
// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
// Caso 1: Cliente paga con Stripe
$checkoutStripe = new CheckoutService(new StripePasarela());
$checkoutStripe->procesarPedido("Sofía Morales", 149.99);
// Caso 2: Cliente prefiere PayPal
$checkoutPayPal = new CheckoutService(new PayPalPasarela());
$checkoutPayPal->procesarPedido("David Peña", 75.50);
// Caso 3: Pruebas automatizadas en desarrollo
$checkoutTest = new CheckoutService(new FakeMockPasarela());
$checkoutTest->procesarPedido("Usuario Pruebas", 10.00);
Haz clic para editar este código