Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía de usuario
WSCFDI EDICOM
Historial de cambios
Versión Fecha Descripción de la acción Páginas
1.0 21/01/2011 Versión inicial WSCFDi Todas
1.1 18/02/2011 Corregido referencias equivocas a CFD en al 4, 5,8.,15,18
descripción de las funciones.
1.2 17/03/2011 El ws permite ahora enviar ZIP o XML en el 5, 8, 15, 18
parámetro file
1.3 12/07/2011 Corrección. Se modifica el ejemplo de la 9,10
respuesta SOAP de getTimbreCfdi
1.4 10/08/2011 Nuevas funciones getUUID y getUUIDTest 2, 6, 23-28, 30
Corrección. Se corrigen los códigos de error
de la cancelación de comprobantes
1.5 19/10/2011 Nuevas funciones CancelaCFDISgined, 27-32
getCFDIAck y getCFDIFromUUID.
se modifica la WSDL incluida en el
documento
1.6 08/10/2013 Nuevas consideraciones de las funciones 18, 21, 24 y 26
getCfdiTest, getTimbreCfdiTest, getUUID y
getUUIDTest
1.7 11/02/2014 Nuevas consideraciones de funcionamiento 14, 17, 18, 32, 34, 35 y 36
y códigos de errores de las funciones
cancelaCfdi y cancelaCfdiSigned
1.8 04/12/2014 Servicio de timbrado de comprobantes de 6, 37-49, 52-69
retenciones electrónicas
1.9 10/02/2015 Servicio de cancelación de comprobantes de 6, 49-58, 61-81
retenciones electrónicas
1.10 02/02/2017 Ajuste referencias a RMF en Introducción, 6, 8, 11, 21, 23, 26, 28, 40, 43, 46, 49
Generación del CFDI, Generación del Timbre
del CFDI, Generación del CFDI en Test,
Generación del Timbre del CFDI en Test,
Comprobación del Timbrado CFDI,
Comprobación del Timbrado CFDI en Test,
Generación del CFDI de Retenciones
Electrónicas, Generación del Timbre del
CFDI de Retenciones Electrónicas,
Generación del CFDI de Retenciones
Electrónicas en Test, Generación del Timbre
del CFDI de Retenciones Electrónicas en Test
1.11 19/09/2018 Nuevas funciones de cancelación asíncrona 4-6, 8, 16, 21, 22, 37, 42, 43, 74-88, 92-
por cambio en normativa del SAT, y nueva 117
función de consulta de estado del
comprobante.
1.12 17/10/2018 Correcciones de textos. 75, 80, 86
WSCFDI EDICOM | | 2
WSCFDI EDICOM
WSCFDI EDICOM | | 3
WSCFDI EDICOM
Índice de contenido
1. WebService CFDi de EDICOM..........................................................................................................................................7
1.1. Introducción.............................................................................................................................................................................................7
URL de acceso al servicio..........................................................................................................................................................................7
Funciones Del Webservice CFDi de Edicom..............................................................................................................................................7
2. Funciones.......................................................................................................................................................................9
2.1. Generación del CFDi...............................................................................................................................................................................9
Llamada:...................................................................................................................................................................................................9
Parámetros:..............................................................................................................................................................................................9
Respuesta:................................................................................................................................................................................................9
Ejemplos.................................................................................................................................................................................................10
2.2. Generación del ti mbre del CFDi.........................................................................................................................................................13
Llamada:.................................................................................................................................................................................................13
Parámetros:............................................................................................................................................................................................13
Respuesta:..............................................................................................................................................................................................13
Ejemplos.................................................................................................................................................................................................14
2.3. Cancelar CFDi.........................................................................................................................................................................................16
Llamada:.................................................................................................................................................................................................16
Parámetros:............................................................................................................................................................................................16
Respuesta:..............................................................................................................................................................................................16
Ejemplos.................................................................................................................................................................................................17
Consideraciones importantes.................................................................................................................................................................19
2.4. Cambiar password de acceso al servicio de CFDi..........................................................................................................................21
Llamada:.................................................................................................................................................................................................21
Parámetros:............................................................................................................................................................................................21
Respuesta:..............................................................................................................................................................................................22
Ejemplos.................................................................................................................................................................................................22
2.5. Generación del CFDi en TEST..............................................................................................................................................................24
Llamada:.................................................................................................................................................................................................24
Parámetros:............................................................................................................................................................................................24
Respuesta:..............................................................................................................................................................................................24
Ejemplos.................................................................................................................................................................................................25
2.6. Generación del ti mbre del CFDi en TEST.........................................................................................................................................27
Llamada:.................................................................................................................................................................................................27
Parámetros:............................................................................................................................................................................................27
Respuesta:..............................................................................................................................................................................................27
Ejemplos.................................................................................................................................................................................................28
2.7. Comprobación del ti mbrado CFDi.....................................................................................................................................................30
Llamada:.................................................................................................................................................................................................30
Parámetros:............................................................................................................................................................................................30
Respuesta:..............................................................................................................................................................................................30
Ejemplos.................................................................................................................................................................................................30
2.8. Comprobación del ti mbrado CFDi en test.......................................................................................................................................32
Llamada:.................................................................................................................................................................................................33
Parámetros:............................................................................................................................................................................................33
Respuesta:..............................................................................................................................................................................................33
Ejemplos.................................................................................................................................................................................................33
2.9. Cancelar CFDi Firmado.........................................................................................................................................................................35
Llamada:.................................................................................................................................................................................................35
Parámetros:............................................................................................................................................................................................36
Respuesta:..............................................................................................................................................................................................36
WSCFDI EDICOM | | 4
WSCFDI EDICOM
Ejemplos.................................................................................................................................................................................................36
Consideraciones importantes.................................................................................................................................................................38
2.10. Obtención del ACK(acuse) del ti mbrado.......................................................................................................................................41
Llamada:.................................................................................................................................................................................................41
Parámetros:............................................................................................................................................................................................41
Respuesta:..............................................................................................................................................................................................41
Ejemplos.................................................................................................................................................................................................41
2.11. Obtención del ti mbre a parti r del UUID........................................................................................................................................43
Llamada:.................................................................................................................................................................................................44
Parámetros:............................................................................................................................................................................................44
Respuesta:..............................................................................................................................................................................................44
Ejemplos.................................................................................................................................................................................................44
2.12. Generación del CFDi de retenciones electrónicas.......................................................................................................................46
Llamada:.................................................................................................................................................................................................46
Parámetros:............................................................................................................................................................................................46
Respuesta:..............................................................................................................................................................................................47
Ejemplos.................................................................................................................................................................................................47
2.13. Generación del ti mbre del CFDi de retenciones electrónicas..................................................................................................50
Llamada:.................................................................................................................................................................................................50
Parámetros:............................................................................................................................................................................................50
Respuesta:..............................................................................................................................................................................................50
Ejemplos.................................................................................................................................................................................................51
2.14. Generación del CFDi de retenciones electrónicas en TEST .......................................................................................................53
Llamada:.................................................................................................................................................................................................53
Parámetros:............................................................................................................................................................................................53
Respuesta:..............................................................................................................................................................................................54
Ejemplos.................................................................................................................................................................................................54
2.15. Generación del ti mbre del CFDi de retenciones electrónicas en TEST...................................................................................56
Llamada:.................................................................................................................................................................................................56
Parámetros:............................................................................................................................................................................................57
Respuesta:..............................................................................................................................................................................................57
Ejemplos.................................................................................................................................................................................................57
2.16. Cancelar comprobantes de retenciones electrónicas................................................................................................................59
Llamada:.................................................................................................................................................................................................59
Parámetros:............................................................................................................................................................................................59
Respuesta:..............................................................................................................................................................................................60
Ejemplos.................................................................................................................................................................................................60
Consideraciones importantes.................................................................................................................................................................63
2.17. Cancelar comprobantes de retenciones electrónicas Firmado................................................................................................65
Llamada:.................................................................................................................................................................................................65
Parámetros:............................................................................................................................................................................................65
Respuesta:..............................................................................................................................................................................................65
Ejemplos.................................................................................................................................................................................................65
Consideraciones importantes.................................................................................................................................................................68
2.18. Cancelar CFDi Asíncrono...................................................................................................................................................................70
Llamada:.................................................................................................................................................................................................70
Parámetros:............................................................................................................................................................................................70
Respuesta:..............................................................................................................................................................................................71
Ejemplos.................................................................................................................................................................................................71
Consideraciones importantes.................................................................................................................................................................74
2.19. Cancelar CFDi fi rmado Asíncrono...................................................................................................................................................75
WSCFDI EDICOM | | 5
WSCFDI EDICOM
Llamada:.................................................................................................................................................................................................75
Parámetros:............................................................................................................................................................................................75
Respuesta:..............................................................................................................................................................................................76
Ejemplos.................................................................................................................................................................................................76
Consideraciones importantes.................................................................................................................................................................79
2.20. Comprobación del estado de un comprobante............................................................................................................................80
Llamada:.................................................................................................................................................................................................80
Parámetros:............................................................................................................................................................................................80
Respuesta:..............................................................................................................................................................................................80
Ejemplos.................................................................................................................................................................................................81
4. Anexo: WSDL................................................................................................................................................................86
4.1. WSDL WEBSERVICE CFDi......................................................................................................................................................................86
WSCFDI EDICOM | | 6
WSCFDI EDICOM
1.1. INTRODUCCIÓN
CFDi es la plataforma webservice de EDICOM para generar los Comprobantes Fiscales Digitales a través de
Internet. Esta plataforma acredita a EDICOM como Proveedor Autorizado de CFD por el Servicio de
Administración Tributaria, convirtiéndose así en Proveedor de Servicios de Expedición de Comprobante Fiscal
Digital a través de Internet (PSECFDI), conforme a los nuevos requerimientos especificados para realiza todas las
validaciones de los CFDi exigidas por el SAT.
Este documento ofrece la WSDL del servicio y la información necesaria para que para interactuar con el servicio
CFDi y desarrollar aplicaciones compatibles con el servicio CFDi.
La elaboración de los webservices que aquí se presentan está basada en las siguiente normas oficiales :
• [1] Resolución Miscelánea Fiscal vigente publicada en el Diario Oficial de la Federación (DOF) y sus
posteriores modificaciones a la resolución y anexos, en concreto el Anexo 20
https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl
La implementación del servicio se realiza a través del protocolo https. De esta forma, se utiliza un canal de
comunicaciones seguro con el Proveedor de Servicios de Emisión de CFDI (PSECFDI).
getCfdiFromUUID Obtención del CFDi timbrado. Permite obtener un duplicado de los CFDi 1.0
generados anteriormente.
getCfdiRetenciones Generación de Retenciones de CFDI. Permite realizar el timbrado del 1.0
comprobante de retenciones electrónicas firmado por el cliente y devuelve el
comprobante timbrado.
getTimbreCfdiRetencio Generación de timbre de Retenciones de CFDI. Permite realizar el timbrado del 1.0
nes comprobante de retenciones electrónicas firmado por el cliente y devuelve el
timbre del comprobante timbrado.
getCfdiRetencionesTes Generación de Retenciones de CFDi en test. Permite realizar el timbrado del 1.0
t comprobante de retenciones electrónicas firmado por el cliente en modo de
prueba y devuelve el comprobante de retenciones electrónicas timbrado.
getTimbreCfdiRetencio Generación de timbre de Retenciones de CFDI en test. Permite realizar el 1.0
nesTest timbrado del comprobante de retenciones electrónicas firmado por el cliente en
modo de prueba y devuelve el timbre del comprobante de retenciones
electrónicas timbrado.
cancelaCFDiRetenci Cancelación de Retenciones de CFDI. Permite cancelar comprobantes de 1.0
ones retenciones electrónicas timbrados.
2. FUNCIONES
getCfdi
Permite realizar el timbrado del comprobante firmado por el cliente y devuelve el comprobante timbrado. Para
poder implementar la llamada, el usuario debe autentificarse como usuario del servicio de CFDi y especificar
cuales son los datos del comprobante para poder generar así la firma digital.
LLAMADA:
public byte[] getCfdi(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• file: Fichero con los datos del comprobante firmados por el usuario. Se trata del XML con la información
del comprobante, según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1].
Puede enviarse también comprimido en en formato ZIP. Dentro del mensaje SOAP, se enviarán los datos
del fichero codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
El comprobante que se enviará al webservice es un XML que contiene la información de la factura, e integra el
certificado del contribuyente expedido por el SAT, empleado en la construcción del “Sello Digital del
Comprobante” , según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1] .
Edicom, como PSECFDI recibe a través del webservice el Comprobante del contribuyente para realizar todas las
validaciones exigidas por el SAT y someterlo posteriormente al proceso de certificación final.
• Verifica que el período de tiempo entre la fecha de envío del documento y la de recepción del
documento para su certificación no exceda de 72 horas.
• Verifica igualmente que el documento no haya sido certificado previamente, que el Certificado de
Sello Digital (CSD) del contribuyente esté vigente en la fecha de generación del comprobante, y que
efectivamente corresponda dicho CSD al contribuyente que emite el documento.
• Finalmente constata que la estructura del documento cumple con las especificaciones técnicas
conforme a la Resolución Miscelánea Fiscal para 2010 y sucesivas modificaciones.
Si el CFDI cumple con las validaciones especificadas anteriormente, se dará respuesta al contribuyente
incorporando un complemento sobre el documento según lo especificado en el Anexo 20 de la Resolución
Miscelánea Fiscal vigente [1]. Este complemento incluye el número de folio asignado por el SAT, fecha y hora de
certificación y sello digital del CFDI. Se adhiere igualmente como parte del complemento el número de serie del
certificado digital del SAT con el que se realizó del certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el CFDI con todos los datos generados.
•
Respuesta con errores: En caso de que haya algún error en el proceso de firma digital del CFDI,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI, o que el
CFDI enviado no es correcto sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de un envío de CFDI satisfactorio.
<getCfdiReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9PS18xLlhNTN
1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getCfdiReturn>
</getCfdiResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Nota: En este ejemplo concreto se presenta un error "301" indicando que el documento
no está codificado en UTF-8.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getTimbreCfdi
Permite realizar el timbrado del comprobante firmado por el cliente y devuelve el timbre del comprobante
timbrado. Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio de CFDi
y especificar cuales son los datos del comprobante para poder generar así la firma digital.
LLAMADA:
public byte[] getTimbreCfdi(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• file: Fichero con los datos del comprobante firmados por el usuario. Se trata del XML con la información
del comprobante, según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1].
Puede enviarse también comprimido en en formato ZIP. Dentro del mensaje SOAP, se enviarán los datos
del fichero codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
El comprobante que se enviará al webservice es un XML que contiene la información de la factura, e integra el
certificado del contribuyente expedido por el SAT, empleado en la construcción del “Sello Digital del
Comprobante” según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1] .
Edicom, como PSECFDI recibe a través del webservice el Comprobante del contribuyente para realizar todas las
validaciones exigidas por el SAT y someterlo posteriormente al proceso de certificación final.
• Verifica que el período de tiempo entre la fecha de envío del documento y la de recepción del
documento para su certificación no exceda de 72 horas.
• Verifica igualmente que el documento no haya sido certificado previamente, que el Certificado de
Sello Digital (CSD) del contribuyente esté vigente en la fecha de generación del comprobante, y que
efectivamente corresponda dicho CSD al contribuyente que emite el documento.
• Finalmente constata que la estructura del documento cumple con las especificaciones técnicas
conforme a la Resolución Miscelánea Fiscal vigente y sucesivas modificaciones.
Si el CFDI cumple con las validaciones especificadas anteriormente, se dará respuesta al contribuyente con el
timbre de la firma digital según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1].
Este timbre incluye el número de folio asignado por el SAT, fecha y hora de certificación y sello digital del CFDI.
Se adhiere igualmente como parte del complemento el número de serie del certificado digital del SAT con el que
se realizó del certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el timbre del CFDI firmado con todos los datos generados.
•
Respuesta con errores: En caso de que haya algún error en el proceso de firma digital del CFDI,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI, o que el
CFDI enviado no es correcto sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de timbre satisfactoria.
<getTimbreCfdiReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9PS18x
LlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getTimbreCfdiReturn>
</getTimbreCfdiResponse>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
cancelaCFDi
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi y especificar
cuales son los CFDI que quiere cancelar mediante los UUIDs de los comprobantes firmados digitalmente.
Importante: Esta llamada dejará de estar vigente el día 1 de noviembre de 2018 porque
el SAT ha modificado la forma en que se tienen que cancelar los comprobantes.
LLAMADA:
public CancelaResponse cancelaCFDi(String user, String password, String rfc,
String[] uuid, byte[] pfx, String pfxPassword);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• uuid: Lista de uuids que identifican los CFDI que quiere cancelar el usuario.
• pfx: Certificado del cliente que quiere cancelar los CFDI. Dentro del mensaje SOAP, se enviarán los datos
del fichero pfx codificados en Base64 dentro del sobre de la llamada SOAP.
• PxfPassword: Password del certificado para poder realizar la firma de la petición con el certificado del
usuario.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la cancelación Satisfactoria de los
comprobantes, el servicio devolverá un listado de datos derivados de la cancelación:
• ack: Confirmación que devuelve el servicio del SAT como que la petición se ha realizado. Está
codificado en base 64 y contiene el acuse de recibo expedido por el SAT para la cancelación.
Una vez decodificado, este acuse contiene el xml con la información de la petición de
cancelación solicitada al SAT por parte de EDICOM, incluyendo los códigos de ejecución del
servicio por parte del SAT especificados en el Anexo 20.
• Respuesta con errores: En caso de que haya algún error en el proceso de cancelación de los CFDI,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el certificado del usuario.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Código del cliente:
Petición SOAP:
<cfdi:pfx>MIIJuQIBAzCCCX8GCSqGSIb3DQEHAaCCCXAEgglsMIIJaDCCBB8GCSqGSIb3DQEHBqCCBBA
wggQMAgEAMIIEBQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIkI0BwQTfWEQCAggAgIID2DzPnHdO
A4XWGeanHoCuRitvCJJecEBSkqvg8ohliY7IiVp8qF3agvOqt32kbEDXHfrLpVVhlPnjrZo4
[...]
Hzl11kfETcJiuMUNa5hOx5CiB2WqAg/
tV9MDOdUZEkN4E+N9xxSxPAkSw75RvvVfRPW4JFXbmfs7c230aPodMQP58PfaJilI/
Nm8cvAQXIEwRugMSUwIwYJKoZIhvcNAQkVMRYEFBlCuYgPj26y+M2HK9s6Tpe2JmgCMDEwITAJBgUrDgM
CGgUABBSz8OKBcbpiR69Tw0UJ1d1D2xW0EQQIar9uSxM7uToCAggA</cfdi:pfx>
<cfdi:pfxPassword>qwertyuio</cfdi:pfxPassword>
</cfdi:cancelaCFDi>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
Ejemplo de una respuesta de cancelación de CFDI satisfactoria.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiReturn>
</cancelaCFDiResponse>
</soapenv:Body>
</soapenv:Envelope>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se ha
podido cancelar los UUIDs especificados.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>
<ns1:text>No se ha podido cancelar los UUIDs
especificados.</ns1:text>
</ns1:fault>
<ns2:
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
CONSIDERACIONES IMPORTANTES
Timeout de la llamada de esta función
Hay que tener en cuenta que el proceso de timbrado depende directamente del proceso de cancelación del SAT.
Por tanto, el tiempo de respuesta de esta función no depende del servicio de cancelación de EDICOM, sino que
depende directamente del tiempo de proceso de los servidores del SAT. Este proceso no es tan inmediato como
e tiempo de generación del timbrado, por lo que es necesario que se utilice un timeout considerable para estas
peticiones de cancelación.
Por defecto, los clientes de webservice suelen tener un timeout de 30 segundos, que puede llegar a ser
insuficiente para la correcta ejecución de esta función. Se recomienda utilizar para esta llamada un timeout no
inferior a 2 minutos para evitar que venza la llamada por timeout y se pierda la respuesta de la petición del
servicio.
Gestión de errores.
En la ejecución de esta llamada hay que distinguir correctamente los códigos de error que genera el servicio de
cancelación de EDICOM y los códigos de validación que devuelve el SAT en el acuse de recibo.
La respuesta errónea del servicio de EDICOM, como se puede ver en el ejemplo anterior, devuelve un objeto
soapenv:Fault en la respuesta del servicio. Este objeto contiene un objeto ns1:cod con el código de error que
proporciona EDICOM para la ejecución del servicio.
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se ha
podido cancelar los UUIDs especificados.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>
<ns1:text>No se ha podido cancelar los UUIDs
especificados.</ns1:text>
</ns1:fault>
<ns2:
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
La respuesta que devuelve el SAT está contenida dentro de la respuesta correcta del servicio de EDICOM. Más
concretamente en el objeto ack dentro del cancelaCFDiReturn. Dentro de este acuse de recibo se encuentran
los códigos de ejecución de la cancelación del comprobante por parte del SAT. Estos códigos de ejecución del
SAT están contemplados en el Anexo 20.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiReturn>
</cancelaCFDiResponse>
</soapenv:Body>
</soapenv:Envelope>
Ambos códigos son totalmente independientes, y no deben confundirse ya que corresponden a códigos de
EDICOM y del SAT respectivamente.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se puede
utilizar este método de cancelación. Está obsoleto porque el SAT ha definido un nuevo
tipo de respuesta.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>
<ns1:text>No se puede utilizar este método de cancelación. Está
obsoleto porque el SAT ha definido un nuevo tipo de respuesta.</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">ED2266</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
changePassword
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi e indicar el
nuevo password para hacer el cambio.
LLAMADA:
public boolean changePassword(String user, String password, String newPassword)
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• newPassword: Nueva contraseña que quiere utilizar el usuario para realizar las conexiones al servicio.
RESPUESTA:
•
Respuesta satisfactoria: En caso de que se haya realizado el cambio correctamente, el servicio
devolverá un resultado correcto (true).
•
Respuesta de error: En caso de que haya algún error en el proceso de cambio de error, el servicio
devolverá una Excepción.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Código del cliente:
Petición SOAP:
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:newPassword>xxxxxx</cfdi:newPassword>
</cfdi:changePassword>
</soapenv:Body>
</soapenv:Envelope>
Respuesta SOAP:
El siguiente ejemplo es una respuesta de cambio de password satisfactorio
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getCfdiTest
Permite realizar el timbrado del comprobante firmado por el cliente en modo de prueba y devuelve el
comprobante timbrado. Se trata de una llamada de TEST para poder hacer pruebas del funcionamiento del
servicio.
Funciona exactamente igual que la función getCfdi, pero en caso de que el CFDI pase todas las validaciones
que implementa el servicio, genera un CFDI con un timbre no válido, y no envía el CFDI al SAT.
La ejecución de esta llamada no tiene en cuenta la limitaciones del servicio en producción para poder ser mas
flexible a la hora de que se hagan las pruebas de conectividad con el webservice final. Validaciones omitidas en
el entorno de TEST:
•
No se tiene en cuenta el documento enviado, por lo que al enviar varias veces el mismo documento se
generan distintos timbres de TEST.
Estas validaciones omitidas permiten que se puedan hacer pruebas de funcionamiento con un juego reducido
de comprobantes firmados sin necesidad de ir generando continuamente comprobantes timbrados.
LLAMADA:
public byte[] getCfdiTest(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• file: Fichero con los datos del comprobante firmados por el usuario. Se trata del XML con la
información del comprobante, según lo especificado en el Anexo 20 de la Resolución Miscelánea
Fiscal vigente [1]. Puede enviarse también comprimido en en formato ZIP. Dentro del mensaje SOAP,
se enviarán los datos del fichero codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
Si el CFDI cumple con las validaciones especificadas anteriormente, se dará respuesta al contribuyente
incorporando un complemento sobre el documento. Este complemento incluye el número de folio asignado por
el SAT, fecha y hora de certificación y sello digital del CFDI. Se adhiere igualmente como parte del complemento
el número de serie del certificado digital del SAT con el que se realizó del certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el CFDI firmado con todos los datos generados.
•
Respuesta de error: En caso de que haya algún error en el proceso de firma digital del CFDI, devolverá
una excepción que contendrá un código de error y un mensaje de texto con el error producido.
Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya autentificado
correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI, o que el CFDI enviado
no es correcto sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de CFDi en test satisfactoria.
<getCfdiTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHTl9zaW5fdGltYnJhcl
9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/
cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/3S5xl2DuomLouXETkmRlhQeKUfF+HLyDK
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getCfdiTestReturn>
</getCfdiTestResponse>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getTimbreCfdiTest
Permite realizar el timbrado del comprobante firmado por el cliente en modo de prueba y devuelve el timbre
del comprobante timbrado. Se trata de una llamada de TEST para poder hacer pruebas del funcionamiento del
servicio.
Funciona exactamente igual que la función getTimbreCfdi, pero en caso de que el CFDI pase todas las
validaciones que implementa el servicio, genera un CFDI con un timbre no válido, y no envía el comprobante al
SAT.
La ejecución de esta llamada no tiene en cuenta la limitaciones del servicio en producción para poder ser mas
flexible a la hora de que se hagan las pruebas de conectividad con el webservice final. Validaciones omitidas en
el entorno de TEST:
•
No se tiene en cuenta el documento enviado, por lo que al enviar varias veces el mismo documento se
generan distintos timbres de TEST.
Estas validaciones omitidas permiten que se puedan hacer pruebas de funcionamiento con un juego reducido
de comprobantes firmados sin necesidad de ir generando continuamente comprobantes timbrados.
LLAMADA:
public byte[] getTimbreCfdiTest(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• file: Fichero con los datos del comprobante firmados por el usuario. Se trata del XML con la información
del comprobante, según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1].
Puede enviarse también comprimido en en formato ZIP. Dentro del mensaje SOAP, se enviarán los datos
del fichero codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
Si el CFDI cumple con las validaciones especificadas anteriormente, se dará respuesta al contribuyente con el
timbre de la firma digital. Este timbre incluye el número de folio asignado por el SAT, fecha y hora de
certificación y sello digital del CFDI. Se adhiere igualmente como parte del complemento el número de serie del
certificado digital del SAT con el que se realizó del certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el timbre del CFDI con todos los datos generados.
•
Respuesta con error: En caso de que haya algún error en el proceso de firma digital del CFDI, devolverá
una excepción que contendrá un código de error y un mensaje de texto con el error producido.
Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya autentificado
correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI, o que el CFDI enviado
no es correcto sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hNTEltcF80Nz
MyMDkueG1sfu1W2ZKjyhF991cQerKjY8SipVsdt+NAgoBzSJWgV4cbALEKkAC6Q/
8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CTokqxQcAAFUSAAqxQcAAFUSAAqxQcAAFUSAA
[...]
JkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS5
4bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==
</cfdi:file>
</cfdi:getTimbreCfdiTest>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de timbre de CFDI en test satisfactoria.
<getTimbreCfdiTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHTl9zaW5fdGlt
YnJhcl9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/
oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/
3S5xl2DuomLouXETkmRlhQeKUfF
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getTimbreCfdiTestReturn>
</getTimbreCfdiTestResponse>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getUUID
Permite comprobar si un comprobante ha sido timbrado previamente y devuelve el UUID del comprobante
timbrado. Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio de CFDi
y enviar el mismo comprobante que se envió previamente a timbrar.
Esta función está destinada a verificar que el timbre se ha generado correctamente, por lo que sólo busca el
comprobante timbrado dentro de las 72 horas siguientes a la generación del timbre. Pasado este tiempo, no se
puede recuperar el UUID del timbre y por tanto no devuelve nada.
En cada llamada se puede enviar un único comprobante para obtener un único UUID.
LLAMADA:
public String getUUID(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• file: Fichero con los datos del comprobante firmados por el usuario. Se trata del XML con la información
del comprobante, según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1].
Puede enviarse también comprimido en en formato ZIP. Dentro del mensaje SOAP, se enviarán los datos
del fichero codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
En caso de que el comprobante haya sido timbrado, devolverá el UUID del comprobante timbrado.
•
Respuesta satisfactoria: En caso de que se haya comprobado que el comprobante se ha timbrado, el
servicio devolverá el UUID del comprobante generado. Si no se ha timbrado el comprobante, devolverá
una cadena de texto en blanco indicando que no hay ningún UUID que se corresponda con el
comprobante enviado.
•
Respuesta con errores: En caso de que haya algún error en el proceso de búsqueda del comprobante
timbrado, devolverá una excepción que contendrá un código de error y un mensaje de texto con el
error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI.
EJEMPLOS
Código del cliente:
CFDIe.printStackTrace();
System.out.println("CFDiExcepcion: " + CFDIe.getText());
} catch (RemoteException Re) {
Re.printStackTrace();
System.out.println("RemoteExcepcion: " + Re.toString());
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception: " + e.toString());
}
return uuid;
}
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta satisfactoria de la obtención de un UUID
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getUUIDResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<getUUIDReturn>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</getUUIDReturn>
</getUUIDResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo de código no son reales.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se ha
podido comprobar el UUID del comprobante.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>202</ns1:cod>
<ns1:text>No se ha podido comprobar el UUID del
comprobante.</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdipr01a</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getUUIDTest
Por la naturaleza del servicio de TEST, en el que se permiten generar distintos timbres de un mismo
comprobante firmado, no se pueden asignar los UUIDs directamente a los ficheros originales ya que un fichero
podría tener varios UUIDs disponibles. Por tanto, la funcionalidad de esta llamada al webservice está limitada
de forma que esta función nunca devolverá un UUID de un timbre de TEST. Esta función está destinada a
verificar que la implementación de la función getUUID funciona correctamente.
En cada llamada se puede enviar un único comprobante para obtener un único UUID.
LLAMADA:
public String getUUIDTest(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• file: Fichero con los datos del comprobante firmados por el usuario. Se trata del XML con la información
del comprobante, según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1].
Puede enviarse también comprimido en en formato ZIP. Dentro del mensaje SOAP, se enviarán los datos
del fichero codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
En caso de que el comprobante haya sido timbrado en el entorno de pruebas, devolverá el UUID del
comprobante timbrado en el entorno de pruebas.
•
Respuesta satisfactoria: En caso de que se haya comprobado que el comprobante se ha timbrado en el
entorno de pruebas, el servicio devolverá el UUID del comprobante generado en el entorno de
pruebas. Si no se ha timbrado el comprobante en el entorno de pruebas, devolverá una cadena de
texto en blanco indicando que no hay ningún UUID que se corresponda con el comprobante enviado.
•
Respuesta con errores: En caso de que haya algún error en el proceso de búsqueda del comprobante
timbrado en el entorno de pruebas, devolverá una excepción que contendrá un código de error y un
mensaje de texto con el error producido. Ejemplos de este tipo de excepciones sería por ejemplo que
el usuario no se haya autentificado correctamente en el sistema, o que no se haya enviado el fichero
ZIP con el CFDI.
EJEMPLOS
Código del cliente:
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta satisfactoria. Se obtiene el UUID de pruebas.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getUUIDTestResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<getUUIDTestReturn>13EDFE98-7E57-4455-9C31-6661C4A5A71D</getUUIDTestReturn>
</getUUIDTestResponse>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se ha
podido comprobar el UUID del comprobante.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>202</ns1:cod>
<ns1:text>No se ha podido comprobar el UUID del
comprobante.</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdipr01a</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
cancelaCFDiSigned
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi. En este caso,
el cliente tiene que implementar la petición de cancelación de los timbres que quieren cancelar y firmarla. Esta
petición firmada se envía directamente al webservice para que genere la petición de cancelación a partir de
esos datos firmados.
Importante: Esta llamada dejará de estar vigente el día 1 de noviembre de 2018 porque
el SAT ha modificado la forma en que se tienen que cancelar los comprobantes.
LLAMADA:
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• sign: Petición de cancelación firmada por el propio cliente. Dentro del mensaje SOAP, se enviarán los
datos de la cancelación codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la cancelación Satisfactoria de los
comprobantes, el servicio devolverá un listado de datos derivados de la cancelación:
• ack: Confirmación que devuelve el servicio del SAT como que la petición se ha realizado. Está
codificado en base 64 y contiene el acuse de recibo expedido por el SAT para la cancelación.
Una vez decodificado, este acuse contiene el xml con la información de la petición de
cancelación solicitada al SAT por parte de EDICOM, incluyendo los códigos de ejecución del
servicio por parte del SAT especificados en el Anexo 20.
• Respuesta con errores: En caso de que haya algún error en el proceso de cancelación de los CFDI,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el certificado del usuario.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Código del cliente:
}return cancelaResponse;
}
Petición SOAP:
<cfdi:sign>PENhbmNlbGFjaW9uIEZlY2hhPSIyMDExLTA3LTEzVDE3OjIzOjQ0LjU4OVoiIFJmY0VtaX
Nvcj0iWlVOMTAwNjIzNjYzIiB4bWxucz0iaHR0cDovL2NhbmNlbGFjZmQuc2F0LmdvYi5teCIgeG1sbnM
6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHR[...]
rS3FtdU1vTU9QaVcyYWQ1cEF3UlpKL0JBcmMrODBqTWNWZ1VkNEtSdVdMOG4vc05jNUhsTEd5Q3RvMTRZ
UXhHUDkwdkNiV2xlUT09PC9YNTA5Q2VydGlmaWNhdGU+PC9YNTA5RGF0YT48L0tleUluZm8+PC9TaWduY
XR1cmU+PC9DYW5jZWxhY2lvbj4=</cfdi:sign>
</cfdi:cancelaCFDiSigned>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
Ejemplo de una respuesta de cancelación de CFDI firmada satisfactoria.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiSignedReturn>
</cancelaCFDiSignedResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Para ver una lista completa de los posibles códigos de error y respuestas asociadas
consultar el punto Lista de Códigos de Error.
CONSIDERACIONES IMPORTANTES
Por defecto, los clientes de webservice suelen tener un timeout de 30 segundos, que puede llegar a ser
insuficiente para la correcta ejecución de esta función. Se recomienda utilizar para esta llamada un timeout no
inferior a 2 minutos para evitar que venza la llamada por timeout y se pierda la respuesta de la petición del
servicio.
Gestión de errores.
En la ejecución de esta llamada hay que distinguir correctamente los códigos de error que genera el servicio de
cancelación de EDICOM y los códigos de validación que devuelve el SAT en el acuse de recibo.
La respuesta errónea del servicio de EDICOM, como se puede ver en el ejemplo anterior, devuelve un objeto
soapenv:Fault en la respuesta del servicio. Este objeto contiene un objeto ns1:cod con el código de error que
proporciona EDICOM para la ejecución del servicio.
La respuesta que devuelve el SAT está contenida dentro de la respuesta correcta del servicio de EDICOM. Más
concretamente en el objeto ack dentro del cancelaCFDiReturn. Dentro de este acuse de recibo se encuentran
los códigos de ejecución de la cancelación del comprobante por parte del SAT. Estos códigos de ejecución del
SAT están contemplados en el Anexo 20.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiReturn>
</cancelaCFDiResponse>
</soapenv:Body>
</soapenv:Envelope>
Ambos códigos son totalmente independientes, y no deben confundirse ya que corresponden a códigos de
EDICOM y del SAT respectivamente.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se puede
utilizar este método de cancelación. Está obsoleto porque el SAT ha definido un nuevo
tipo de respuesta.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>
getCfdiAck
Permite obtener el acuse (Acknowledge o ACK.) generado por el SAT en el momento de timbrar el comprobante.
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio de CFDi y
especificar cuales son los UUIDs de los que quiere obtener el ACK. de los timbrados.
LLAMADA:
public byte[] getCfdiAck(String user, String password, String[] uuid);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la petición correcta, el servicio devolverá un
fichero comprimido en formato ZIP con los distintos ACKs de los UUIDs pertenecientes al usuario que
se hayan especificado en la petición.
• Respuesta con errores: En caso de que haya algún error en el proceso de obtención de los ACKs,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado ningún UUID en la petición.
EJEMPLOS
Código del cliente:
Petición SOAP:
Respuesta SOAP:
El siguiente ejemplo es una respuesta de obtención de ACKs satisfactoria.
<getCfdiAckReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9PS18xLlh
NTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getCfdiAckReturn>
</getCfdiAckResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Nota: Para ver una lista completa de los posibles códigos de error y respuestas asociadas
consultar el punto Lista de Códigos de Error.
GetCfdiFromUUID
Permite obtener comprobante timbrado anteriormente. Para poder implementar la llamada, el usuario debe
autentificarse como usuario del servicio de CFDi y especificar su RFC y los UUIDs de los comprobantes timbrados
que quiere recuperar.
LLAMADA:
public byte[] getCfdiFromUUID(String user, String password, String rfc,
String[] uuid);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• uuid: Listado de UUIDs de los que se quieren obtener los comprobantes timbrados.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la petición correcta, el servicio devolverá un
fichero comprimido en formato ZIP con los comprobantes timbrados de los UUIDs pertenecientes al
usuario que se hayan especificado en la petición.
• Respuesta con errores: En caso de que haya algún error en el proceso de obtención de los
comprobantes timbrados, devolverá una excepción que contendrá un código de error y un mensaje de
texto con el error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario
no se haya autentificado correctamente en el sistema, o que no se haya enviado ningún UUID en la
petición.
EJEMPLOS
Código del cliente:
Petición SOAP:
Respuesta SOAP:
El siguiente ejemplo es una respuesta de obtención de los comprobantes timbrados satisfactoria.
<getCfdiFromUUIDReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9PS1
8xLlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getCfdiFromUUIDReturn>
</getCfdiFromUUIDResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se ha
podido obtener el comprobante de los UUIDs enviados.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>203</ns1:cod>
<ns1:text>No se ha podido obtener el comprobante de los UUIDs
enviados.</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Nota: Para ver una lista completa de los posibles códigos de error y respuestas asociadas
consultar el punto Lista de Códigos de Error.
getCfdiRetenciones
Permite realizar el timbrado del comprobante de retenciones electrónicas firmado por el cliente y devuelve el
comprobante de retenciones electrónicas timbrado. Para poder implementar la llamada, el usuario debe
autentificarse como usuario del servicio de CFDi y especificar cuales son los datos del comprobante de
retenciones electrónicas para poder generar así la firma digital.
LLAMADA:
public byte[] getCfdiRetenciones(String user, String password, byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• file: Fichero con los datos del comprobante de retenciones electrónicas firmados por el usuario. Se trata
del XML con la información del comprobante. Puede enviarse también comprimido en en formato ZIP.
Dentro del mensaje SOAP, se enviarán los datos del fichero codificados en Base64 dentro del sobre de la
llamada SOAP.
RESPUESTA:
El comprobante que se enviará al webservice es un XML que contiene la información de la factura, e integra el
certificado del contribuyente expedido por el SAT, empleado en la construcción del “Sello Digital del
Comprobante”, según lo especificado en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1] .
Edicom, como PSECFDI recibe a través del webservice el Comprobante del contribuyente para realizar todas las
validaciones exigidas por el SAT y someterlo posteriormente al proceso de certificación final.
• Verifica que el período de tiempo entre la fecha de envío del documento y la de recepción del
documento para su certificación no exceda de 72 horas.
• Verifica igualmente que el documento no haya sido certificado previamente, que el Certificado de
Sello Digital (CSD) del contribuyente esté vigente en la fecha de generación del comprobante, y que
efectivamente corresponda dicho CSD al contribuyente que emite el documento.
• Finalmente constata que la estructura del documento cumple con las especificaciones técnicas
conforme a la Resolución Miscelánea Fiscal vigente y sucesivas modificaciones.
Si el CFDI de retenciones electrónicas cumple con las validaciones especificadas anteriormente, se dará
respuesta al contribuyente incorporando un complemento sobre el documento según lo especificado en el
Anexo 20 de la Resolución Miscelánea Fiscal vigente [1]. Este complemento incluye el número de folio asignado
por el SAT, fecha y hora de certificación y sello digital del CFDI de retenciones electrónicas. Se adhiere
igualmente como parte del complemento el número de serie del certificado digital del SAT con el que se realizó
del certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el CFDI de retenciones electrónicas con todos los datos
generados.
•
Respuesta con errores: En caso de que haya algún error en el proceso de firma digital del CFDI de
retenciones electrónicas, devolverá una excepción que contendrá un código de error y un mensaje de
texto con el error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no
se haya autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI
de retenciones electrónicas, o que el CFDI de retenciones electrónicas enviado no es correcto
sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
}
}
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de un envío de CFDI de retenciones electrónicas satisfactorio.
<getCfdiRetencionesReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9
PS18xLlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getCfdiRetencionesReturn>
</getCfdiRetencionesResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Nota: En este ejemplo concreto se presenta un error "301" indicando que el documento
no está codificado en UTF-8.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getTimbreCfdiRetenciones
Permite realizar el timbrado del comprobante de retenciones electrónicas firmado por el cliente y devuelve el
timbre del comprobante de retenciones electrónicas timbrado. Para poder implementar la llamada, el usuario
debe autentificarse como usuario del servicio de CFDi y especificar cuales son los datos del comprobante para
poder generar así la firma digital.
LLAMADA:
public byte[] getTimbreCfdiRetenciones(String user, String password, byte[]
file);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• file: Fichero con los datos del comprobante de retenciones electrónicas firmados por el usuario. Se trata
del XML con la información del comprobante de retenciones electrónicas, según lo especificado en el
Anexo 20 de la Resolución Miscelánea Fiscal vigente [1]. Puede enviarse también comprimido en en
formato ZIP. Dentro del mensaje SOAP, se enviarán los datos del fichero codificados en Base64 dentro del
sobre de la llamada SOAP.
RESPUESTA:
El comprobante de retenciones electrónicas que se enviará al webservice es un XML que contiene la
información de la factura, e integra el certificado del contribuyente expedido por el SAT, empleado en la
construcción del “Sello Digital del Comprobante” según lo especificado en el Anexo 20 de la Resolución
Miscelánea Fiscal vigente [1] .
Edicom, como PSECFDI recibe a través del webservice el Comprobante de retenciones electrónicas del
contribuyente para realizar todas las validaciones exigidas por el SAT y someterlo posteriormente al proceso de
certificación final.
• Verifica que el período de tiempo entre la fecha de envío del documento y la de recepción del
documento para su certificación no exceda de 72 horas.
• Verifica igualmente que el documento no haya sido certificado previamente, que el Certificado de
Sello Digital (CSD) del contribuyente esté vigente en la fecha de generación del comprobante, y que
efectivamente corresponda dicho CSD al contribuyente que emite el documento.
• Finalmente constata que la estructura del documento cumple con las especificaciones técnicas
conforme a la Resolución Miscelánea Fiscal vigente y sucesivas modificaciones.
Si el CFDI de retenciones electrónicas cumple con las validaciones especificadas anteriormente, se dará
respuesta al contribuyente con el timbre de la firma digital según lo especificado en el Anexo 20 de la
Resolución Miscelánea Fiscal vigente [1]. Este timbre incluye el número de folio asignado por el SAT, fecha y
hora de certificación y sello digital del CFDI. Se adhiere igualmente como parte del complemento el número de
serie del certificado digital del SAT con el que se realizó del certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el timbre del CFDI de retenciones electrónicas firmado con
todos los datos generados.
•
Respuesta con errores: En caso de que haya algún error en el proceso de firma digital del CFDI de
retenciones electrónicas, devolverá una excepción que contendrá un código de error y un mensaje de
texto con el error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no
se haya autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI
de retenciones electrónicas, o que el CFDI de retenciones electrónicas enviado no es correcto
sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getTimbreCfdiRetenciones>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de timbre satisfactoria.
<getTimbreCfdiRetencionesReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9Ga
XJtYV9PS18xLlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getTimbreCfdiRetencionesReturn>
</getTimbreCfdiRetencionesResponse>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getCfdiRetencionesTest
Permite realizar el timbrado del comprobante de retenciones electrónicas firmado por el cliente en modo de
prueba y devuelve el comprobante timbrado. Se trata de una llamada de TEST para poder hacer pruebas del
funcionamiento del servicio.
Funciona exactamente igual que la función getCfdiRetenciones, pero en caso de que el CFDI de
retenciones electrónicas pase todas las validaciones que implementa el servicio, genera un CFDI de retenciones
electrónicas con un timbre no válido, y no envía el CFDI de retenciones electrónicas al SAT.
La ejecución de esta llamada no tiene en cuenta la limitaciones del servicio en producción para poder ser mas
flexible a la hora de que se hagan las pruebas de conectividad con el webservice final. Validaciones omitidas en
el entorno de TEST:
•
No se tiene en cuenta el documento enviado, por lo que al enviar varias veces el mismo documento se
generan distintos timbres de TEST.
Estas validaciones omitidas permiten que se puedan hacer pruebas de funcionamiento con un juego reducido
de comprobantes firmados sin necesidad de ir generando continuamente comprobantes timbrados.
LLAMADA:
public byte[] getCfdiRetencionesTest(String user, String password, byte[]
file);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• file: Fichero con los datos del comprobante de retenciones electrónicas firmados por el usuario. Se
trata del XML con la información del comprobante de retenciones electrónicas, según lo especificado
en el Anexo 20 de la Resolución Miscelánea Fiscal vigente [1]. Puede enviarse también comprimido en
en formato ZIP. Dentro del mensaje SOAP, se enviarán los datos del fichero codificados en Base64
dentro del sobre de la llamada SOAP.
RESPUESTA:
Si el CFDI de retenciones electrónicas cumple con las validaciones especificadas anteriormente, se dará
respuesta al contribuyente incorporando un complemento sobre el documento. Este complemento incluye el
número de folio asignado por el SAT, fecha y hora de certificación y sello digital del CFDI. Se adhiere igualmente
como parte del complemento el número de serie del certificado digital del SAT con el que se realizó del
certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el CFDI de retenciones electrónicas firmado con todos los
datos generados.
•
Respuesta de error: En caso de que haya algún error en el proceso de firma digital del CFDI de
retenciones electrónicas, devolverá una excepción que contendrá un código de error y un mensaje de
texto con el error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no
se haya autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI
de retenciones electrónicas, o que el CFDI de retenciones electrónicas enviado no es correcto
sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]
LPx2hwQfDj8YH5NQX5OlHyLeJYKNmrPNa1C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getCfdiRetencionesTest>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de CFDi en test satisfactoria.
<getCfdiRetencionesTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHTl9zaW5
fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/
oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/
3S5xl2DuomLouXETkmRlhQeKUfF+HLyDK
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getCfdiRetencionesTestReturn>
</getCfdiRetencionesTestResponse>
</soapenv:Body>
</soapenv:Envelope>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: El
certificado <> no ha sido expedido por el Servicio de Administración
Tributaria</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>308</ns1:cod>
<ns1:text>El certificado <> no ha sido expedido por el Servicio
de Administración Tributaria</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
getTimbreCfdiRetencionesTest
Permite realizar el timbrado del comprobante de retenciones electrónicas firmado por el cliente en modo de
prueba y devuelve el timbre del comprobante de retenciones electrónicas timbrado. Se trata de una llamada de
TEST para poder hacer pruebas del funcionamiento del servicio.
Funciona exactamente igual que la función getTimbreCfdiRetenciones, pero en caso de que el CFDI de
retenciones electrónicas pase todas las validaciones que implementa el servicio, genera un CFDI de retenciones
electrónicas con un timbre no válido, y no envía el comprobante de retenciones electrónicas al SAT.
La ejecución de esta llamada no tiene en cuenta la limitaciones del servicio en producción para poder ser mas
flexible a la hora de que se hagan las pruebas de conectividad con el webservice final. Validaciones omitidas en
el entorno de TEST:
•
No se tiene en cuenta el documento enviado, por lo que al enviar varias veces el mismo documento se
generan distintos timbres de TEST.
Estas validaciones omitidas permiten que se puedan hacer pruebas de funcionamiento con un juego reducido
de comprobantes firmados sin necesidad de ir generando continuamente comprobantes timbrados.
LLAMADA:
public byte[] getTimbreCfdiRetencionesTest(String user, String password,
byte[] file);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• file: Fichero con los datos del comprobante de retenciones electrónicas firmados por el usuario. Se trata
del XML con la información del comprobante de retenciones electrónicas, según lo especificado en el
Anexo 20 de la Resolución Miscelánea Fiscal vigente [1]. Puede enviarse también comprimido en en
formato ZIP. Dentro del mensaje SOAP, se enviarán los datos del fichero codificados en Base64 dentro del
sobre de la llamada SOAP.
RESPUESTA:
Si el CFDI de retenciones electrónicas cumple con las validaciones especificadas anteriormente, se dará
respuesta al contribuyente con el timbre de la firma digital. Este timbre incluye el número de folio asignado por
el SAT, fecha y hora de certificación y sello digital del CFDI de retenciones electrónicas. Se adhiere igualmente
como parte del complemento el número de serie del certificado digital del SAT con el que se realizó del
certificación del CFDI, y el sello del SAT.
•
Respuesta satisfactoria: En caso de que se haya realizado la firma digital, el servicio devolverá un
documento comprimido en formato ZIP con el timbre del CFDI de retenciones electrónicas con todos
los datos generados.
•
Respuesta con error: En caso de que haya algún error en el proceso de firma digital del CFDI de
retenciones electrónicas, devolverá una excepción que contendrá un código de error y un mensaje de
texto con el error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no
se haya autentificado correctamente en el sistema, o que no se haya enviado el fichero ZIP con el CFDI
de retenciones electrónicas, o que el CFDI de retenciones electrónicas enviado no es correcto
sintácticamente según el esquema del SAT.
EJEMPLOS
Código del cliente:
Petición SOAP:
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hNTEltcF80Nz
MyMDkueG1sfu1W2ZKjyhF991cQerKjY8SipVsdt+NAgoBzSJWgV4cbALEKkAC6Q/
8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CTokqxQcAAFUSAAqxQcAAFUSAAqxQcAAFUSAA
[...]
JkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS5
4bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==
</cfdi:file>
</cfdi:getTimbreCfdiRetencionesTest>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de timbre de CFDI de retenciones electrónicas en test
satisfactoria.
<getTimbreCfdiRetencionesTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHT
l9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/
oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/
3S5xl2DuomLouXETkmRlhQeKUfF
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getTimbreCfdiRetencionesTestReturn>
</getTimbreCfdiRetencionesTestResponse>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
cancelaCFDiRetenciones
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi y especificar
cuales son los comprobantes de retenciones electrónicas que quiere cancelar mediante los UUIDs de los
comprobantes firmados digitalmente.
LLAMADA:
public CancelaResponse cancelaCFDiRetenciones(String user, String password,
String rfc, String[] uuid, byte[] pfx, String pfxPassword, String motivo, String
sustitucion);
PARÁMETROS:
• user: Usuario que va realizar la conexión
• uuid: Lista de uuids que identifican los CFDI de retenciones electrónicas que quiere cancelar el usuario.
• pfx: Certificado del cliente que quiere cancelar los CFDI. Dentro del mensaje SOAP, se enviarán los datos
del fichero pfx codificados en Base64 dentro del sobre de la llamada SOAP.
• pxfPassword: Password del certificado para poder realizar la firma de la petición con el certificado del
usuario.
• motivo: Código correspondiente al motivo de cancelación según catálogo del SAT (01 – Comprobante
emitido con errores con relación, 02 – Comprobante emitido con errores sin relación, 03 – No se llevó a
cabo la operación, 04 – Operación nominativa relacionada en una factura global).
• sustitucion: UUID del documento relacionado; aplica cuando se utiliza el motivo 01.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la cancelación Satisfactoria de los
comprobantes, el servicio devolverá un listado de datos derivados de la cancelación:
• ack: Confirmación que devuelve el servicio del SAT como que la petición se ha realizado. Está
codificado en base 64 y contiene el acuse de recibo expedido por el SAT para la cancelación.
Una vez decodificado, este acuse contiene el xml con la información de la petición de
cancelación solicitada al SAT por parte de EDICOM, incluyendo los códigos de ejecución del
servicio por parte del SAT especificados en el Anexo 20.
• Respuesta con errores: En caso de que haya algún error en el proceso de cancelación de los
comprobantes de retenciones electrónicas, devolverá una excepción que contendrá un código de
error y un mensaje de texto con el error producido. Ejemplos de este tipo de excepciones sería por
ejemplo que el usuario no se haya autentificado correctamente en el sistema, o que no se haya
enviado el certificado del usuario.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Código del cliente:
Petición SOAP:
<cfdi:pfx>MIIJuQIBAzCCCX8GCSqGSIb3DQEHAaCCCXAEgglsMIIJaDCCBB8GCSqGSIb3DQEHBqCCBBA
wggQMAgEAMIIEBQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIkI0BwQTfWEQCAggAgIID2DzPnHdO
A4XWGeanHoCuRitvCJJecEBSkqvg8ohliY7IiVp8qF3agvOqt32kbEDXHfrLpVVhlPnjrZo4
[...]
Hzl11kfETcJiuMUNa5hOx5CiB2WqAg/
tV9MDOdUZEkN4E+N9xxSxPAkSw75RvvVfRPW4JFXbmfs7c230aPodMQP58PfaJilI/
Nm8cvAQXIEwRugMSUwIwYJKoZIhvcNAQkVMRYEFBlCuYgPj26y+M2HK9s6Tpe2JmgCMDEwITAJBgUrDgM
CGgUABBSz8OKBcbpiR69Tw0UJ1d1D2xW0EQQIar9uSxM7uToCAggA</cfdi:pfx>
<cfdi:pfxPassword>qwertyuio</cfdi:pfxPassword>
<cfdi:motivo>01</cfdi:motivo>
<cfdi:sustitucion>UUID</cfdi:sustitucion>
</cfdi:cancelaCFDiRetenciones>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
Ejemplo de una respuesta de cancelación de comprobantes de retenciones electrónicas satisfactoria.
<cancelaCFDiRetencionesResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiRetencionesReturn>
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiRetencionesReturn>
</cancelaCFDiRetencionesResponse>
</soapenv:Body>
</soapenv:Envelope>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
CONSIDERACIONES IMPORTANTES
Timeout de la llamada de esta función
Hay que tener en cuenta que el proceso de cancelación depende directamente del proceso de cancelación del
SAT. Por tanto, el tiempo de respuesta de esta función no depende del servicio de cancelación de EDICOM, sino
que depende directamente del tiempo de proceso de los servidores del SAT. Este proceso no es tan inmediato
como el tiempo de generación del timbrado, por lo que es necesario que se utilice un timeout considerable para
estas peticiones de cancelación.
Por defecto, los clientes de webservice suelen tener un timeout de 30 segundos, que puede llegar a ser
insuficiente para la correcta ejecución de esta función. Se recomienda utilizar para esta llamada un timeout no
inferior a 2 minutos para evitar que venza la llamada por timeout y se pierda la respuesta de la petición del
servicio.
Gestión de errores.
En la ejecución de esta llamada hay que distinguir correctamente los códigos de error que genera el servicio de
cancelación de EDICOM y los códigos de validación que devuelve el SAT en el acuse de recibo.
La respuesta errónea del servicio de EDICOM, como se puede ver en el ejemplo anterior, devuelve un objeto
soapenv:Fault en la respuesta del servicio. Este objeto contiene un objeto ns1:cod con el código de error que
proporciona EDICOM para la ejecución del servicio.
</soapenv:Body>
</soapenv:Envelope>
La respuesta que devuelve el SAT está contenida dentro de la respuesta correcta del servicio de EDICOM. Más
concretamente en el objeto ack dentro del cancelaCFDiReturn. Dentro de este acuse de recibo se encuentran
los códigos de ejecución de la cancelación del comprobante por parte del SAT. Estos códigos de ejecución del
SAT están contemplados en el Anexo 20.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiRetencionesReturn>
</cancelaCFDiRetencionesResponse>
</soapenv:Body>
</soapenv:Envelope>
Ambos códigos son totalmente independientes, y no deben confundirse ya que corresponden a códigos de
EDICOM y del SAT respectivamente.
cancelaCFDiRetencionesSigned
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi. En este caso,
el cliente tiene que implementar la petición de cancelación de los comprobantes de retenciones electrónicas
timbrados que quieren cancelar y firmarla. Esta petición firmada se envía directamente al webservice para que
genere la petición de cancelación a partir de esos datos firmados
LLAMADA:
public CancelaResponse cancelaCFDiRetencionesSigned(String user, String
password, byte[] sign);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la cancelación satisfactoria de los
comprobantes, el servicio devolverá un listado de datos derivados de la cancelación:
• ack: Confirmación que devuelve el servicio del SAT como que la petición se ha realizado. Está
codificado en base 64 y contiene el acuse de recibo expedido por el SAT para la cancelación.
Una vez decodificado, este acuse contiene el xml con la información de la petición de
cancelación solicitada al SAT por parte de EDICOM, incluyendo los códigos de ejecución del
servicio por parte del SAT especificados en el Anexo 20.
• Respuesta con errores: En caso de que haya algún error en el proceso de cancelación de los
comprobantes de retenciones electrónicas, devolverá una excepción que contendrá un código de
error y un mensaje de texto con el error producido. Ejemplos de este tipo de excepciones sería por
ejemplo que el usuario no se haya autentificado correctamente en el sistema, o que no se haya
enviado el certificado del usuario.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Petición SOAP:
<cfdi:sign>PENhbmNlbGFjaW9uIEZlY2hhPSIyMDExLTA3LTEzVDE3OjIzOjQ0LjU4OVoiIFJmY0VtaX
Nvcj0iWlVOMTAwNjIzNjYzIiB4bWxucz0iaHR0cDovL2NhbmNlbGFjZmQuc2F0LmdvYi5teCIgeG1sbnM
6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHR[...]
rS3FtdU1vTU9QaVcyYWQ1cEF3UlpKL0JBcmMrODBqTWNWZ1VkNEtSdVdMOG4vc05jNUhsTEd5Q3RvMTRZ
UXhHUDkwdkNiV2xlUT09PC9YNTA5Q2VydGlmaWNhdGU+PC9YNTA5RGF0YT48L0tleUluZm8+PC9TaWduY
XR1cmU+PC9DYW5jZWxhY2lvbj4=</cfdi:sign>
</cfdi:cancelaCFDiRetencionesSigned>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
Ejemplo de una respuesta de cancelación de comprobantes de retenciones electrónicas firmada satisfactoria.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiRetencionesSignedReturn>
</cancelaCFDiRetencionesSignedResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Para ver una lista completa de los posibles códigos de error y respuestas asociadas
consultar el punto Lista de Códigos de Error.
CONSIDERACIONES IMPORTANTES
Timeout de la llamada de esta función
Hay que tener en cuenta que el proceso de cancelación depende directamente del proceso de cancelación del
SAT. Por tanto, el tiempo de respuesta de esta función no depende del servicio de cancelación de EDICOM, sino
que depende directamente del tiempo de proceso de los servidores del SAT. Este proceso no es tan inmediato
como e tiempo de generación del timbrado, por lo que es necesario que se utilice un timeout considerable para
estas peticiones de cancelación.
Por defecto, los clientes de webservice suelen tener un timeout de 30 segundos, que puede llegar a ser
insuficiente para la correcta ejecución de esta función. Se recomienda utilizar para esta llamada un timeout no
inferior a 2 minutos para evitar que venza la llamada por timeout y se pierda la respuesta de la petición del
servicio.
Gestión de errores.
En la ejecución de esta llamada hay que distinguir correctamente los códigos de error que genera el servicio de
cancelación de EDICOM y los códigos de validación que devuelve el SAT en el acuse de recibo.
La respuesta errónea del servicio de EDICOM, como se puede ver en el ejemplo anterior, devuelve un objeto
soapenv:Fault en la respuesta del servicio. Este objeto contiene un objeto ns1:cod con el código de error que
proporciona EDICOM para la ejecución del servicio.
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>
<ns1:text>No se ha podido cancelar los UUIDs
especificados.</ns1:text>
</ns1:fault>
<ns2:
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
La respuesta que devuelve el SAT está contenida dentro de la respuesta correcta del servicio de EDICOM. Más
concretamente en el objeto ack dentro del cancelaCFDiReturn. Dentro de este acuse de recibo se encuentran
los códigos de ejecución de la cancelación del comprobante por parte del SAT. Estos códigos de ejecución del
SAT están contemplados en el Anexo 20.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q
[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiRetencionesSignedReturn>
</cancelaCFDiRetencionesSignedResponse>
</soapenv:Body>
</soapenv:Envelope>
Ambos códigos son totalmente independientes, y no deben confundirse ya que corresponden a códigos de
EDICOM y del SAT respectivamente.
cancelCFDiAsync
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi y especificar
el comprobante que quiere cancelar mediante el UUID, el RFC del emisor, el RFC del receptor y el importe del
comprobante firmado digitalmente. Esto implica que sólo se podrá cancelar un comprobante en cada petición.
Puesto que la cancelación es asíncrona, lo normal es que tras la petición el comprobante no quede cancelado
directamente. Se podrá consultar el estado de la cancelación más tarde.
La petición de cancelación incluye la cancelación y una primera consulta para saber en qué estado está el
comprobante. La respuesta del servicio incluirá los datos de la cancelación y de la consulta para obtener el
estado final de la cancelación.
LLAMADA:
public CancelData cancelCFDiAsync(String user, String password, String rfcE,
String rfcR, String uuid, Double total, byte[] pfx, String pfxPassword, String
motivo, String sustitucion, boolean test);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• pfx: Certificado del cliente que quiere cancelar los CFDI. Dentro del mensaje SOAP, se enviarán los datos
del fichero pfx codificados en Base64 dentro del sobre de la llamada SOAP.
• pfxPassword: Password del certificado para poder realizar la firma de la petición con el certificado del
usuario.
• motivo: Código correspondiente al motivo de cancelación según catálogo del SAT (01 – Comprobante
emitido con errores con relación, 02 – Comprobante emitido con errores sin relación, 03 – No se llevó a
cabo la operación, 04 – Operación nominativa relacionada en una factura global).
• sustitucion: UUID del documento relacionado; aplica cuando se utiliza el motivo 01.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la cancelación satisfactoria de los
comprobantes, el servicio devolverá un listado de datos derivados de la cancelación:
• ack: Confirmación que devuelve el servicio del SAT como que la petición se ha realizado. Está
codificado en base 64 y contiene el acuse de recibo expedido por el SAT para la cancelación.
Una vez decodificado, este acuse contiene el xml con la información de la petición de
cancelación solicitada al SAT por parte de EDICOM, incluyendo los códigos de ejecución del
servicio por parte del SAT especificados en el Anexo 20.
• Respuesta con errores: En caso de que haya algún error en el proceso de cancelación de los CFDI,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el certificado del usuario.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Código del cliente:
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
Ejemplo de una respuesta de cancelación de CFDI asíncrona satisfactoria.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<cancelCFDiAsyncResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelCFDiAsyncReturn>
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<cancelQueryData>
<cancelStatus>En proceso</cancelStatus>
<isCancelable>Cancelable con aceptación</isCancelable>
<status>Vigente</status>
<statusCode>S- Comprobante obtenido
satisfactoriamente.</statusCode>
</cancelQueryData>
<rfcE>RFCE</rfcE>
<status>En proceso</status>
<statusCode>201 - UUID Cancelado</statusCode>
<uuid>UUID1</uuid>
</cancelCFDiAsyncReturn>
</cancelCFDiAsyncResponse>
</soapenv:Body>
</soapenv:Envelope>
<ns2:
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
CONSIDERACIONES IMPORTANTES
Llamada asíncrona
La cancelación ahora se hace de forma asíncrona en el SAT, por lo qe se reduce considerablemente el tiempo de
respuesta respecto de la cancelación anterior.
Puesto que la cancelación es asíncrona, lo más normal es que al ejecutar el servicio de cancelación asíncrona no
se cancele el comprobante inmediatamente. Para saber cuando se ha cancelado totalmente existe la llamada
getCFDiStatus que permite consultar el estado de un comprobante en cualquier momento.
Gestión de errores.
En la ejecución de esta llamada hay que distinguir correctamente los códigos de error que genera el servicio de
cancelación de EDICOM y los códigos de validación que devuelve el SAT en el acuse de recibo.
La respuesta errónea del servicio de EDICOM, como se puede ver en el ejemplo anterior, devuelve un objeto
soapenv:Fault en la respuesta del servicio. Este objeto contiene un objeto ns1:cod con el código de error que
proporciona EDICOM para la ejecución del servicio.
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
La respuesta que devuelve el SAT está contenida dentro de la respuesta correcta del servicio de EDICOM. El
objeto ack dentro del cancelaCFDiAsyncReturn contiene esta información. Dentro de este acuse de recibo se
encuentran los códigos de ejecución de la cancelación del comprobante por parte del SAT. Estos códigos de
ejecución del SAT están contemplados en el Anexo 20.
Además de estos datos, podemos ver el estado de la cancaelación, y el resultado de la consulta del estado del
comprobante donde realmente nos dirá si el comprobante está cancelado o no.
cancelCFDiSignedAsync
Permite cancelar comprobantes timbrados de forma asíncrona mediante la petición firmada por parte del
usuario.
Para poder implementar la llamada, el usuario debe autentificarse como usuario del servicio CFDi y especificar
el comprobante que quiere cancelar mediante el UUID, el RFC del emisor, el RFC del receptor y el importe del
comprobante firmado digitalmente. Esto implica que sólo se podrá cancelar un comprobante en cada petición.
Puesto que la cancelación es asíncrona, lo normal es que tras la petición el comprobante no quede cancelado
directamente. Se podrá consultar el estado de la cancelación más tarde.
La petición de cancelación incluye la cancelación y una primera consulta para saber en que estado está el
comprobante. La respuesta del servicio incluirá los datos de la cancelación y de la consulta para obtener el
estado final de la cancelación.
LLAMADA:
public CancelData cancelCFDiSignedAsync(String user, String password, byte[]
sign, String rfcE, String rfcR, String uuid, Double total, boolean test);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
• sign: Petición de cancelación firmada por el propio cliente. Dentro del mensaje SOAP, se enviarán los
datos de la cancelación codificados en Base64 dentro del sobre de la llamada SOAP.
RESPUESTA:
• Respuesta satisfactoria: En caso de que se haya realizado la cancelación satisfactoria de los
comprobantes, el servicio devolverá un listado de datos derivados de la cancelación:
• ack: Confirmación que devuelve el servicio del SAT como que la petición se ha realizado. Está
codificado en base 64 y contiene el acuse de recibo expedido por el SAT para la cancelación.
Una vez decodificado, este acuse contiene el xml con la información de la petición de
cancelación solicitada al SAT por parte de EDICOM, incluyendo los códigos de ejecución del
servicio por parte del SAT especificados en el Anexo 20.
• Respuesta con errores: En caso de que haya algún error en el proceso de cancelación de los CFDI,
devolverá una excepción que contendrá un código de error y un mensaje de texto con el error
producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que no se haya enviado el certificado del usuario.
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
EJEMPLOS
Código del cliente:
Petición SOAP:
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
Ejemplo de una respuesta de cancelación de CFDI asíncrona firmada satisfactoria.
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<cancelCFDiSignedAsyncResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelCFDiSignedAsyncReturn>
<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<cancelQueryData>
<cancelStatus>En proceso</cancelStatus>
<isCancelable>Cancelable con aceptación</isCancelable>
<status>Vigente</status>
<statusCode>S- Comprobante obtenido
satisfactoriamente.</statusCode>
</cancelQueryData>
<rfcE>RFCE</rfcE>
<status>En proceso</status>
<statusCode>201 - UUID Cancelado</statusCode>
<uuid>UUID1</uuid>
</cancelCFDiSignedAsyncReturn>
</cancelCFDiSignedAsyncResponse>
</soapenv:Body>
</soapenv:Envelope>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>
<ns1:text>No se ha podido cancelar el comprobante.</ns1:text>
</ns1:fault>
<ns2:
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
CONSIDERACIONES IMPORTANTES
Llamada asíncrona
La cancelación ahora se hace de forma asíncrona en el SAT, por lo qe se reduce considerablemente el tiempo de
respuesta respecto de la cancelación anterior.
Puesto que la cancelación es asíncrona, lo más normal es que al ejecutar el servicio de cancelación asíncrona no
se cancele el comprobante inmediatamente. Para saber cuando se ha cancelado totalmente existe la llamada
getCFDiStatus que permite consultar el estado de un comprobante en cualquier momento.
Gestión de errores.
En la ejecución de esta llamada hay que distinguir correctamente los códigos de error que genera el servicio de
cancelación de EDICOM y los códigos de validación que devuelve el SAT en el acuse de recibo.
La respuesta errónea del servicio de EDICOM, como se puede ver en el ejemplo anterior, devuelve un objeto
soapenv:Fault en la respuesta del servicio. Este objeto contiene un objeto ns1:cod con el código de error que
proporciona EDICOM para la ejecución del servicio.
La respuesta que devuelve el SAT está contenida dentro de la respuesta correcta del servicio de EDICOM. El
objeto ack dentro del cancelaCFDiAsyncReturn contiene esta información. Dentro de este acuse de recibo se
encuentran los códigos de ejecución de la cancelación del comprobante por parte del SAT. Estos códigos de
ejecución del SAT están contemplados en el Anexo 20.
Además de estos datos, podemos ver el estado de la cancaelación, y el resultado de la consulta del estado del
comprobante donde realmente nos dirá si el comprobante está cancelado o no.
getCFDiStatus
Permite comprobar el estado de un comprobante. Para poder implementar la llamada, el usuario debe
autentificarse como usuario del servicio de CFDi y especificar el comprobante que quiere buscar mediante el
UUID, el RFC del emisor, el RFC del receptor y el importe del comprobante firmado digitalmente. Esto implica
que sólo se podrá buscar un comprobante en cada petición.
LLAMADA:
public String getCFDiStatus(String user, String password, String rfcE, String
rfcR, String uuid, Double total, boolean test);
PARÁMETROS:
• user: Usuario que va realizar la conexión.
RESPUESTA:
En caso de que el comprobante exista, devolverá información referente al estado actual del comprobante.
• Respuesta satisfactoria: En caso de que se haya realizado la consulta del estado del comprobante
correctamente, el servicio devolverá un listado de datos indicando el estado del comprobante:
•
Respuesta con errores: En caso de que haya algún error en el proceso de búsqueda del comprobante
timbrado, devolverá una excepción que contendrá un código de error y un mensaje de texto con el
error producido. Ejemplos de este tipo de excepciones sería por ejemplo que el usuario no se haya
autentificado correctamente en el sistema, o que el comprobante no se encuentre timbrado.
EJEMPLOS
Código del cliente:
public String getCFDiStatus(String user, String pass, String rfcE, String rfcR,
String uuid, Double total, boolean test) {
CancelQueryData data = null;
try {
data = cfdiService.getCFDiStatus(user, pass, rfcE, rfcR, uuid, total,
test);
} catch (CFDiException cfdie) {
CFDIe.printStackTrace();
System.out.println("CFDiExcepcion: " + cfdie.getText());
} catch (RemoteException re) {
Re.printStackTrace();
System.out.println("RemoteExcepcion: " + re.toString());
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception: " + e.toString());
}
return data;
}
Petición SOAP:
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:rfcE>RFCE</cfdi:rfcE>
<cfdi:rfcR>RFCD</cfdi:rfcR>
<cfdi:uuid>UUID1</cfdi:uuid>
<cfdi:total>100</cfdi:total>
<cfdi:test>true</cfdi:test>
</cfdi:getCFDiStatus>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo no son reales. El código del fichero en
base64 ha sido resumido [...]
Respuesta SOAP:
El siguiente ejemplo es una respuesta satisfactoria de la obtención del estado de un comprobante:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getCFDiStatusResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<getCFDiStatusReturn>
<cancelStatus>En proceso</cancelStatus>
<isCancelable>Cancelable con aceptación</isCancelable>
<status>Vigente</status>
<statusCode>S- Comprobante obtenido satisfactoriamente.</statusCode>
</getCFDiStatusReturn>
</getCFDiStatusResponse>
</soapenv:Body>
</soapenv:Envelope>
Nota: Los datos que aparecen en este ejemplo de código no son reales.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: No se ha
podido comprobar el UUID del comprobante.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>202</ns1:cod>
<ns1:text>No se ha podido comprobar el UUID del
comprobante.</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdipr01a</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.
3.1. INTRODUCCIÓN
El SAT ha publicado una lista estándar de códigos de error (códigos del 301 al 403) aplicables a las respuestas no
satisfactorias. El servicio CFDi de Edicom detecta estos errores, y también otras situaciones de error
directamente relacionadas con la aplicación de Edicom.
•
Se ha producido un error al intentar cambiar el password.
•
La contraseña no cumple las restricciones avanzadas.
•
La contraseña no puede ser la misma que la que había anteriormente.
201 No se ha podido cancelar los comprobantes.
•
No se ha podido cancelar los UUIDs especificados.
202 No se ha podido comprobar el UUID del comprobante.
•
No se ha podido comprobar el UUID del comprobante.
203 No se ha podido obtener la respuesta de la petición de generación del comprobante.
•
No se ha enviado ningún UUID para ejecutar el servicio de obtención de acuses de los
comprobantes.
•
No se ha podido obtener los acuses de envío de los UUIDs especificados.
204 No se ha podido obtener el comprobante de los UUIDs enviados.
•
No se ha enviado ningún UUID para ejecutar el servicio de búsqueda de comprobantes.
•
No se ha enviado ningún rfc para ejecutar el servicio de búsqueda de comprobantes.
•
No se ha podido obtener los CFDi de los UUIDs especificados.
300 Error genérico de la aplicación.
•
Se han producido errores al ejecutar el servicio de CFDi. Compruebe que el documento a firmar
sea correcto.
404 Error de autentificación en el servicio.
•
El usuario <username> no es un usuario válido.
4. ANEXO: WSDL
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item"
type="xsd:string"/>
</sequence>
</complexType>
<complexType name="CancelaResponse">
<sequence>
<element name="ack" nillable="true" type="xsd:string"/>
<element name="text" nillable="true" type="xsd:string"/>
<element name="uuids" nillable="true"
type="impl:ArrayOf_xsd_string"/>
</sequence>
</complexType>
<element name="cancelCFDiAsync">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="rfcE" type="xsd:string"/>
<element name="rfcR" type="xsd:string"/>
<element name="uuid" type="xsd:string"/>
<element name="total" type="xsd:double"/>
<element name="pfx" type="xsd:base64Binary"/>
<element name="pfxPassword" type="xsd:string"/>
<element name="motivo" type="xsd:string"/>
<element name="sustitucion" type="xsd:string"/>
<element name="test" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
<element name="cancelCFDiAsyncResponse">
<complexType>
<sequence>
<element name="cancelCFDiAsyncReturn" type="impl:CancelData"/>
</sequence>
</complexType>
</element>
<complexType name="CancelData">
<sequence>
<element name="ack" nillable="true" type="xsd:string"/>
<element name="cancelQueryData" nillable="true"
type="impl:CancelQueryData"/>
<element name="rfcE" nillable="true" type="xsd:string"/>
<element name="status" nillable="true" type="xsd:string"/>
<element name="statusCode" nillable="true" type="xsd:string"/>
<element name="uuid" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="getUUIDTest">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getUUIDTestResponse">
<complexType>
<sequence>
<element name="getUUIDTestReturn" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="getCfdiTest">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getCfdiTestResponse">
<complexType>
<sequence>
<element name="getCfdiTestReturn" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getCfdiFromUUID">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="rfc" type="xsd:string"/>
<element maxOccurs="unbounded" name="uuid" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="getCfdiFromUUIDResponse">
<complexType>
<sequence>
</element>
<element name="getCfdiRetencionesResponse">
<complexType>
<sequence>
<element name="getCfdiRetencionesReturn"
type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdiRetenciones">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdiRetencionesResponse">
<complexType>
<sequence>
<element name="getTimbreCfdiRetencionesReturn"
type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getCfdiRetencionesTest">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getCfdiRetencionesTestResponse">
<complexType>
<sequence>
<element name="getCfdiRetencionesTestReturn"
type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdiRetencionesTest">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="cancelCFDiSignedAsync">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="sign" type="xsd:base64Binary"/>
<element name="rfcE" type="xsd:string"/>
<element name="rfcR" type="xsd:string"/>
<element name="uuid" type="xsd:string"/>
<element name="total" type="xsd:double"/>
<element name="test" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
<element name="cancelCFDiSignedAsyncResponse">
<complexType>
<sequence>
<element name="cancelCFDiSignedAsyncReturn"
type="impl:CancelData"/>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdiTest">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdiTestResponse">
<complexType>
<sequence>
<element name="getTimbreCfdiTestReturn"
type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="cancelaCFDiSigned">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<wsdl:message name="getCfdiTestResponse">
<wsdl:part element="impl:getCfdiTestResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="exportCfdiRequest">
<wsdl:part element="impl:exportCfdi" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiRetencionesResponse">
<wsdl:part element="impl:getTimbreCfdiRetencionesResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiFromUUIDResponse">
<wsdl:part element="impl:getCfdiFromUUIDResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiRetencionesResponse">
<wsdl:part element="impl:cancelaCFDiRetencionesResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="changePasswordRequest">
<wsdl:part element="impl:changePassword" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiSignedResponse">
<wsdl:part element="impl:cancelaCFDiSignedResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiRetencionesTestResponse">
<wsdl:part element="impl:getCfdiRetencionesTestResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiRequest">
<wsdl:part element="impl:cancelaCFDi" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiRetencionesTestRequest">
<wsdl:part element="impl:getTimbreCfdiRetencionesTest"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiRetencionesTestResponse">
<wsdl:part element="impl:getTimbreCfdiRetencionesTestResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiRetencionesTestRequest">
<wsdl:part element="impl:getCfdiRetencionesTest"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="changePasswordResponse">
<wsdl:part element="impl:changePasswordResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiAckRequest">
<wsdl:part element="impl:getCfdiAck" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiResponse">
<wsdl:part element="impl:getTimbreCfdiResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelCFDiAsyncResponse">
<wsdl:part element="impl:cancelCFDiAsyncResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiRetencionesResponse">
<wsdl:part element="impl:getCfdiRetencionesResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiTestRequest">
<wsdl:part element="impl:getTimbreCfdiTest" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiRequest">
<wsdl:part element="impl:getCfdi" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiRetencionesSignedResponse">
<wsdl:part element="impl:cancelaCFDiRetencionesSignedResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelCFDiSignedAsyncResponse">
<wsdl:part element="impl:cancelCFDiSignedAsyncResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiRetencionesRequest">
<wsdl:part element="impl:cancelaCFDiRetenciones"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUUIDResponse">
<wsdl:part element="impl:getUUIDResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiRetencionesSignedRequest">
<wsdl:part element="impl:cancelaCFDiRetencionesSigned"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiRequest">
<wsdl:part element="impl:getTimbreCfdi" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiTestRequest">
<wsdl:part element="impl:getCfdiTest" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="exportCfdiResponse">
<wsdl:part element="impl:exportCfdiResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiResponse">
<wsdl:part element="impl:getCfdiResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiFromUUIDRequest">
<wsdl:part element="impl:getCfdiFromUUID" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiSignedRequest">
<wsdl:part element="impl:cancelaCFDiSigned" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiRetencionesRequest">
<wsdl:part element="impl:getTimbreCfdiRetenciones"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUUIDRequest">
<wsdl:part element="impl:getUUID" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiAckResponse">
<wsdl:part element="impl:getCfdiAckResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCfdiRetencionesRequest">
<wsdl:part element="impl:getCfdiRetenciones"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelCFDiAsyncRequest">
<wsdl:part element="impl:cancelCFDiAsync" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUUIDTestRequest">
<wsdl:part element="impl:getUUIDTest" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="CFDi">
<wsdl:operation name="getCfdiAck">
<wsdl:input message="impl:getCfdiAckRequest"
name="getCfdiAckRequest">
</wsdl:input>
<wsdl:output message="impl:getCfdiAckResponse"
name="getCfdiAckResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCFDiStatus">
<wsdl:input message="impl:getCFDiStatusRequest"
name="getCFDiStatusRequest">
</wsdl:input>
<wsdl:output message="impl:getCFDiStatusResponse"
name="getCFDiStatusResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDi">
<wsdl:input message="impl:cancelaCFDiRequest"
name="cancelaCFDiRequest">
</wsdl:input>
<wsdl:output message="impl:cancelaCFDiResponse"
name="cancelaCFDiResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelCFDiAsync">
<wsdl:input message="impl:cancelCFDiAsyncRequest"
name="cancelCFDiAsyncRequest">
</wsdl:input>
<wsdl:output message="impl:cancelCFDiAsyncResponse"
name="cancelCFDiAsyncResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getUUIDTest">
<wsdl:input message="impl:getUUIDTestRequest"
name="getUUIDTestRequest">
</wsdl:input>
<wsdl:output message="impl:getUUIDTestResponse"
name="getUUIDTestResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiTest">
<wsdl:input message="impl:getCfdiTestRequest"
name="getCfdiTestRequest">
</wsdl:input>
<wsdl:output message="impl:getCfdiTestResponse"
name="getCfdiTestResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiFromUUID">
<wsdl:input message="impl:getCfdiFromUUIDRequest"
name="getCfdiFromUUIDRequest">
</wsdl:input>
<wsdl:output message="impl:getCfdiFromUUIDResponse"
name="getCfdiFromUUIDResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdi">
<wsdl:input message="impl:getTimbreCfdiRequest"
name="getTimbreCfdiRequest">
</wsdl:input>
<wsdl:output message="impl:getTimbreCfdiResponse"
name="getTimbreCfdiResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="exportCfdi">
<wsdl:input message="impl:exportCfdiRequest"
name="exportCfdiRequest">
</wsdl:input>
<wsdl:output message="impl:exportCfdiResponse"
name="exportCfdiResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiRetenciones">
<wsdl:input message="impl:getCfdiRetencionesRequest"
name="getCfdiRetencionesRequest">
</wsdl:input>
<wsdl:output message="impl:getCfdiRetencionesResponse"
name="getCfdiRetencionesResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdiRetenciones">
<wsdl:input message="impl:getTimbreCfdiRetencionesRequest"
name="getTimbreCfdiRetencionesRequest">
</wsdl:input>
<wsdl:output
message="impl:getTimbreCfdiRetencionesResponse"
name="getTimbreCfdiRetencionesResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiRetencionesTest">
<wsdl:input message="impl:getCfdiRetencionesTestRequest"
name="getCfdiRetencionesTestRequest">
</wsdl:input>
<wsdl:output message="impl:getCfdiRetencionesTestResponse"
name="getCfdiRetencionesTestResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdiRetencionesTest">
<wsdl:input
message="impl:getTimbreCfdiRetencionesTestRequest"
name="getTimbreCfdiRetencionesTestRequest">
</wsdl:input>
<wsdl:output
message="impl:getTimbreCfdiRetencionesTestResponse"
name="getTimbreCfdiRetencionesTestResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDiRetenciones">
<wsdl:input message="impl:cancelaCFDiRetencionesRequest"
name="cancelaCFDiRetencionesRequest">
</wsdl:input>
<wsdl:output message="impl:cancelaCFDiRetencionesResponse"
name="cancelaCFDiRetencionesResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDiRetencionesSigned">
<wsdl:input
message="impl:cancelaCFDiRetencionesSignedRequest"
name="cancelaCFDiRetencionesSignedRequest">
</wsdl:input>
<wsdl:output
message="impl:cancelaCFDiRetencionesSignedResponse"
name="cancelaCFDiRetencionesSignedResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelCFDiSignedAsync">
<wsdl:input message="impl:cancelCFDiSignedAsyncRequest"
name="cancelCFDiSignedAsyncRequest">
</wsdl:input>
<wsdl:output message="impl:cancelCFDiSignedAsyncResponse"
name="cancelCFDiSignedAsyncResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdiTest">
<wsdl:input message="impl:getTimbreCfdiTestRequest"
name="getTimbreCfdiTestRequest">
</wsdl:input>
<wsdl:output message="impl:getTimbreCfdiTestResponse"
name="getTimbreCfdiTestResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDiSigned">
<wsdl:input message="impl:cancelaCFDiSignedRequest"
name="cancelaCFDiSignedRequest">
</wsdl:input>
<wsdl:output message="impl:cancelaCFDiSignedResponse"
name="cancelaCFDiSignedResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdi">
<wsdl:input message="impl:getCfdiRequest"
name="getCfdiRequest">
</wsdl:input>
<wsdl:output message="impl:getCfdiResponse"
name="getCfdiResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getUUID">
<wsdl:input message="impl:getUUIDRequest"
name="getUUIDRequest">
</wsdl:input>
<wsdl:output message="impl:getUUIDResponse"
name="getUUIDResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="changePassword">
<wsdl:input message="impl:changePasswordRequest"
name="changePasswordRequest">
</wsdl:input>
<wsdl:output message="impl:changePasswordResponse"
name="changePasswordResponse">
</wsdl:output>
<wsdl:fault message="impl:CFDiException"
name="CFDiException">
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CFDiSoapBinding" type="impl:CFDi">
<wsdlsoap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getCfdiAck">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCfdiAckRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCfdiAckResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCFDiStatus">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCFDiStatusRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCFDiStatusResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDi">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="cancelaCFDiRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="cancelaCFDiResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdi">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getTimbreCfdiRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getTimbreCfdiResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="exportCfdi">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="exportCfdiRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="exportCfdiResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiRetenciones">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCfdiRetencionesRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCfdiRetencionesResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdiRetenciones">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getTimbreCfdiRetencionesRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getTimbreCfdiRetencionesResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiRetencionesTest">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCfdiRetencionesTestRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCfdiRetencionesTestResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdiRetencionesTest">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getTimbreCfdiRetencionesTestRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getTimbreCfdiRetencionesTestResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDiRetenciones">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="cancelaCFDiRetencionesRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="cancelaCFDiRetencionesResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDiRetencionesSigned">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="cancelaCFDiRetencionesSignedRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="cancelaCFDiRetencionesSignedResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelCFDiSignedAsync">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="cancelCFDiSignedAsyncRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="cancelCFDiSignedAsyncResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getTimbreCfdiTest">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getTimbreCfdiTestRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getTimbreCfdiTestResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelaCFDiSigned">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="cancelaCFDiSignedRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="cancelaCFDiSignedResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdi">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCfdiRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCfdiResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getUUID">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getUUIDRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getUUIDResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="changePassword">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="changePasswordRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="changePasswordResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CFDiService">
<wsdl:port binding="impl:CFDiSoapBinding" name="CFDi">
<wsdlsoap:address
location="https://cfdiws.sedebwb.com/EdiwinWS/services/CFDi"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl