SSIFEN Dev Guide
visitantes únicos
Paraguay · Manual Técnico v150 · Guía para desarrolladores

Consulta y resolución de códigos SIFEN

Busque por código de respuesta, campo XML, mensaje, regla de validación o acción técnica. La búsqueda se ejecuta localmente en el navegador.

También puede buscar por identificador de campo, como AA001, D101 o E721.
Prevalidador oficial
Participación protegida: las valoraciones y experiencias son públicas, pero todos los cambios se validan en PHP/MySQL. Solo una sesión administrativa autenticada puede ocultar o eliminar comentarios.
0registros consultables
0respuestas WS
0reglas DE
0reglas de eventos
0rechazos
1.000+usuarios simultáneos*

Arquitectura recomendada

Frontend de consulta

HTML estático, datos embebidos, búsqueda local y paginación. Las consultas no ejecutan SQL y son ideales para CDN.

Integración SIFEN

Debe permanecer en backend: certificados, claves, XML firmado, SOAP, logs, colas y reintentos.

Valoraciones y comunidad

API PHP/MySQL separada, votos por navegador, rate limit, comentarios públicos y moderación con login administrativo.

Reglas operativas que evitan duplicados

1
No reenviar por timeout.
Primero consulte el lote o el CDC. Un corte de comunicación no prueba que SIFEN no haya recibido el documento.
2
No reenviar un CDC en procesamiento.
Espere una respuesta definitiva: aprobado, aprobado con observación o rechazado.
3
Recrear artefactos cuando cambien datos firmados.
Si cambia CDC, receptor, ítems, totales o QR, regenere XML, valide, firme y envíe nuevamente.
4
Lotes homogéneos.
Un RUC emisor, un tipo de DE, hasta 50 documentos y compresión/Base64 correctas.

Alcance de esta guía

Incluye respuestas de Web Services, reglas de formato del DE y reglas de eventos extraídas del Manual Técnico v150. Las “soluciones” son indicaciones de implementación para desarrolladores y deben contrastarse con el mensaje exacto dMsgRes, el XSD vigente y el ambiente usado.

Explorador de códigos

Atajo: / para enfocar búsqueda · Esc para limpiar
Se muestran 40 por página para mantener el DOM liviano.

Flujo síncrono

Construir DE
Sin etiquetas opcionales vacías, comentarios, prefijos ni espacios de formato.
Validar XSD
Bloquear el envío si la validación local falla.
Firmar y validar firma
XMLDSig Enveloped, RSA-SHA256, Reference URI al CDC.
Enviar y persistir
Guardar request/response sanitizados, protocolo, estado y tiempos.
Resolver por código
No aplicar reintento ciego. Clasifique: definitivo, corregible, nuevo CDC, consulta o espera.

Flujo asíncrono por lotes

Generación

  1. Agrupar hasta 50 DE.
  2. Mismo RUC y mismo tipo documental.
  3. Todos firmados.
  4. Crear rLoteDE, comprimir y Base64.

Consulta

  1. Guardar dProtConsLote.
  2. Esperar al menos 10 minutos.
  3. Consultar en intervalos no menores a 10 minutos.
  4. Actualizar cada CDC individualmente.

Matriz de reintento

RESULTADO_DEFINITIVO       → guardar y no reenviar
ESPERAR_Y_CONSULTAR        → esperar; consultar lote/CDC
NO_REENVIAR_CONSULTAR      → posible duplicado; consultar estado oficial
REGENERAR_Y_FIRMAR         → reconstruir XML y firma; nuevo CDC si corresponde
REGENERAR_QR_Y_REENVIAR     → recalcular J002/cHashQR y reenviar tras validar
CORREGIR_VALIDAR_REENVIAR  → corregir campo, XSD, firma y reenvío controlado
CORREGIR_EVENTO_Y_REENVIAR → corregir XML de evento, firmar y respetar plazo

Schemas y catálogos oficiales

El directorio oficial contiene versiones v141 y v150. No mezcle schemas de distintas versiones sin verificar los import/include y la versión exigida por el servicio.

Validación local mínima

// PHP / Laravel: ejemplo conceptual
libxml_use_internal_errors(true);
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$dom->loadXML($xml, LIBXML_NONET | LIBXML_NOBLANKS);

if (!$dom->schemaValidate($rutaXsdLocal)) {
    // Sanitizar y guardar errores; bloquear envío.
}

Mantenga copias locales versionadas de los XSD con checksum. No dependa de descargarlos en cada emisión.

Protección del mini sistema HTML

Solo lectura y sin administración pública.
El visitante puede consultar, pero no agregar, editar ni eliminar códigos desde la interfaz.
Sin dependencias externas de JavaScript.
No carga scripts de terceros y reduce el riesgo de modificaciones por cadena de suministro.
Entrada de búsqueda aislada.
El texto escrito solo se usa para filtrar; no se ejecuta como HTML, JavaScript ni consulta SQL.
CSP con huellas SHA-256.
El navegador autoriza únicamente el CSS y JavaScript exactos incluidos en esta compilación.
Sin secretos en el frontend.
No contiene certificados, claves privadas, CSC, contraseñas, tokens ni XML fiscales.
!
Proteja también el archivo publicado.
Use HTTPS, acceso de escritura restringido, despliegue inmutable, copias de seguridad, CDN/WAF y permisos correctos del servidor.

Headers HTTP recomendados

Content-Security-Policy: default-src 'none'; script-src 'sha256-...'; style-src 'sha256-...'; connect-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'; form-action 'none'
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin

Aplique estos headers desde Nginx, Apache, Cloudflare o el hosting. El meta CSP del archivo es una defensa complementaria, no reemplaza los headers.

Integridad de esta compilación

SHA-256 datos: 9c1eac413959e1c3e29b802b0daeb6bf48e807c8864be517d6229799d64a99e2

SHA-256 script: ddb4c9e94c806adbbe0c08705e64c50d85d4839125f5ae761df11edd2e7e7232

Los hashes detectan cambios accidentales si se verifican desde una fuente separada. No protegen por sí solos contra un servidor comprometido.

Preparado para 1.000+ consultas simultáneas

Por qué escala

La consulta no ejecuta PHP, SQL ni API: el navegador descarga el archivo una vez y busca localmente. Con CDN, compresión Brotli y caché, el origen recibe muy poca carga.

Qué debe dimensionarse

Hosting/CDN, ancho de banda, TLS y el contador global. La capacidad real debe validarse con prueba de carga; no puede garantizarse solo por el código HTML.

Configuración de caché

# HTML principal: revalidación rápida
Cache-Control: public, max-age=300, stale-while-revalidate=86400
Content-Encoding: br

# Si separa datos/JS con nombre versionado:
Cache-Control: public, max-age=31536000, immutable

Contrato del contador global

El HTML registra la visita mediante POST api/index.php?route=visit. El servidor identifica de forma anónima al navegador con una cookie técnica: refrescar la página actualiza las visualizaciones, pero no vuelve a sumar un visitante único.

POST api/index.php?route=visit
Response 200 application/json
{ "ok": true, "count": 12345, "page_views": 18760 }

Requisitos del backend:
- incremento atómico (Redis INCR, Durable Object o transacción SQL)
- rate limit por IP/ASN sin guardar la IP en texto plano
- protección anti-bot en el borde
- CORS solo para su dominio
- timeout corto y respuesta cache-control: no-store
- no registrar búsquedas, RUC, CDC ni datos fiscales

Prueba de carga sugerida

# Pruebe su URL publicada; no el servicio SIFEN.
k6 run --vus 1000 --duration 60s prueba-guia.js

Criterios orientativos:
- errores HTTP < 0,1 %
- p95 del HTML desde CDN < 500 ms
- contador no debe bloquear la carga de la página
- CPU del origen estable y sin consultas de base de datos por búsqueda