Está en la página 1de 109

WSCFDI EDICOM

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

1.13 28/02/2020 Correción de texto quitando el tema de la 25,28.56,60


regla de validación de las 72h.
1.14 31/12/2021 Se actualizan las secciones 2.16 y 2.18 por 59 a 64 y 70 a 74
los cambios derivados de la RMF 2022 en
cancelación.

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

3. Lista de Códigos de Error...............................................................................................................................................84


3.1. Introducción...........................................................................................................................................................................................84
Códigos definidos por el SAT..................................................................................................................................................................84
Códigos definidos por Edicom................................................................................................................................................................84
Ejemplo de una respuesta de error........................................................................................................................................................85

4. Anexo: WSDL................................................................................................................................................................86
4.1. WSDL WEBSERVICE CFDi......................................................................................................................................................................86

WSCFDI EDICOM | | 6
WSCFDI EDICOM

1. WEBSERVICE CFDI DE 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.

Cuando un cliente contrata el servicio de Expedición de CFDis de Edicom obtiene:

• La URL del servicio y la documentación necesaria para ser utilizada.

• Su Usuario de acceso al servicio (coincide con su RFC)

• Su Password de acceso al servicio (único para él)

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

URL DE ACCESO AL SERVICIO


La URL de acceso al webservice CFDi de edicom es la siguiente:

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).

FUNCIONES DEL WEBSERVICE CFDI DE EDICOM


función Descripción ver.
getCfdi Generación de CFDI. Permite realizar el timbrado del comprobante firmado por el 1.0
cliente y devuelve el comprobante timbrado.
getTimbreCfdi Generación de timbre de CFDI. Permite realizar el timbrado del comprobante 1.0
firmado por el cliente y devuelve el timbre del comprobante timbrado.
cancelaCFDi Cancelación de CFDI. Permite cancelar comprobantes timbrados. 1.0
changePassword Cambio de password de acceso al Servicio CFDI. Permite al usuario cambiar el 1.0
password de acceso al servicio CFDi
getCfdiTest Generación de CFDI en test. Permite realizar el timbrado del comprobante 1.0
firmado por el cliente en modo de prueba y devuelve el comprobante timbrado.
getTimbreCfdiTest Generación de timbre de CFDI en test. Permite realizar el timbrado del 1.0
comprobante firmado por el cliente en modo de prueba y devuelve el timbre del
comprobante timbrado.
getUUID Comprobación de la generación de timbres CFDI. Permite comprobar si un 1.0
comprobante ha sido timbrado en nuestro sistema.

WSCFDI EDICOM | 1.WebService CFDi de EDICOM | 7


WSCFDI EDICOM

getUUIDTest Comprobación de la generación de timbres CFDI en test. Permite comprobar si 1.0


un comprobante ha sido timbrado en modo de prueba de nuestro sistema.
cancelaCfdiSigned Cancelación de CFDI firmada. Permite cancelar comprobantes timbrados a partir 1.0
de la petición de cancelación del cliente previamente firmada.
getCfdiAck Obtención de Ack de timbrado. Permite obtener el acuse del timbrado del SAT 1.0

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.

cancelaCfdiRetenci Cancelación de Retenciones de CFDI firmada. Permite cancelar comprobantes de 1.0


onesSigned retenciones electrónicas timbrados a partir de la petición de cancelación del
cliente previamente firmada.
cancelaCFDiAsync Cancelación asíncrona de CFDI. Permite cancelar comprobantes timbrados de 1.0
forma asíncrona.
cancelaCFDiSignedAsyn Cancelación asíncrona de CFDI firmada. Permite cancelar comprobantes 1.0
c timbrados de forma asíncrona a partir de la petición de cancelación del cliente
previamente firmada.
getCFDiStatus Obtención del estado de un comprobante. Permite recuperar el estado de un 1.0
comprobante tras ser timbrado.

WSCFDI EDICOM | 1.WebService CFDi de EDICOM | 8


WSCFDI EDICOM

2. FUNCIONES

2.1. GENERACIÓN DEL CFDI

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.

En cada llamada se puede generar un CFDI.

LLAMADA:
public byte[] getCfdi(String user, String password, byte[] file);

PARÁMETROS:
• user: Usuario que va realizar la conexión.

• password: Contraseña del 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.

Validaciones que contiene el servicio:

• 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.

WSCFDI EDICOM | 2.Funciones | 9


WSCFDI EDICOM


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:

public byte[] getCfdi(String user, String pass, byte[] file) {


try {
cfdiService.getCfdi(user, pass, file);
} 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());
}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCfdi>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]
C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getCfdi>

WSCFDI EDICOM | 2.Funciones | 10


WSCFDI EDICOM

</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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getCfdiResponse xmlns="http://cfdi.service.ediwinws.edicom.com">

<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 [...]

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: El
documento &lt;SE3> no está codificado en UTF-8</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>301</ns1:cod>
<ns1:text>El documento &lt;referencia> no está codificado en UTF-
8</ns1:text>
</ns1:fault>

WSCFDI EDICOM | 2.Funciones | 11


WSCFDI EDICOM

<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.

WSCFDI EDICOM | 2.Funciones | 12


WSCFDI EDICOM

2.2. GENERACIÓN DEL TIMBRE DEL CFDI

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.

En cada llamada se puede generar un CFDI.

LLAMADA:
public byte[] getTimbreCfdi(String user, String password, byte[] file);

PARÁMETROS:
• user: Usuario que va realizar la conexión

• password: Contraseña del 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.

Validaciones que contiene el servicio:

• 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

WSCFDI EDICOM | 2.Funciones | 13


WSCFDI EDICOM

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:

public byte[] getTimbreCfdi(String user, String pass, byte[] file) {


try {
cfdiService.getTimbreCfdi(user, pass, file);
} 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());
}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getTimbreCfdi>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]
C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getTimbreCfdi>
</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 [...]

WSCFDI EDICOM | 2.Funciones | 14


WSCFDI EDICOM

Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de timbre satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getTimbreCfdiResponse xmlns="http://cfdi.service.ediwinws.edicom.com">

<getTimbreCfdiReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9PS18x
LlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getTimbreCfdiReturn>
</getTimbreCfdiResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: El
documento &lt;SE3> no está codificado en UTF-8</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>301</ns1:cod>
<ns1:text>El documento &lt;SE3> no está codificado en
UTF-8</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.

WSCFDI EDICOM | 2.Funciones | 15


WSCFDI EDICOM

2.3. CANCELAR CFDI

cancelaCFDi

Permite cancelar comprobantes timbrados.

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.

En cada llamada se pueden cancelar varios CFDI.

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

• password: Contraseña del usuario que va realizar la conexión

• rfc: RFC del usuario que está cancelando los CFDI

• 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:

• uuids: Listado de CFDI que se han cancelado en la petició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.

WSCFDI EDICOM | 2.Funciones | 16


WSCFDI EDICOM

EJEMPLOS
Código del cliente:

public CancelaResponse cancelaCFDi(String user, String pass, String rfc,


String[] uuid, byte[] pfx, Strind pfxPassword) {
CancelaResponse cancelaResponse = null;
try {
cancelaResponse = cfdiService.cancelaCFDi(user, pass, rfc, uuid, pfx,
pfxPassword);
} 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 cancelaResponse;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:cancelaCFDi>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:rfc>RFC</cfdi:rfc>
<cfdi:uuid>UUID1</cfdi:uuid>

<cfdi:pfx>MIIJuQIBAzCCCX8GCSqGSIb3DQEHAaCCCXAEgglsMIIJaDCCBB8GCSqGSIb3DQEHBqCCBBA
wggQMAgEAMIIEBQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIkI0BwQTfWEQCAggAgIID2DzPnHdO
A4XWGeanHoCuRitvCJJecEBSkqvg8ohliY7IiVp8qF3agvOqt32kbEDXHfrLpVVhlPnjrZo4
[...]
Hzl11kfETcJiuMUNa5hOx5CiB2WqAg/
tV9MDOdUZEkN4E+N9xxSxPAkSw75RvvVfRPW4JFXbmfs7c230aPodMQP58PfaJilI/
Nm8cvAQXIEwRugMSUwIwYJKoZIhvcNAQkVMRYEFBlCuYgPj26y+M2HK9s6Tpe2JmgCMDEwITAJBgUrDgM
CGgUABBSz8OKBcbpiR69Tw0UJ1d1D2xW0EQQIar9uSxM7uToCAggA</cfdi:pfx>
<cfdi:pfxPassword>qwertyuio</cfdi:pfxPassword>
</cfdi:cancelaCFDi>
</soapenv:Body>

WSCFDI EDICOM | 2.Funciones | 17


WSCFDI EDICOM

</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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<cancelaCFDiResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiReturn>

<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>

Ejemplo de una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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>

WSCFDI EDICOM | 2.Funciones | 18


WSCFDI EDICOM

<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.

Ejemplo de una respuesta de error del servicio de EDICOM.

<?xml version="1.0" encoding="UTF-8"?>


<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>

WSCFDI EDICOM | 2.Funciones | 19


WSCFDI EDICOM

<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.

Ejemplo de una respuesta de cancelación de CFDI satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<cancelaCFDiResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiReturn>

<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>

WSCFDI EDICOM | 2.Funciones | 20


WSCFDI EDICOM

</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.

Ejemplo de una petición con fecha posterior al 01/11/2018

Importante: A partir del día 1 de noviembre, la petición siempre responderá un error.

<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>

2.4. CAMBIAR PASSWORD DE ACCESO AL SERVICIO DE CFDI

changePassword

Permite al usuario cambiar el password de acceso al servicio CFDi.

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.

WSCFDI EDICOM | 2.Funciones | 21


WSCFDI EDICOM

• password: Contraseña del 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:

public boolean changePassword(String user, String pass, String newPass) {


boolean result = false;
try {
result = cfdiService.changePassword(user, pass, newPass);
} 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 result;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:changePassword>

WSCFDI EDICOM | 2.Funciones | 22


WSCFDI EDICOM

<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

<?xml version="1.0" encoding="UTF-8"?>


<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>
<changePasswordResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<changePasswordReturn>true</changePasswordReturn>
</changePasswordResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: La
contraseña no puede ser la misma que la que habÃa anteriormente.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>200</ns1:cod>
<ns1:text>La contraseña no puede ser la misma que la que habÃa
anteriormente.</ns1:text>
</ns1:fault>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>
</detail>
</soapenv:Fault>

WSCFDI EDICOM | 2.Funciones | 23


WSCFDI EDICOM

</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.

2.5. GENERACIÓN DEL CFDI EN TEST

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

• password: Contraseña del 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.

WSCFDI EDICOM | 2.Funciones | 24


WSCFDI EDICOM


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:

public byte[] getCfdiTest(String user, String pass, byte[] file) {


try {
cfdiService.getCfdiTest(user, pass, file);
} 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());
}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCfdiTest>
<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:getCfdiTest>
</soapenv:Body>
</soapenv:Envelope>

WSCFDI EDICOM | 2.Funciones | 25


WSCFDI EDICOM

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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getCfdiTestResponse xmlns="http://cfdi.service.ediwinws.edicom.com">

<getCfdiTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHTl9zaW5fdGltYnJhcl
9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/
cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/3S5xl2DuomLouXETkmRlhQeKUfF+HLyDK
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getCfdiTestReturn>
</getCfdiTestResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: El
certificado &lt;> 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 &lt;> 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>

WSCFDI EDICOM | 2.Funciones | 26


WSCFDI EDICOM

Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.

2.6. GENERACIÓN DEL TIMBRE DEL CFDI EN TEST

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

• password: Contraseña del 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.

WSCFDI EDICOM | 2.Funciones | 27


WSCFDI EDICOM

EJEMPLOS
Código del cliente:

public byte[] getTimbreCfdiTest(String user, String pass, byte[] file) {


try {
cfdiService.getTimbreCfdiTest(user, pass, file);
} 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());
}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getTimbreCfdiTest>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>

<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 [...]

WSCFDI EDICOM | 2.Funciones | 28


WSCFDI EDICOM

Respuesta SOAP:
El siguiente ejemplo es una respuesta de generación de timbre de CFDI en test satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getTimbreCfdiTestResponse xmlns="http://cfdi.service.ediwinws.edicom.com">

<getTimbreCfdiTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHTl9zaW5fdGlt
YnJhcl9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/
oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/
3S5xl2DuomLouXETkmRlhQeKUfF
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getTimbreCfdiTestReturn>
</getTimbreCfdiTestResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: El
documento &lt;SE1> ya ha sido firmado
&lt;D63558240D3051448088CED185C0832038A8735C></faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>307</ns1:cod>
<ns1:text>El documento &lt;SE1> ya ha sido firmado
&lt;D63558240D3051448088CED185C0832038A8735C></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.

WSCFDI EDICOM | 2.Funciones | 29


WSCFDI EDICOM

2.7. COMPROBACIÓN DEL TIMBRADO CFDI

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.

• password: Contraseña del 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:

public String getUUID(String user, String pass, byte[] file) {


String uuid = null;
try {
uuid = cfdiService.getUUID(user, pass, file);
} catch (CFDiException CFDIe) {

WSCFDI EDICOM | 2.Funciones | 30


WSCFDI EDICOM

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:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getUUID>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]
C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getUUID>
</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 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">

WSCFDI EDICOM | 2.Funciones | 31


WSCFDI EDICOM

<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.

El siguiente ejemplo es una respuesta de error.

<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>

Nota: En este ejemplo concreto se presenta un error "202" No se ha podido comprobar el


UUID del comprobante.

Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.

2.8. COMPROBACIÓN DEL TIMBRADO CFDI EN TEST

getUUIDTest

Permite comprobar si un comprobante ha sido timbrado previamente en el entorno de pruebas de EDICOM y


devuelve el UUID del comprobante timbrado en el entorno de pruebas. 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 en el entorno de pruebas.

WSCFDI EDICOM | 2.Funciones | 32


WSCFDI EDICOM

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.

• password: Contraseña del 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:

public String getUUIDTest(String user, String pass, byte[] file) {


String uuid = null;
try {
uuid = cfdiService.getUUIDTest(user, pass, file);
} catch (CFDiException CFDIe) {
CFDIe.printStackTrace();
System.out.println("CFDiExcepcion: " + CFDIe.getText());
} catch (RemoteException Re) {
Re.printStackTrace();

WSCFDI EDICOM | 2.Funciones | 33


WSCFDI EDICOM

System.out.println("RemoteExcepcion: " + Re.toString());


} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception: " + e.toString());
}
return uuid;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getUUIDTest>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]
C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getUUIDTest>
</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. 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>

WSCFDI EDICOM | 2.Funciones | 34


WSCFDI EDICOM

Nota: El UUID reflejado en este ejemplo es un UUID como el obtenido en entorno de


pruebas, El segundo grupo es siempre "7E57" ("TEST")

El siguiente ejemplo es una respuesta de error.

<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>

Nota: En este ejemplo concreto se presenta un error "202" No se ha podido comprobar el


UUID del comprobante

Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.

2.9. CANCELAR CFDI FIRMADO

cancelaCFDiSigned

Permite cancelar comprobantes timbrados.

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:

WSCFDI EDICOM | 2.Funciones | 35


WSCFDI EDICOM

public CancelaResponse cancelaCFDiSigned(String user, String password, byte[]


sign);

PARÁMETROS:
• user: Usuario que va realizar la conexión.

• password: Contraseña del 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:

• uuids: Listado de CFDI que se han cancelado en la petició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:

public CancelaResponse cancelaCFDiSigned(String user, String pass, byte[] sign)


{
CancelaResponse cancelaResponse = null;
try {
cancelaResponse = cfdiService.cancelaCFDiSigned(user, pass, sign);
} 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());

WSCFDI EDICOM | 2.Funciones | 36


WSCFDI EDICOM

}return cancelaResponse;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:cancelaCFDiSigned>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>

<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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<cancelaCFDiSignedResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiSignedReturn>

<ack>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4bWxuczpz
PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT48Q2FuY2VsY
UNGRFJlc3BvbnNlIHhtbG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIj48Q2FuY2VsYUNGRF
[...]
+PC9hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNF
bWlzb3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlb
GFDRkRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</ack>
<text>1c550dd7-2209-4c45-acdf -
b86b6cf3723e~PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48czpFbnZlbG9wZSB4
bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+PHM6Qm9keT4Q

WSCFDI EDICOM | 2.Funciones | 37


WSCFDI EDICOM

[...]
hOkFjdXNlRm9saW9zPjwvYTpGb2xpb3M+PGE6U2VsbG9TQVQgaTpuaWw9InRydWUiLz48YTpyZmNFbWlz
b3I+U0FULTI4MDkxMC0wMDE8L2E6cmZjRW1pc29yPjwvQ2FuY2VsYUNGRFJlc3VsdD48L0NhbmNlbGFDR
kRSZXNwb25zZT48L3M6Qm9keT48L3M6RW52ZWxvcGU+</text>
<uuids>
<uuids>1c550dd7-2209-4c45-acdf-b86b6cf3723e</uuids>
</uuids>
</cancelaCFDiSignedReturn>
</cancelaCFDiSignedResponse>
</soapenv:Body>
</soapenv:Envelope>

Ejemplo de una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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 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>

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

WSCFDI EDICOM | 2.Funciones | 38


WSCFDI EDICOM

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.

Ejemplo de una respuesta de error del servicio de EDICOM.

<?xml version="1.0" encoding="UTF-8"?>


<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 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.

WSCFDI EDICOM | 2.Funciones | 39


WSCFDI EDICOM

Ejemplo de una respuesta de cancelación de CFDI satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<cancelaCFDiResponse xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiReturn>

<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.

Ejemplo de una petición con fecha posterior al 01/11/2018

Importante: A partir del día 1 de noviembre, la petición siempre responderá un error.

<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>

WSCFDI EDICOM | 2.Funciones | 40


WSCFDI EDICOM

<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>

2.10. OBTENCIÓN DEL ACK(ACUSE) DEL TIMBRADO

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.

En cada llamada se pueden obtener varios ACKs.

LLAMADA:
public byte[] getCfdiAck(String user, String password, String[] uuid);

PARÁMETROS:
• user: Usuario que va realizar la conexión.

• password: Contraseña del usuario que va realizar la conexión.

• uuid: Listado de UUIDs de los que se quieren obtener los ACKs.

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:

public byte[] getCfdiAck(String user, String pass, String[] uuid) {


try {

WSCFDI EDICOM | 2.Funciones | 41


WSCFDI EDICOM

cfdiService.getCfdiAck(user, pass, uuid);


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

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCfdiAck>
<cfdi:user>xxxxx</cfdi:user>
<cfdi:password>xxxxxxx</cfdi:password>
<cfdi:uuid>9D4B22C9-654F-4D58-BD8D-2F6481432AF5</cfdi:uuid>
</cfdi:getCfdiAck>
</soapenv:Body>
</soapenv:Envelope>

Respuesta SOAP:
El siguiente ejemplo es una respuesta de obtención de ACKs satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getCfdiAckResponse xmlns="http://cfdi.service.ediwinws.edicom.com">

<getCfdiAckReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9PS18xLlh
NTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]

WSCFDI EDICOM | 2.Funciones | 42


WSCFDI EDICOM

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 [...]

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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 obtener la respuesta de la petición de generación del
comprobante.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>203</ns1:cod>
<ns1:text>No se ha podido obtener la respuesta de la petición de
generación del comprobante.</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.

2.11. OBTENCIÓN DEL TIMBRE A PARTIR DEL UUID.

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.

WSCFDI EDICOM | 2.Funciones | 43


WSCFDI EDICOM

LLAMADA:
public byte[] getCfdiFromUUID(String user, String password, String rfc,
String[] uuid);

PARÁMETROS:
• user: Usuario que va realizar la conexión.

• password: Contraseña del usuario que va realizar la conexión.

• rfc: RFC del emisor del comprobante..

• 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:

public byte[] getCfdiFromUUID(String user, String pass, String rfc, String[]


uuid) {
try {
cfdiService.getCfdiFrom UUID(user, pass, rfc, uuid);
} 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());
}
}

WSCFDI EDICOM | 2.Funciones | 44


WSCFDI EDICOM

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCfdiFromUUID>
<cfdi:user>xxxxx</cfdi:user>
<cfdi:password>xxxxx</cfdi:password>
<cfdi:rfc>xxxxx</cfdi:rfc>
<cfdi:uuid>9D4B22C9-654F-4D58-BD8D-2F6481432AF5</cfdi:uuid>
</cfdi:getCfdiFromUUID>
</soapenv:Body>
</soapenv:Envelope>

Respuesta SOAP:
El siguiente ejemplo es una respuesta de obtención de los comprobantes timbrados satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getCfdiFromUUIDResponse xmlns="http://cfdi.service.ediwinws.edicom.com">

<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 [...]

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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">

WSCFDI EDICOM | 2.Funciones | 45


WSCFDI EDICOM

<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.

2.12. GENERACIÓN DEL CFDI DE RETENCIONES ELECTRÓNICAS

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.

En cada llamada se puede generar un CFDI.

LLAMADA:
public byte[] getCfdiRetenciones(String user, String password, byte[] file);

PARÁMETROS:
• user: Usuario que va realizar la conexión.

• password: Contraseña del 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.

WSCFDI EDICOM | 2.Funciones | 46


WSCFDI EDICOM

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.

Validaciones que contiene el servicio:

• 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:

public byte[] getCfdiRetenciones(String user, String pass, byte[] file) {


try {
cfdiService.getCfdiRetenciones(user, pass, file);
} 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());

WSCFDI EDICOM | 2.Funciones | 47


WSCFDI EDICOM

}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCfdiRetenciones>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]
C2Qy59xh/9sq4/
ZB2RfEvjSuv3+L1BLAQIUCxQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAAAAAAAEAIAAAAAAAAABzaW5f
dGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWx+UEsFBgAAAAABAAEATQAAAAIIAAAAAA==</cfdi:file>
</cfdi:getCfdiRetenciones>
</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 de retenciones electrónicas satisfactorio.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getCfdiRetencionesResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">

<getCfdiRetencionesReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9GaXJtYV9
PS18xLlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getCfdiRetencionesReturn>

WSCFDI EDICOM | 2.Funciones | 48


WSCFDI EDICOM

</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 [...]

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: El
documento &lt;SE3> no está codificado en UTF-8</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>301</ns1:cod>
<ns1:text>El documento &lt;referencia> no está codificado en UTF-
8</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: 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.

WSCFDI EDICOM | 2.Funciones | 49


WSCFDI EDICOM

2.13. GENERACIÓN DEL TIMBRE DEL CFDI DE RETENCIONES


ELECTRÓNICAS

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.

En cada llamada se puede generar un CFDI de retenciones electrónicas.

LLAMADA:
public byte[] getTimbreCfdiRetenciones(String user, String password, byte[]
file);

PARÁMETROS:
• user: Usuario que va realizar la conexión

• password: Contraseña del 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.

Validaciones que contiene el servicio:

• 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.

WSCFDI EDICOM | 2.Funciones | 50


WSCFDI EDICOM


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:

public byte[] getTimbreCfdiRetenciones(String user, String pass, byte[] file)


{
try {
cfdiService.getTimbreCfdiRetenciones(user, pass, file);
} 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());
}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getTimbreCfdiRetenciones>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:file>UEsDBBQAAAAIAOJkmD0CMccqxQcAAFUSAAAfAAAAc2luX3RpbWJyYXJfX1hN+
+NAgoBzSJWgV4cbALEKkAC6Q/8Kf6O+2MupJ4ZzWI7/
OoYRaCSKrOyTh5OVeZvfwxFjp2jpk2r8m1CToky4Ti037j1s2nVxDhFECTuyJIRJFHhffVN/
7vzp7RsO68MogkmV2UUem8T2VEmmJnWFeMVflqhZCZYEDVd
[...]

WSCFDI EDICOM | 2.Funciones | 51


WSCFDI EDICOM

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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getTimbreCfdiRetencionesResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">

<getTimbreCfdiRetencionesReturn>UEsDBBQACAAIAOxtfj0AAAAAAAAAAAAAAAATAAAAU0lHTl9Ga
XJtYV9PS18xLlhNTN1Y2ZKryBF9d4T/
gdCDXxQtsbS29u2ZYCkQEoUEArS8ONgESCxqQID4A3+Kf8GPnh9zgdR91fdq7ngc4QjbHdGNlJWVdfJk5
dJ8+bmKQqxw0yxI4tcO0cM7mBvbiRPE3mtH1/incefnn/74hy/23gle2CQ
[...]
mnvqtOHAGOdsvaUcv+wpHGUn1eygepprtwr5WvTT581Lu7+/
1VdBvpURr8E1BLBwiieLVx4QkAAJ4UAABQSwECFAAUAAgACADsbX49oni1ceEJAACeFAAAEwAAAAAAAAA
AAAAAAAAAAAAAU0lHTl9GaXJtYV9PS18xLlhNTFBLBQYAAAAAAQABAEEAAAAiCgAAAAA=</
getTimbreCfdiRetencionesReturn>
</getTimbreCfdiRetencionesResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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: El
documento &lt;SE3> no está codificado en UTF-8</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>301</ns1:cod>

WSCFDI EDICOM | 2.Funciones | 52


WSCFDI EDICOM

<ns1:text>El documento &lt;SE3> no está codificado en


UTF-8</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.

2.14. GENERACIÓN DEL CFDI DE RETENCIONES ELECTRÓNICAS EN TEST

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

• password: Contraseña del 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.

WSCFDI EDICOM | 2.Funciones | 53


WSCFDI EDICOM

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:

public byte[] getCfdiRetencionesTest(String user, String pass, byte[] file) {


try {
cfdiService.getCfdiRetencionesTest(user, pass, file);
} 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());
}
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCfdiRetencionesTest>

WSCFDI EDICOM | 2.Funciones | 54


WSCFDI EDICOM

<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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getCfdiRetencionesTestResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">

<getCfdiRetencionesTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHTl9zaW5
fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/
oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/
3S5xl2DuomLouXETkmRlhQeKUfF+HLyDK
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getCfdiRetencionesTestReturn>
</getCfdiRetencionesTestResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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>

WSCFDI EDICOM | 2.Funciones | 55


WSCFDI EDICOM

<faultstring>com.edicom.ediwinws.service.cfdi.CFDiException: El
certificado &lt;> 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 &lt;> 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.

2.15. GENERACIÓN DEL TIMBRE DEL CFDI DE RETENCIONES


ELECTRÓNICAS EN TEST

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

WSCFDI EDICOM | 2.Funciones | 56


WSCFDI EDICOM

PARÁMETROS:
• user: Usuario que va realizar la conexión

• password: Contraseña del 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:

public byte[] getTimbreCfdiRetencionesTest(String user, String pass, byte[]


file) {
try {
cfdiService.getTimbreCfdiRetencionesTest(user, pass, file);
} 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());
}
}

WSCFDI EDICOM | 2.Funciones | 57


WSCFDI EDICOM

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getTimbreCfdiRetencionesTest>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>

<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.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<getTimbreCfdiRetencionesTestResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">

<getTimbreCfdiRetencionesTestReturn>UEsDBBQACAAIANV9ND4AAAAAAAAAAAAAAAAjAAAAU0lHT
l9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWztWNly67gRfU9V/
oGlp6RcFhctllzjmQJJUCTNRVy1vKS4ifsikhIp/cF8Sr5jfiygZN/re8eZTB5TuayiYaEbjdONA3SDP/
3S5xl2DuomLouXETkmRlhQeKUfF
[...]
AAAAAAAAAAAAAAAAAAAAAU0lHTl9zaW5fdGltYnJhcl9fWE1MSW1wXzQ3MzIwOS54bWxQSwUGAAAAAAEA
AQBRAAAAPgkAAAAA</getTimbreCfdiRetencionesTestReturn>
</getTimbreCfdiRetencionesTestResponse>
</soapenv:Body>
</soapenv:Envelope>

El siguiente ejemplo es una respuesta de error.

WSCFDI EDICOM | 2.Funciones | 58


WSCFDI EDICOM

<?xml version="1.0" encoding="UTF-8"?>


<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: El
documento &lt;SE1> ya ha sido firmado
&lt;D63558240D3051448088CED185C0832038A8735C></faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>307</ns1:cod>
<ns1:text>El documento &lt;SE1> ya ha sido firmado
&lt;D63558240D3051448088CED185C0832038A8735C></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.

2.16. CANCELAR COMPROBANTES DE RETENCIONES ELECTRÓNICAS

cancelaCFDiRetenciones

Permite cancelar comprobantes de retenciones electrónicas timbrados.

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.

En cada llamada se pueden cancelar varios comprobantes.

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

WSCFDI EDICOM | 2.Funciones | 59


WSCFDI EDICOM

• password: Contraseña del usuario que va realizar la conexión

• rfc: RFC del usuario que está cancelando los CFDI

• 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:

• uuids: Listado de CFDI que se han cancelado en la petició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:

public CancelaResponse cancelaCFDiRetenciones(String user, String pass, String


rfc, String[] uuid, byte[] pfx, Strind pfxPassword, String motivo, String
sustitucion) {
CancelaResponse cancelaResponse = null;
try {
cancelaResponse = cfdiService.cancelaCFDiRetenciones(user, pass, rfc,
uuid, pfx, pfxPassword, motivo, sustitucion);
} catch (CFDiException CFDIe) {
CFDIe.printStackTrace();
System.out.println("CFDiExcepcion: " + CFDIe.getText());
} catch (RemoteException Re) {
Re.printStackTrace();

WSCFDI EDICOM | 2.Funciones | 60


WSCFDI EDICOM

System.out.println("RemoteExcepcion: " + Re.toString());


} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception: " + e.toString());
}return cancelaResponse;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:cancelaCFDiRetenciones>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:rfc>RFC</cfdi:rfc>
<cfdi:uuid>UUID1</cfdi:uuid>

<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.

<?xml version="1.0" encoding="UTF-8"?>


<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>

WSCFDI EDICOM | 2.Funciones | 61


WSCFDI EDICOM

<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>

Ejemplo de una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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 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>

WSCFDI EDICOM | 2.Funciones | 62


WSCFDI EDICOM

</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.

Ejemplo de una respuesta de error del servicio de EDICOM.

<?xml version="1.0" encoding="UTF-8"?>


<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 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>

WSCFDI EDICOM | 2.Funciones | 63


WSCFDI EDICOM

</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.

Ejemplo de una respuesta de cancelación de comprobantes de retenciones electrónicas


satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<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>

Ambos códigos son totalmente independientes, y no deben confundirse ya que corresponden a códigos de
EDICOM y del SAT respectivamente.

WSCFDI EDICOM | 2.Funciones | 64


WSCFDI EDICOM

2.17. CANCELAR COMPROBANTES DE RETENCIONES ELECTRÓNICAS


FIRMADO

cancelaCFDiRetencionesSigned

Permite cancelar comprobantes de retenciones electrónicas timbrados.

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.

• password: Contraseña del usuario que va realizar la conexión.

• sign: Petición de cancelación de comprobantes de retenciones electrónicas 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:

• uuids: Listado de comprobantes de retenciones electrónicas que se han cancelado en la


petició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

WSCFDI EDICOM | 2.Funciones | 65


WSCFDI EDICOM

Código del cliente:

public CancelaResponse cancelaCFDiRetencionesSigned(String user, String pass,


byte[] sign) {
CancelaResponse cancelaResponse = null;
try {
cancelaResponse = cfdiService.cancelaCFDiRetencionesSigned(user,
pass, sign);
} 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 cancelaResponse;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:cancelaCFDiRetencionesSigned>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>

<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 [...]

WSCFDI EDICOM | 2.Funciones | 66


WSCFDI EDICOM

Respuesta SOAP:
Ejemplo de una respuesta de cancelación de comprobantes de retenciones electrónicas firmada satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<cancelaCFDiRetencionesSignedResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiRetencionesSignedReturn>

<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>

Ejemplo de una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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 cancelar los UUIDs especificados.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>

WSCFDI EDICOM | 2.Funciones | 67


WSCFDI EDICOM

<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>

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.

Ejemplo de una respuesta de error del servicio de EDICOM.

<?xml version="1.0" encoding="UTF-8"?>


<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 cancelar los UUIDs especificados.</faultstring>
<detail>

WSCFDI EDICOM | 2.Funciones | 68


WSCFDI EDICOM

<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.

Ejemplo de una respuesta de cancelación de comprobantes de retenciones electrónicas


satisfactoria.

<?xml version="1.0" encoding="UTF-8"?>


<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>
<cancelaCFDiRetencionesSignedResponse
xmlns="http://cfdi.service.ediwinws.edicom.com">
<cancelaCFDiRetencionesSignedReturn>

<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>

WSCFDI EDICOM | 2.Funciones | 69


WSCFDI EDICOM

</soapenv:Envelope>

Ambos códigos son totalmente independientes, y no deben confundirse ya que corresponden a códigos de
EDICOM y del SAT respectivamente.

2.18. CANCELAR CFDI ASÍNCRONO

cancelCFDiAsync

Permite cancelar comprobantes timbrados de forma asíncrona.

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.

Se podrán cancelar también comprobantes firmados en el entorno de Test o de Producció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.

• password: Contraseña del usuario que va realizar la conexión.

• rfcE: RFC del emisor del comprobante que se quiere cancelar.

• rfcR: RFC del receptor del comprobante que se quiere cancelar.

• uuid: Uuid del comprobante que se quiere cancelar.

• total: Total del comprobante que se quiere cancelar.

• 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.

WSCFDI EDICOM | 2.Funciones | 70


WSCFDI EDICOM

• test: indica si la cancelación se hace sobre un comprobante timbrado en el entorno de Test o en el de


Producció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.

• statusCode: Código del SAT para definir el estado de la cancelación.

• rfcE: RFC del emisor del comprobante.

• status: Estado de la cancelación en texto.

• uuid: UUID del comprobante cancelado.

• cancelQueryData: Es la información de la consulta realizada al SAT tras realizarse la


cancelación. Devuelve el estado final del comprobante tras la operación. Contiene los
siguientes campos:

• statusCode: Código del SAT para definir el estado del comprobante.

• isCancelable: Indica si el comprobante es cancelable o no.

• status: Estado del comprobante en modo texto.

• cancelStatus: Estado de la cancelación del comprobante.

• 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:

public CancelaResponse cancelCFDiAsync(String user, String pass, String rfcE,


String rfcR, String uuid, Double total, byte[] pfx, Strind pfxPassword, String
motivo, String sustitucion, boolean test) {
CancelData cancelData = null;
try {
cancelData = cfdiService.cancelCFDiAsync(user, pass, rfcE, rfcR,
uuid, total, pfx, pfxPassword, motivo, sustitucion, test);
} catch (CFDiException cfdie) {
cfdie.printStackTrace();
System.out.println("CFDiExcepcion: " + cfdie.getText());

WSCFDI EDICOM | 2.Funciones | 71


WSCFDI EDICOM

} catch (RemoteException re) {


Re.printStackTrace();
System.out.println("RemoteExcepcion: " + re.toString());
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception: " + e.toString());
}
return cancelData;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:cancelCFDiAsync>
<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: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:test>true</cfdi:test>
</cfdi:cancelCFDiAsync>
</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 asíncrona satisfactoria.

WSCFDI EDICOM | 2.Funciones | 72


WSCFDI EDICOM

<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>

Ejemplo de una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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 cancelar el comprobante.</faultstring>
<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>

WSCFDI EDICOM | 2.Funciones | 73


WSCFDI EDICOM

<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.

Ejemplo de una respuesta de error del servicio de EDICOM.

<?xml version="1.0" encoding="UTF-8"?>


<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 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 el comprobante.</ns1:text>
</ns1:fault>
<ns2:
xmlns:ns2="http://xml.apache.org/axis/">cfdiws.sedeb2b.com</ns2:hostname>

WSCFDI EDICOM | 2.Funciones | 74


WSCFDI EDICOM

</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.

2.19. CANCELAR CFDI FIRMADO ASÍNCRONO

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.

Se podrán cancelar también comprobantes firmados en el entorno de Test o de Producció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.

• password: Contraseña del 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.

• rfcE: RFC del emisor del comprobante que se quiere cancelar.

WSCFDI EDICOM | 2.Funciones | 75


WSCFDI EDICOM

• rfcR: RFC del receptor del comprobante que se quiere cancelar.

• uuid: Uuid del comprobante que se quiere cancelar.

• total: Total del comprobante que se quiere cancelar.

• test: indica si la cancelación se hace sobre un comprobante timbrado en el entorno de Test o en el de


Producció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.

• statusCode: Código del SAT para definir el estado de la cancelación.

• rfcE: RFC del emisor del comprobante.

• status: Estado de la cancelación en texto.

• uuid: UUID del comprobante cancelado.

• cancelQueryData: Es la información de la consulta realizada al SAT tras realizarse la


cancelación. Devuelve el estado final del comprobante tras la operación. Contiene los
siguientes campos:

• statusCode: Código del SAT para definir el estado del comprobante.

• isCancelable: Indica si el comprobante es cancelable o no.

• status: Estado del comprobante en modo texto.

• cancelStatus: Estado de la cancelación del comprobante.

• 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:

public CancelaResponse cancelaCFDiSignedAsync(String user, String pass, byte[]


sign, String rfcE, String rfcR, String uuid, Double total, boolean test) {
CancelData cancelData = null;
try {
cancelData = cfdiService.cancelaCFDiSignedAsync(user, pass, sign,
rfcE, rfcR, uuid, total, test);

WSCFDI EDICOM | 2.Funciones | 76


WSCFDI EDICOM

} 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 cancelData;
}

Petición SOAP:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:cancelCFDiSignedAsync>
<cfdi:user>xxxxxx</cfdi:user>
<cfdi:password>xxxxxx</cfdi:password>
<cfdi:sign>MIIJuQIBAzCCCX8GCSqGSIb3DQEHAaCCCXAEgglsMIIJaDCCBB8GCSqGSIb3DQEHBqCCBB
AwggQMAgEAMIIEBQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIkI0BwQTfWEQCAggAgIID2DzPnHd
OA4XWGeanHoCuRitvCJJecEBSkqvg8ohliY7IiVp8qF3agvOqt32kbEDXHfrLpVVhlPnjrZo4
[...]
Hzl11kfETcJiuMUNa5hOx5CiB2WqAg/
tV9MDOdUZEkN4E+N9xxSxPAkSw75RvvVfRPW4JFXbmfs7c230aPodMQP58PfaJilI/
Nm8cvAQXIEwRugMSUwIwYJKoZIhvcNAQkVMRYEFBlCuYgPj26y+M2HK9s6Tpe2JmgCMDEwITAJBgUrDgM
CGgUABBSz8OKBcbpiR69Tw0UJ1d1D2xW0EQQIar9uSxM7uToCAggA</cfdi:sign>
<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:cancelCFDiSignedAsync>
</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 asíncrona firmada satisfactoria.

WSCFDI EDICOM | 2.Funciones | 77


WSCFDI EDICOM

<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>

Ejemplo de una respuesta de error.

<?xml version="1.0" encoding="UTF-8"?>


<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 cancelar el comprobante.</faultstring>

WSCFDI EDICOM | 2.Funciones | 78


WSCFDI EDICOM

<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.

Ejemplo de una respuesta de error del servicio de EDICOM.

<?xml version="1.0" encoding="UTF-8"?>


<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 cancelar los UUIDs especificados.</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>201</ns1:cod>

WSCFDI EDICOM | 2.Funciones | 79


WSCFDI EDICOM

<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>

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.

2.20. COMPROBACIÓN DEL ESTADO DE UN COMPROBANTE

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.

• password: Contraseña del usuario que va realizar la conexión.

• rfcE: RFC del emisor del comprobante que se quiere cancelar.

• rfcR: RFC del receptor del comprobante que se quiere cancelar.

• uuid: Uuid del comprobante que se quiere cancelar.

• total: Total del comprobante que se quiere cancelar.

• test: indica si la cancelación se hace sobre un comprobante timbrado en el entorno de Test o en el de


Producción.

RESPUESTA:

WSCFDI EDICOM | 2.Funciones | 80


WSCFDI EDICOM

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:

• statusCode: Código del SAT para definir el estado del comprobante.

• isCancelable: Indica si el comprobante es cancelable o no.

• status: Estado del comprobante en modo texto.

• cancelStatus: Estado de la cancelación 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:

<?xml version="1.0" encoding="UTF-8"?>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cfdi="http://cfdi.service.ediwinws.edicom.com">
<soapenv:Header/>
<soapenv:Body>
<cfdi:getCFDiStatus>

WSCFDI EDICOM | 2.Funciones | 81


WSCFDI EDICOM

<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.

El siguiente ejemplo es una respuesta de error.

<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>

WSCFDI EDICOM | 2.Funciones | 82


WSCFDI EDICOM

<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>

Nota: En este ejemplo concreto se presenta un error "202" No se ha podido comprobar el


UUID del comprobante.

Para ver una lista completa de los posibles códigos de error y respuestas asociadas consultar el punto Lista de
Códigos de Error.

WSCFDI EDICOM | 2.Funciones | 83


WSCFDI EDICOM

3. 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.

CÓDIGOS DEFINIDOS POR EL SAT


Estos códigos han sido definidos como códigos de error estándar por el SAT. Se indican también las posibles
respuestas literales causadas de estos errores.
Código Error
301 El comprobante no cumple con el estándar XML (Conforme al W3C) o con la estructura XML (XSD y
complementos aplicables).

El documento no es correcto sintácticamente.

El documento <referencia> no esta codificado en UTF-8.

El documento <referencia> contiene Addenda.
302 El sello del emisor no es válido.

El documento <referencia> no está firmado.

Error al verificar la firma del documento <referencia>. El CFDi fue firmado de manera incorrecta.
303 El CSD del emisor no corresponde al RFC que viene como emisor en el comprobante.

El certificado <serialRfc> con el que se ha firmado el documento <referencia> no pertenece al rfc
<emisorRfc>.
304 El CSD del emisor ha sido revocado, utilizando la lista de LCO.

El certificado <serialRfc> del RFC <emisorRfc> ha sido revocado (según LCO).
305 La fecha de emisión no está dentro de la vigencia del CSD del emisor.

El certificado <serialRfc> todavía no es válido para la fecha del documento <referencia>
<fecha_documento>.

El certificado <serialRfc> ya no es válido para la fecha del documento <referencia>
<fecha_documento>.
306 La llave utilizada para sellar corresponde a un FIEL (no a un CSD).

El certificado <serialRfc> es de tipo FIEL, no es un CSD.
307 Contiene un timbre previo.

El documento <referencia> ya ha sido firmado <hash>.

El documento <referencia> ya ha sido timbrado previamente por algún PAC con UUID <uuid>.
308 El CSD del emisor no ha sido firmado por un certificado de autoridad del SAT.

El certificado <serialRfc> no ha sido expedido por el Servicio de Administración Tributaria.
401 La fecha de generación es mayor a 72 horas de la emisión del timbre.

No puede firmarse el documento <referencia> con fecha <fecha>. Han pasado más de 72 horas
desde su generación.

No puede firmarse el documento <referencia> con fecha <fecha>. La fecha es posterior a la
actual.
402 El RFC no existe conforme al régimen autorizado (Lista de validación de régimen) LCO.

Error al verificar la firma del documento <referencia>. El CFDi fue firmado de manera incorrecta.
El RFC <emisorRfc> no está autorizado a firmar (según LCO).
403 La fecha de emisión es anterior al 01 de Enero de 2011.

La fecha de emisión del comprobante no puede ser anterior al 01 de Enero de 2011.

CÓDIGOS DEFINIDOS POR EDICOM


Estos códigos afectan a errores relacionados con la aplicación de EDICOM. Se indican también los posibles
escenarios en que se presentan estos errores.
Código Error
200 No se ha podido cambiar el password del usuario.

WSCFDI EDICOM | 3.Lista de Códigos de Error | 84


WSCFDI 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.

EJEMPLO DE UNA RESPUESTA DE ERROR


<?xml version="1.0" encoding="UTF-8"?>
<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: El
documento &lt;SE3> no está codificado en UTF-8</faultstring>
<detail>
<ns1:fault xmlns:ns1="http://cfdi.service.ediwinws.edicom.com">
<ns1:cod>301</ns1:cod>
<ns1:text>El documento &lt;referencia> no está codificado en UTF-
8</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>

WSCFDI EDICOM | 3.Lista de Códigos de Error | 85


WSCFDI EDICOM

4. ANEXO: WSDL

4.1. WSDL WEBSERVICE CFDI

El contenido del WSDL del servicio es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>


<wsdl:definitions
targetNamespace="http://cfdi.service.ediwinws.edicom.com"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://cfdi.service.ediwinws.edicom.com"
xmlns:intf="http://cfdi.service.ediwinws.edicom.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by EdiwinWS-->
<wsdl:types>
<schema elementFormDefault="qualified"
targetNamespace="http://cfdi.service.ediwinws.edicom.com"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="getCfdiAck">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element maxOccurs="unbounded" name="uuid" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="getCfdiAckResponse">
<complexType>
<sequence>
<element name="getCfdiAckReturn" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<complexType name="CFDiException">
<sequence>
<element name="cod" type="xsd:int"/>
<element name="text" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="fault" type="impl:CFDiException"/>
<element name="getCFDiStatus">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>

WSCFDI EDICOM | 4.Anexo: WSDL | 86


WSCFDI EDICOM

<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="test" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
<element name="getCFDiStatusResponse">
<complexType>
<sequence>
<element name="getCFDiStatusReturn"
type="impl:CancelQueryData"/>
</sequence>
</complexType>
</element>
<complexType name="CancelQueryData">
<sequence>
<element name="cancelStatus" nillable="true" type="xsd:string"/
>
<element name="isCancelable" nillable="true" type="xsd:string"/
>
<element name="status" nillable="true" type="xsd:string"/>
<element name="statusCode" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="cancelaCFDi">
<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"/>
<element name="pfx" type="xsd:base64Binary"/>
<element name="pfxPassword" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="cancelaCFDiResponse">
<complexType>
<sequence>
<element name="cancelaCFDiReturn" type="impl:CancelaResponse"/
>
</sequence>
</complexType>
</element>
<complexType name="ArrayOf_xsd_string">

WSCFDI EDICOM | 4.Anexo: WSDL | 87


WSCFDI EDICOM

<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>

WSCFDI EDICOM | 4.Anexo: WSDL | 88


WSCFDI EDICOM

</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>

WSCFDI EDICOM | 4.Anexo: WSDL | 89


WSCFDI EDICOM

<element name="getCfdiFromUUIDReturn" type="xsd:base64Binary"/


>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdi">
<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="getTimbreCfdiResponse">
<complexType>
<sequence>
<element name="getTimbreCfdiReturn" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="exportCfdi">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="rfc" type="xsd:string"/>
<element name="iniDate" type="xsd:dateTime"/>
<element name="endDate" type="xsd:dateTime"/>
</sequence>
</complexType>
</element>
<element name="exportCfdiResponse">
<complexType>
<sequence>
<element name="exportCfdiReturn" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getCfdiRetenciones">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>

WSCFDI EDICOM | 4.Anexo: WSDL | 90


WSCFDI EDICOM

</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"/>

WSCFDI EDICOM | 4.Anexo: WSDL | 91


WSCFDI EDICOM

<element name="password" type="xsd:string"/>


<element name="file" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getTimbreCfdiRetencionesTestResponse">
<complexType>
<sequence>
<element name="getTimbreCfdiRetencionesTestReturn"
type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="cancelaCFDiRetenciones">
<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"/>
<element name="pfx" type="xsd:base64Binary"/>
<element name="pfxPassword" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="cancelaCFDiRetencionesResponse">
<complexType>
<sequence>
<element name="cancelaCFDiRetencionesReturn"
type="impl:CancelaResponse"/>
</sequence>
</complexType>
</element>
<element name="cancelaCFDiRetencionesSigned">
<complexType>
<sequence>
<element name="user" type="xsd:string"/>
<element name="password" type="xsd:string"/>
<element name="sign" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="cancelaCFDiRetencionesSignedResponse">
<complexType>
<sequence>
<element name="cancelaCFDiRetencionesSignedReturn"
type="impl:CancelaResponse"/>

WSCFDI EDICOM | 4.Anexo: WSDL | 92


WSCFDI EDICOM

</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"/>

WSCFDI EDICOM | 4.Anexo: WSDL | 93


WSCFDI EDICOM

<element name="sign" type="xsd:base64Binary"/>


</sequence>
</complexType>
</element>
<element name="cancelaCFDiSignedResponse">
<complexType>
<sequence>
<element name="cancelaCFDiSignedReturn"
type="impl:CancelaResponse"/>
</sequence>
</complexType>
</element>
<element name="getCfdi">
<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="getCfdiResponse">
<complexType>
<sequence>
<element name="getCfdiReturn" type="xsd:base64Binary"/>
</sequence>
</complexType>
</element>
<element name="getUUID">
<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="getUUIDResponse">
<complexType>
<sequence>
<element name="getUUIDReturn" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="changePassword">
<complexType>
<sequence>

WSCFDI EDICOM | 4.Anexo: WSDL | 94


WSCFDI EDICOM

<element name="user" type="xsd:string"/>


<element name="password" type="xsd:string"/>
<element name="newPassword" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="changePasswordResponse">
<complexType>
<sequence>
<element name="changePasswordReturn" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name="getCFDiStatusResponse">
<wsdl:part element="impl:getCFDiStatusResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getTimbreCfdiTestResponse">
<wsdl:part element="impl:getTimbreCfdiTestResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUUIDTestResponse">
<wsdl:part element="impl:getUUIDTestResponse"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelCFDiSignedAsyncRequest">
<wsdl:part element="impl:cancelCFDiSignedAsync"
name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="CFDiException">
<wsdl:part element="impl:fault" name="fault">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCFDiStatusRequest">
<wsdl:part element="impl:getCFDiStatus" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="cancelaCFDiResponse">
<wsdl:part element="impl:cancelaCFDiResponse"
name="parameters">
</wsdl:part>
</wsdl:message>

WSCFDI EDICOM | 4.Anexo: WSDL | 95


WSCFDI EDICOM

<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">

WSCFDI EDICOM | 4.Anexo: WSDL | 96


WSCFDI EDICOM

<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">

WSCFDI EDICOM | 4.Anexo: WSDL | 97


WSCFDI EDICOM

<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>

WSCFDI EDICOM | 4.Anexo: WSDL | 98


WSCFDI EDICOM

<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>

WSCFDI EDICOM | 4.Anexo: WSDL | 99


WSCFDI EDICOM

<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>

WSCFDI EDICOM | 4.Anexo: WSDL | 100


WSCFDI EDICOM

</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>

WSCFDI EDICOM | 4.Anexo: WSDL | 101


WSCFDI EDICOM

<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">

WSCFDI EDICOM | 4.Anexo: WSDL | 102


WSCFDI EDICOM

</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>

WSCFDI EDICOM | 4.Anexo: WSDL | 103


WSCFDI EDICOM

<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">

WSCFDI EDICOM | 4.Anexo: WSDL | 104


WSCFDI EDICOM

<wsdlsoap:fault name="CFDiException" use="literal"/>


</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="cancelCFDiAsync">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="cancelCFDiAsyncRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="cancelCFDiAsyncResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getUUIDTest">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getUUIDTestRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getUUIDTestResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiTest">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCfdiTestRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCfdiTestResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="CFDiException">
<wsdlsoap:fault name="CFDiException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="getCfdiFromUUID">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCfdiFromUUIDRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCfdiFromUUIDResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>

WSCFDI EDICOM | 4.Anexo: WSDL | 105


WSCFDI EDICOM

<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"/>

WSCFDI EDICOM | 4.Anexo: WSDL | 106


WSCFDI EDICOM

</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">

WSCFDI EDICOM | 4.Anexo: WSDL | 107


WSCFDI EDICOM

<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>

WSCFDI EDICOM | 4.Anexo: WSDL | 108


WSCFDI EDICOM

<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>

Para acceder a la última versión de la WSDL a través de Internet:

https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl

WSCFDI EDICOM | 4.Anexo: WSDL | 109

También podría gustarte