Verificacion
La solicitud de verificacion se utiliza para verificar el estatus de la solicitud de descarga. Si la solicitud de descarga fue aceptada y el estatus de la verificacion es terminada, el servicio web devolvera los identificadores de los paquetes a descargar.
Antes de poder utilizar el servicio de verificacion debemos primero autenticarnos con el servicio web y obtener un token de acceso.
Para crear una solicitud de verificacion utilizamos el metodo estatico CreateInstance
de la clase VerificacionRequest
.
public static VerificacionRequest CreateInstance(string requestId, string requestingRfc, AccessToken accessToken)
Descripcion de los parametros:
-
RequestId
- Contiene el Identificador de la solicitud que se pretende consultar. -
RequestingRfc
- Contiene el RFC del que está realizando la solicitud de verificacion. -
AccessToken
- Token de autorizacion.
Para enviar la solicitud de solicitud de verificacion al servicio web utilizamos el metodo SendSoapRequestAsync
del servicio VerificacionService
.
public async Task<VerificacionResult> SendSoapRequestAsync(VerificacionRequest verificacionRequest,
X509Certificate2 certificate,
CancellationToken cancellationToken = default)
Parametros del metodo SendSoapRequestAsync
:
-
VerificacionRequest
- Solicitud de verificacion. -
X509Certificate2
- Certificado SAT (.pfx). -
CancellationToken
- Token de cancelacion.
El metodo SendSoapRequestAsync
:
- Genera el contenido SOAP de la solicitud HTTP tomando la informacion de
VerificacionRequest
. - Crea la solicitud HTTP
- Envia la solicitud HTTP al servicio web.
- Regresar el resultado de la solicitud HTTP ya deserializado en la clase
VerificacionResult
.
La solicitud regresa el resultado VerificacionResult
con las siguientes propiedades:
-
PackageIds
- Contiene los identificadores de los paquetes que componen la solicitud de descarga masiva. -
DownloadRequestStatusNumber
- Contiene el número correspondiente al estado de la solicitud de descarga. -
DownloadRequestStatusCode
- Contiene el código de estado de la solicitud de descarga. -
NumberOfCfdis
- Número de CFDIs que conforman la solicitud de descarga consultada. -
RequestStatusCode
- Código de estatus de la solicitud. -
RequestStatusMessage
- Pequeña descripción del código estatus. -
HttpStatusCode
- Codigo de estatus de la respuesta HTTP. -
ResponseContent
- Contenido del mensage de la respuesta HTTP.
Si la solicitud fue exitosa el sevicio web nos regresara los PackageIds
y un RequestStatusCode = 5000
. Si la solicitud no fue exitosa no se obtendran los PackageIds
y no se podra hacer uso del servicio de descarga. Sera necesario validar el valor de las propiedades RequestStatusCode
y RequestStatusMessage
para saber que tipo de error marco el servicio web y poder hacer los ajustes necesarios para volver a intentar generar una solicitud de verificacion.
// Autenticarse primero
// Enviar solicitud de descarga y guardar el RequestId
logger.LogInformation("Buscando el servicio de verificacion en el contenedor de servicios (Dependency Injection).");
var verificaSolicitudService = host.Services.GetRequiredService<IVerificacionService>();
logger.LogInformation("Creando solicitud de verificacion.");
var verificacionRequest = VerificacionRequest.CreateInstance(solicitudResult.RequestId, rfcSolicitante, autenticacionResult.AccessToken);
logger.LogInformation("Enviando solicitud de verificacion.");
VerificacionResult verificacionResult = await verificaSolicitudService.SendSoapRequestAsync(verificacionRequest,
certificadoSat,
cancellationToken);
if (verificacionResult.DownloadRequestStatusNumber != EstadoSolicitud.Terminada.Value.ToString())
{
logger.LogError(
"La solicitud de verificacion no fue exitosa. DownloadRequestStatusNumber:{0} RequestStatusCode:{1} RequestStatusMessage:{2}",
verificacionResult.DownloadRequestStatusNumber,
verificacionResult.RequestStatusCode,
verificacionResult.RequestStatusMessage);
if (verificacionResult.DownloadRequestStatusNumber == EstadoSolicitud.Aceptada.Value.ToString())
{
logger.LogInformation(
"Es estado de la solicitud es Aceptada. Mandar otra solicitud de verificaion mas tarde para que el servicio web pueda procesar la solicitud.");
}
else if (verificacionResult.DownloadRequestStatusNumber == EstadoSolicitud.EnProceso.Value.ToString())
{
logger.LogInformation(
"Es estado de la solicitud es En Proceso. Mandar otra solicitud de verificaion mas tarde para que el servicio web pueda procesar la solicitud.");
}
throw new Exception();
}
logger.LogInformation("La solicitud de verificacion fue exitosa.");
foreach (string idsPaquete in verificacionResult.PackageIds)
{
logger.LogInformation("PackageId:{0}", idsPaquete);
}