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.
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
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
Flujo síncrono
Flujo asíncrono por lotes
Generación
- Agrupar hasta 50 DE.
- Mismo RUC y mismo tipo documental.
- Todos firmados.
- Crear
rLoteDE, comprimir y Base64.
Consulta
- Guardar
dProtConsLote. - Esperar al menos 10 minutos.
- Consultar en intervalos no menores a 10 minutos.
- 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 plazoSchemas y catálogos oficiales
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
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-originAplique 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, immutableContrato 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 fiscalesPrueba 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