Modelo de seguridad
Checkout embebido (SDK / iframe)
| Capa | Qué protege | Implementación |
|---|---|---|
| Token opaco | PII no viaja en URL | 10 chars base64url — sin datos internos |
| Origin validation | Comercio no puede usar token ajeno | merchantDomain validado contra Origin header del iframe |
postMessage con target origin | XSS en página del comercio no intercepta resultado | Nunca se usa '*' como destino |
| HTTPS forzado | Man-in-the-middle | CloudFront + HSTS |
| Token expiry | Links viejos no reutilizables | linkExpiresAt (7 días) |
CSP frame-ancestors | Clickjacking | Solo 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}| Componente | Longitud | Descripción |
|---|---|---|
api_key | 48 chars hex | Identifica al merchant (no es secreto) |
api_secret | 64 chars hex | Secreto — 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-secreto | X-Webhook-Signature header |
Confiar en el event sin verificar la firma | Verificar HMAC antes de leer el payload |
| Usar el body parseado para calcular la firma | Usar el raw body (string) para calcular la firma |
| Activar servicios solo con el callback del SDK | Confirmar 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
Refererde 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.