seguridad

Mi clave de Stripe está en el código público

Stripe te da dos claves y solo una de ellas es un secreto. La publicable, que empieza por pk_, va en el navegador a propósito para que funcione el formulario de pago. La secreta, que empieza por sk_, permite cobrar, devolver dinero y leer los datos de tus clientes. Si la que está en tu código empieza por sk_, ese es el problema.

Revisado en agosto de 2026

De paso

Compruébalo en tu app ahora, gratis

Esto no da la cara solo: tu app funciona igual de bien esté abierta o cerrada. La única forma de saberlo es mirar.

Solo leemos lo que tu app ya le entrega a cualquier visitante.

Diagnóstico

Por qué te pasa

Porque hacer un cobro de verdad requiere la clave secreta, y la forma más corta de que un cobro funcione es llamar a Stripe directamente desde el navegador con ella. Funciona a la primera. La alternativa correcta, que es crear una función de servidor que haga la llamada, son bastantes más pasos y no siempre sale sola.

También ocurre al copiar del panel de Stripe, donde las dos claves están juntas, o al configurar las variables de entorno con el prefijo que las publica en el navegador. Ahí no hay ni siquiera una decisión: la variable estaba bien y el prefijo la sacó a la calle.

Conviene saber qué está en juego, sin dramatizar. Con una clave secreta se pueden emitir devoluciones hacia otra tarjeta, consultar el listado completo de tus clientes con sus correos y sus importes, y crear cobros. No vacía tu cuenta bancaria de golpe, pero sí puede sacarte dinero y desde luego expone datos de tus clientes que son responsabilidad tuya.

Lo que este error no significa

  • No significa que te hayan cobrado nada. Es comprobable, no hay que suponerlo: el panel de Stripe tiene el registro completo de todo lo que ha pasado en tu cuenta, y revisarlo es parte del arreglo.
  • No significa que tu pk_ esté mal. Esa clave está en el código de todas las tiendas del mundo, es su sitio y no permite hacer absolutamente nada por sí sola.
  • No significa que tengas que parar de cobrar hoy. Se puede rotar la clave sin dejar de aceptar pagos, si se hace en el orden correcto.

Solución

Arréglalo tú, gratis

Stripe permite tener varias claves secretas activas a la vez, y eso hace que este arreglo se pueda hacer sin cortar los cobros ni un minuto. Aprovéchalo: es lo que distingue hacerlo con calma de hacerlo con la tienda cerrada.

  1. 01Entra en tu panel de Stripe y ve a los registros de actividad y a la lista de pagos y devoluciones de los últimos días. Busca devoluciones que no reconozcas y cobros extraños. Hazlo antes de tocar nada.
  2. 02En Developers y luego API keys, crea una clave secreta nueva. No borres todavía la vieja: durante un rato van a convivir las dos, y eso es lo que evita el corte.
  3. 03Coloca la clave nueva en las variables de entorno de tu servidor, sin prefijo VITE_ ni NEXT_PUBLIC_. Si tu app no tiene todavía una parte de servidor donde ponerla, ese es el trabajo de fondo que hay que hacer, y va en el prompt de abajo.
  4. 04Saca la clave del código del navegador y despliega. Prueba un cobro real de importe mínimo para confirmar que el pago sigue funcionando por la vía nueva.
  5. 05Ahora sí, revoca la clave antigua en Stripe. A partir de ese momento, la copia que tuviera cualquiera deja de valer.
  6. 06Revisa por último si tenías webhooks configurados: si el secreto de firma del webhook también estaba publicado, hay que regenerarlo igual, o alguien puede fingir pagos que tu app dará por buenos.

Si al sacar la clave del navegador dejan de funcionar los cobros, es exactamente lo que tenía que pasar: significa que se estaban haciendo desde ahí. La solución no es devolverla, es mover esa llamada a un servidor.

Y esto para la parte de código

Pégaselo tal cual al agente que escribió tu app. Está redactado para que te diga lo que ha hecho, no solo para que lo haga.

Prompt para tu agente

En mi app ha acabado publicada una clave secreta de Stripe (empieza por sk_) en el código que llega al navegador.

Necesito que hagas esto:
1. Búscala en todo el proyecto y dime en qué ficheros y con qué variable aparece, sin pegarme el valor completo.
2. Dime qué operaciones de Stripe se están haciendo desde el navegador con esa clave: cobros, devoluciones, consultas de clientes o lo que sea.
3. Crea una función de servidor por cada una de esas operaciones, de forma que el navegador solo pida "quiero pagar esto" y sea el servidor quien hable con Stripe con la clave secreta. El navegador debe quedarse únicamente con la clave publicable.
4. Comprueba si hay un endpoint de webhook de Stripe y si verifica la firma. Si no la verifica, corrígelo: sin esa comprobación cualquiera puede simular un pago.
5. Deja el .env.example indicando claramente qué clave va en el servidor y cuál puede ir en el navegador.

No revoques ni cambies ninguna clave: la rotación la hago yo en el panel de Stripe, en un orden concreto para no cortar los cobros.

Si no sale

Si el escáner ha encontrado algo, no lo toques con prisa

Cerrar una puerta abierta tiene un orden: primero se corta el acceso, después se comprueba en los registros si alguien entró, y solo entonces se despliega. Hacerlo al revés deja la app caída y borra el rastro de lo que pasó. Si prefieres no hacerlo solo, elige cuándo lo hacemos.

Las 10 primeras apps son gratis. Estoy empezando y necesito casos reales. A cambio te pido permiso para contar después qué me encontré, sin decir de quién era la app ni enseñar tus datos. Sin tarjeta y sin suscripción: cuando se acaben las plazas empezaré a cobrar y lo diré aquí.

Cita a partir de mañana

Agendar revisión

Gratis

durante el lanzamiento

Elegimos hueco, miro tu app con calma y te digo qué pasa y cómo se arregla.

  • Sesión de trabajo en directo contigo
  • Diagnóstico del error y del riesgo real
  • Te quedas con el arreglo aplicado

Hoy, en cola prioritaria

Rescate exprés

Gratis

durante el lanzamiento

Entras en la cola de hoy. Reservas hueco y lo dejamos resuelto en el día.

  • Hueco el mismo día
  • Prioridad sobre las revisiones agendadas
  • Mismo trabajo, antes

Quién

Marc Sala

IT Manager

  • Analista de ciberseguridad certificado por Google

No es un rating anónimo de un marketplace: es la persona que va a entrar en tu app. Reviso el código, encuentro qué falla y lo arreglo contigo delante, explicándote qué ha pasado sin jerga.