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 usarloEn 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);
}
}
}
}