1.1 Lectura de logs completa
ERROR: Webhook signature verification failed
at verifySignature (stripe-node/src/Webhooks.ts:120)
received: 'whsec_test_abc123...'
expected: header 'stripe-signature' = undefined
1.2 Instrumentación por capas (multi-component)
export async function POST(req: Request) {
const rawBody = await req.text()
console.log('[L1] body length:', rawBody.length)
const sig = req.headers.get('stripe-signature')
console.log('[L2] stripe-signature:', sig) // → null
console.log('[L3] all headers:',
Object.fromEntries(req.headers.entries()))
}
Evidencia capa 2: stripe-signature llega como null. Body llega completo (1842 bytes). El problema está entre Stripe y el handler, no en la lógica de BD.
1.3 Verificar cambios recientes (git diff)
a3f891c refactor: migrar a App Router middleware ← hace 3 días
b2c445d feat: añadir plan Premium 29€
c1d332e fix: mejorar UI checkout
d0e221b chore: actualizar dependencias stripe@14.x
e9f110a feat: integrar Lemon Squeezy (descartado)
Cambio crítico detectado: hace 3 días se añadió middleware personalizado en middleware.ts para el refactor a App Router.
1.4 Rastreo hacia atrás del dato perdido
export function middleware(request: NextRequest) {
if (request.nextUrl.pathname.startsWith('/api')) {
const response = NextResponse.next()
response.headers.set('x-url', request.url)
return response ← ¡No pasa los headers entrantes al endpoint!
}
}
// El matcher incluye /api/webhooks/stripe sin excepción
export const config = {
matcher: ['/api/:path*'] ← ¡Atrapa el webhook!
}
CAUSA RAÍZ ENCONTRADA: El middleware de Next.js intercepta el request del webhook y crea un nuevo NextResponse.next() que no propaga los headers originales de Stripe (incluyendo stripe-signature). El header desaparece antes de llegar al route handler.
CAUSA RAÍZ CONFIRMADA
El middleware.ts de Next.js intercepta /api/webhooks/stripe y no propaga el header stripe-signature — el route handler nunca puede verificar la firma de Stripe.