Buscar en este blog

domingo, 1 de junio de 2025

Detección errores de Autenticación SII

Estimados colegas les dejo un pequeño script en csharp para detectar el por qué no es posible recuperar las cookies de las credenciales desde el servidor del SII. Esto debido a que un cliente tiene un proceso masivo de autenticación de varios clientes y muchos de ellos generaban error al momento de generar el proceso de autenticación. 

Bueno les dejo el script para que puedan determinar lo siguiente: 
- (SII) La Clave Tributaria ingresada no es correcta 
- (SII) Su clave tributaria se encuentra bloqueada. 
- (SII) Usted nuevamente ha ingresado erróneamente su Clave Tributaria. 
- (SII) En este momento no lo podemos atender. Por favor intente más tarde.


Extensión de Csharp
	
	
/// 
/// Recupera el error subyacente desde la respuesta 'Response'
/// En el caso que no sea posible recuperar las coookies desde el SII y debe reconocer
/// cual es el problema podemos interpretar el contenido del response. Esto permite determinar
/// que pudo haber pasado en el proceso de autenticación.
/// NOTA:
/// Se debe mantener este código pues los resultados del SII pueden cambiar en el tiempo
/// y eso puedo dañar la interpretación de los errores.
/// NOTA:
/// Es posible que el contenido recuperado regrese ocacionalmente basura, esto no se puede controlar
/// en este proceso. pero se dejara un registro del archivo como un log en disco.
internal static void ExtGetErrorResponse(this string contenido, string rutEmpresa)
{

    ////
    //// Si ejecutamos este metodo quiere decir que no fue posible
    //// recuperar las cookies desde el autenticador del SII.

    ////
    //// TODO: Solo si necesita guardar el archivo para analisis
    File.WriteAllText(
        $"ErroresRequest\\ERROR_R{rutEmpresa}.Html",
            contenido,
                Encoding.UTF8);
    ////
    //// Pattern
    //// 401 - "La Clave Tributaria ingresada no es correcta"
    if (Regex.IsMatch(contenido,
            "La Clave Tributaria ingresada no es correcta",
                RegexOptions.Singleline))
                    throw new UnauthorizedAccessException(
                        "401 - Error de autenticación. " +
                            "(SII) La Clave Tributaria ingresada no es correcta");
    ////
    //// Pattern
    //// 423 - "Su clave tributaria se encuentra bloqueada"
    if (Regex.IsMatch(contenido,
            "Su clave tributaria se encuentra bloqueada",
                RegexOptions.Singleline))
                    throw new UnauthorizedAccessException(
                        "423 - Error de autenticación. " +
                            "(SII) Su clave tributaria se encuentra bloqueada.");
    ////
    //// Pattern
    //// 423 - "Usted nuevamente ha ingresado err"
    if (Regex.IsMatch(contenido,
            "Usted nuevamente ha ingresado err",
                RegexOptions.Singleline))
                    throw new UnauthorizedAccessException(
                        "423 - Error de autenticación. " +
                            "(SII) Usted nuevamente ha ingresado erróneamente su Clave Tributaria.");
    ////
    //// Pattern
    //// 503 - En este momento no lo podemos atender. Por favor intente más tarde.
    if (Regex.IsMatch(contenido,
            "En este momento no lo podemos atender",
                RegexOptions.Singleline))
                    throw new HttpRequestException(
                        "503 - Error de autenticación. " +
                            "(SII) En este momento no lo podemos atender. Por favor intente más tarde.");
    ////
    //// En caso que no se encuentre el pattern en la respuesta del SII
    //// podemos capturar toda la respuesta del SII y evaluarla.
    throw new Exception($"Error desconocido, '{contenido}'");


}
Como usarlo
En su proyecto al momento de consultar las cookies y no tener resultado puede:

////
//// Recupere la respuesta de la consulta ( response )
using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
{
    ////
    //// Recuperar el token
    if (response.StatusCode == HttpStatusCode.OK)
    {
        ////
        //// Recupere las cookies de la operación
        if (response.Headers.AllKeys.Contains("Set-Cookie"))
        {
            ////
            //// Recupere y formate las cookies
            string cookies = response.Headers["Set-Cookie"];
            if (!string.IsNullOrEmpty(cookies))
                _cookies = cookies.ExtGetCookies();
        }
        else
        {
            ////
            //// Es posible que el SII no regrese cookies y puede deberse a 
            //// error de credenciales.
            using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                ////
                //// Busca el motivo por el cual no hay cookies en la
                //// respuesta de la autentiación
                reader.ReadToEnd().ExtGetErrorResponse(rutEmpresa);

            }

        }

    }

}

No hay comentarios:

Publicar un comentario