Está guía está dirigida para la generación del XML de la petición. En nuestro GitHub, puedes encontrar ejemplos para C# y PHP, donde cada uno tiene sus propios requisitos.
Requisitos
- Certificado (*.cer) de nuestra FIEL
- Llave privada (*.key) de nuestra FIEL
- Password de llave privada
Si tomamos el XML que aparece en la guía que nos proporciona el SAT para el consumo de esté Web Service, tendríamos algo como el siguiente XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<s:Envelope xmlns:des="http://DescargaMasivaTerceros.sat.gob.mx" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"> <s:Header/> <s:Body> <des:VerificaSolicitudDescarga> <des:solicitud IdSolicitud="de7f98b6-d20f-44de-ab19-b312b489eec2" RfcSolicitante="AUAC4601138F9"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>2zavoO/4lAZSUSFVRBpLbiEcfKg=</DigestValue> </Reference> </SignedInfo> <SignatureValue>Ir4nciZnmdEiThsnqMWlVDl5ZHrDAao0pvvxoleZDgwhgoTifQ602JtKCiAqsUAPuSfYlnXgPH5mOU2cgY46f+jfspdjivgwZCeJA/lCWt83/v8wg78Xaz1vNRkmDOX0Iu0HsGUISFlVM8ycf5BdkOPQHqvHIQdkHjOnP/j9w48Kn+xXTbODk8F2syM3W87y1K8FatRIltCUZPS/AciTMnv/FjAeBe1w7HJy5iCJEnax1gGdkJo9VpBrU9w5JBzTbHritcHZm97nQ6exZ92sdQtWtvWRrcvIaEUM0iofU186w/I/PYhZbL91xEXon3OGh5+Ra7rkbgCJIbZ8Q1clXA==</SignatureValue> <KeyInfo> <X509Data> <X509IssuerSerial> <X509IssuerName>CN=A.C. 2 de pruebas(4096),O=Servicio de Administración Tributaria,OU=Administración de Seguridad de la Información,emailAddress=asisnet@pruebas.sat.gob.mx,street=Av. Hidalgo 77, Col. Guerrero,postalCode=06300,C=MX,ST=Distrito Federal,L=Coyoacán,x500UniqueIdentifier=SAT970701NN3,unstructuredName=Responsable: ACDMA</X509IssuerName> <X509SerialNumber>286524172099382162235533054548081509963388106800</X509SerialNumber> </X509IssuerSerial> <X509Certificate>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</X509Certificate> </X509Data> </KeyInfo> </Signature> </des:solicitud> </des:VerificaSolicitudDescarga> </s:Body> </s:Envelope> |
Calcular datos necesarios
Id Solicitud: Id obtenido en el Web Service de solicitud. Por ejemplo: de7f98b6-d20f-44de-ab19-b312b489eec2
RFC solicitante: Nuestro RFC.
Certificado: Al igual que en CFDI 3.3, tomar los bytes del archivo .cer de la FIEL y hacer un encode utilizando base64.
Datos del Certificado: Obtener los datos del Certificado en el campo “Issuer”.
Utilizando la FIEL de pruebas, el resultado sería: CN=A.C. 2 de pruebas(4096),O=Servicio de Administración Tributaria,OU=Administración de Seguridad de la Información,emailAddress=asisnet@pruebas.sat.gob.mx,street=Av. Hidalgo 77, Col. Guerrero,postalCode=06300,C=MX,ST=Distrito Federal,L=Coyoacán,x500UniqueIdentifier=SAT970701NN3,unstructuredName=Responsable: ACDMA
En algunos lenguajes podría verse un poco diferente.
Número de Certificado: Obtener el dato del Certificado en el campo “Serial number”.
Utilizando la FIEL de pruebas, el resultado sería: 286524172099382162235533054548081509963388106800
Así mismo tener en cuenta, que el dato puede ser incluido como Hexadecimal o Decimal. Puede variar de acuerdo al lenguaje.
DigestValue: Se debe calcular el SHA1 en formato binario del siguiente texto (obviamente los datos cambiarán según situación)
Cuando digo texto, es el nodo con el namespace, pero dicho nodo debe ir sin espacios entre nodos
1 |
<des:SolicitaDescarga xmlns:des="http://DescargaMasivaTerceros.sat.gob.mx"><des:solicitud RfcEmisor="AUAC4601138F9" RfcReceptor="AUAC4601138F9" RfcSolicitante="AUAC4601138F9" FechaInicial="2018-10-10T00:00:00" FechaFinal="2018-10-20T00:00:00" TipoSolicitud="CFDI"></des:solicitud></des:SolicitaDescarga> |
Y los bytes que obtienes codearlos a base64.
Utilizando este nodo, el resultado tiene que ser: 2zavoO/4lAZSUSFVRBpLbiEcfKg=
SignatureValue: Se debe calcular un algoritmo de digestión SHA1 utilizando la llave privada de la FIEL y el siguiente texto:
1 |
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>GWJhbnAIBv0dny/4CY++AC4LPnY=</DigestValue></Reference></SignedInfo> |
Tener en consideración que el DigestValue anteriormente calculado aparece en dicho nodo.
Una vez hecha la digestión, el resultado en bytes lo codeamos en base64.
Utilizando la llave privada de la FIEL de pruebas “AUAC4601138F9”, el resultado tiene que ser: Ir4nciZnmdEiThsnqMWlVDl5ZHrDAao0pvvxoleZDgwhgoTifQ602JtKCiAqsUAPuSfYlnXgPH5mOU2cgY46f+jfspdjivgwZCeJA/lCWt83/v8wg78Xaz1vNRkmDOX0Iu0HsGUISFlVM8ycf5BdkOPQHqvHIQdkHjOnP/j9w48Kn+xXTbODk8F2syM3W87y1K8FatRIltCUZPS/AciTMnv/FjAeBe1w7HJy5iCJEnax1gGdkJo9VpBrU9w5JBzTbHritcHZm97nQ6exZ92sdQtWtvWRrcvIaEUM0iofU186w/I/PYhZbL91xEXon3OGh5+Ra7rkbgCJIbZ8Q1clXA==
Llenado de campos
Una vez que tengamos los datos anteriormente calculados, procederíamos a ponerlos sobre la plantilla del XML que se debe enviar al SAT.
IdSolicitud: Este campo, irá en el nodo de des:solicitud.
Rfc Solicitante: Este dato también va en el nodo de des:solicitud.
Certificado: Es el texto que en el nodo s:Envelope/s:Body/o:Security/des:VerificaSolicitudDescarga/ des:solicitud/Signature/KeyInfo/X509Data/X509Certificate
Datos del Certificado: Es el texto que en el nodo s:Envelope/s:Body/o:Security/des:VerificaSolicitudDescarga/ des:solicitud/Signature/KeyInfo/X509Data/X509IssuerSerial/X509IssuerName
Número de Certificado: Es el texto que en el nodo s:Envelope/s:Body/o:Security/des:VerificaSolicitudDescarga/ des:solicitud/Signature/KeyInfo/X509Data/X509IssuerSerial/X509SerialNumber
DigestValue: Es el texto que en el nodo s:Envelope/s:Body/o:Security/des:VerificaSolicitudDescarga/des:solicitud/ Signature/SignedInfo/Reference/DigestValue
SignatureValue: Es el texto que va en el nodo s:Envelope/s:Body/o:Security/des:VerificaSolicitudDescarga/des:solicitud/ Signature/SignatureValue
Documento Final
Después de hacer el cálculo y llenado de los datos, tendríamos el siguiente XML de ejemplo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<s:Envelope xmlns:des="http://DescargaMasivaTerceros.sat.gob.mx" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"> <s:Header/> <s:Body> <des:VerificaSolicitudDescarga> <des:solicitud IdSolicitud="de7f98b6-d20f-44de-ab19-b312b489eec2" RfcSolicitante="AUAC4601138F9"> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>2zavoO/4lAZSUSFVRBpLbiEcfKg=</DigestValue> </Reference> </SignedInfo> <SignatureValue>Ir4nciZnmdEiThsnqMWlVDl5ZHrDAao0pvvxoleZDgwhgoTifQ602JtKCiAqsUAPuSfYlnXgPH5mOU2cgY46f+jfspdjivgwZCeJA/lCWt83/v8wg78Xaz1vNRkmDOX0Iu0HsGUISFlVM8ycf5BdkOPQHqvHIQdkHjOnP/j9w48Kn+xXTbODk8F2syM3W87y1K8FatRIltCUZPS/AciTMnv/FjAeBe1w7HJy5iCJEnax1gGdkJo9VpBrU9w5JBzTbHritcHZm97nQ6exZ92sdQtWtvWRrcvIaEUM0iofU186w/I/PYhZbL91xEXon3OGh5+Ra7rkbgCJIbZ8Q1clXA==</SignatureValue> <KeyInfo> <X509Data> <X509IssuerSerial> <X509IssuerName>CN=A.C. 2 de pruebas(4096),O=Servicio de Administración Tributaria,OU=Administración de Seguridad de la Información,emailAddress=asisnet@pruebas.sat.gob.mx,street=Av. Hidalgo 77, Col. Guerrero,postalCode=06300,C=MX,ST=Distrito Federal,L=Coyoacán,x500UniqueIdentifier=SAT970701NN3,unstructuredName=Responsable: ACDMA</X509IssuerName> <X509SerialNumber>286524172099382162235533054548081509963388106800</X509SerialNumber> </X509IssuerSerial> <X509Certificate>MIIGCDCCA/CgAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI3ODAwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNjEwMjEyMjMxMzlaFw0yMDEwMjAyMjMxMzlaMIHCMRswGQYDVQQDExJPTElWSUEgTU9SRU5PIExFT04xGzAZBgNVBCkTEk9MSVZJQSBNT1JFTk8gTEVPTjEbMBkGA1UEChMST0xJVklBIE1PUkVOTyBMRU9OMQswCQYDVQQGEwJNWDEnMCUGCSqGSIb3DQEJARYYZXJpa2EubWVuZG96YUBzYXQuZ29iLm14MRYwFAYDVQQtEw1BVUFDNDYwMTEzOEY5MRswGQYDVQQFExJGVUFCNzcwMTE3TU1DTkxUMDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+SiehGkjnvxD7f9ycvOgUcxH4ipWDlXZQYdPCWIR/tClspeOzl4p9r/ng+lLJoVrg7tmo83qthCu07a0CHyJJxu+tO3uPPrCffrPqJo9QLfQrimF7d1h5Dl1a9sLYEzZqIV2zVLJGZPeQP+pBPrB1lhScZ4oTvFvZDPTQlLV1+DDEHhtN6gPKs3s6/iwduShIv6ZwH1LWwukGWfO3Y4lCB8jhDisrngAx6Fsb64Z6x8HGCC0VV8dWY/Du38mzdktJZxILUZsZZbbYhSIoUQo1wgpqF845l64kSSW2zp9K5JSZNClpp9GGecEj01uC9IUtWrf71ceeDwTqoSRmRHcvAgMBAAGjTzBNMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgPYMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAEcPeAKlzWYfRoMq9NOUkxZTqorGaYhKIzGwDrXIlDvSyUpn3hsF8lIizqhItThNaFjJ2CaYrQwxZzkgCVWk5k9ZmwUmISPJPY+UL+VbZDwCeNB8+42oe2HJF1FyHFMk6qExhG9DLTiRadjfoYY8OFiZeXsa6RQN2Gt4KyFMPC+p8mPh7PG0Mfr0UqEnnCggxx+GBL280MlBStwl/DK30knCeBs602H0tBGWGZVAKSL89Wp/tpUuNi9E4i+SjgK4KWTGZ6UxWB6fStGzS6lq63rVERGAcVVyYBezOkpf8yng42GoQ+ByJS7HDVhhZOm3lUJ1xWmNR2eCzC99JJxNRIwCQCWZtXNnQmlmQahKP7ByRZ9KCaepRBo5BYBNsLBCWLDaGbe7373eJMJbOus/PvkCIUtCtH5e6Svz+Oljz5fmPQpN1qnyDSgwbnXMlHJYJANGqgBBo5vo4Zy8XWX+1cc4l85odiZSvYlPimhd/iKflDTGSynkYpn/F0JmtDyKnafYlyvfdXqGaqcW78JkdAbdpKgdxlwR0h7xCHLzOEFL6u2EOyQTXjSdiLliuiWoiBkQ7ZamGfeW+NyNMp5tGRdWeG0i8Y40YUCMpQi71vpmsK3n63ThuHowPNVe6NxY1ZNByUIfHfxHe9G5SZflPzN3F+hieAlz2tzyXCuVGdzw</X509Certificate> </X509Data> </KeyInfo> </Signature> </des:solicitud> </des:VerificaSolicitudDescarga> </s:Body> </s:Envelope> |
Dicho ejemplo fue realizado con la FIEL del certificado de pruebas “AUAC4601138F9”, disponible para su descarga en este enlace.
Response exitoso
1 2 3 4 5 6 7 8 9 |
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <VerificaSolicitudDescargaResponse xmlns="http://DescargaMasivaTerceros.sat.gob.mx"> <VerificaSolicitudDescargaResult CodEstatus="5000" EstadoSolicitud="3" CodigoEstadoSolicitud="5000" NumeroCFDIs="121" Mensaje="Solicitud Aceptada"> <IdsPaquetes>de7f98b6-d20f-44de-ab19-b312b489eec2_01</IdsPaquetes> </VerificaSolicitudDescargaResult> </VerificaSolicitudDescargaResponse> </s:Body> </s:Envelope> |
Response con error
1 2 3 4 5 6 7 |
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <VerificaSolicitudDescargaResponse xmlns="http://DescargaMasivaTerceros.sat.gob.mx"> <VerificaSolicitudDescargaResult CodEstatus="301" EstadoSolicitud="0" NumeroCFDIs="0" Mensaje="XML Mal Formado"/> </VerificaSolicitudDescargaResponse> </s:Body> </s:Envelope> |