Skip to content

Modelo de seguridad

Checkout embebido (SDK / iframe)

CapaQué protegeImplementación
Token opacoPII no viaja en URL10 chars base64url — sin datos internos
Origin validationComercio no puede usar token ajenomerchantDomain validado contra Origin header del iframe
postMessage con target originXSS en página del comercio no intercepta resultadoNunca se usa '*' como destino
HTTPS forzadoMan-in-the-middleCloudFront + HSTS
Token expiryLinks viejos no reutilizableslinkExpiresAt (7 días)
CSP frame-ancestorsClickjackingSolo dominios registrados en Merchant.allowedDomains

Registrar dominios permitidos

Para usar el SDK en modo iframe, registra tu dominio en comercios.wepago.com → Configuración → Dominios permitidos.

El checkout valida que el Origin del iframe esté en esa lista. Si no está registrado, el pago no procede y se emite onError({ code: 'INVALID_TOKEN' }).


API REST (autenticación merchant)

Formato de credenciales

Authorization: Bearer {api_key}:{api_secret}
ComponenteLongitudDescripción
api_key48 chars hexIdentifica al merchant (no es secreto)
api_secret64 chars hexSecreto — nunca lo compartas ni lo incluyas en frontend

El api_secret se almacena como hash bcrypt. Wepago no puede recuperarlo — si lo pierdes, genera uno nuevo.

Rotación de credenciales

En comercios.wepago.com → Configuración → API → Regenerar credenciales. Las credenciales antiguas se invalidan de inmediato.


Webhooks salientes (Wepago → tu servidor)

Firma HMAC-SHA256

Cada evento incluye el header:

X-Webhook-Signature: {firma-hex}

La firma se genera así:

HMAC-SHA256(webhookSecret, JSON.stringify({ event, data, timestamp }))

Siempre verifica la firma antes de procesar el evento. Ver ejemplos de verificación.

Qué no hacer

❌ Inseguro✅ Correcto
Token en la URL: /webhook/mi-token-secretoX-Webhook-Signature header
Confiar en el event sin verificar la firmaVerificar HMAC antes de leer el payload
Usar el body parseado para calcular la firmaUsar el raw body (string) para calcular la firma
Activar servicios solo con el callback del SDKConfirmar en backend via webhook o polling

Por qué no usar token en la URL

  • Queda en logs del servidor (nginx, CloudWatch, etc.)
  • Queda en historial del navegador si se redirige
  • Se filtra en el header Referer de peticiones HTTP
  • No permite detectar si el payload fue alterado

HTTPS obligatorio

Todos los recursos (sdk.js, iframe, APIs, webhooks) solo funcionan en HTTPS. Peticiones desde http:// son rechazadas.


Reporte de vulnerabilidades

Envía un email a security@wepago.com con descripción detallada. No publiques vulnerabilidades en issues públicos.