1. Home
  2. CFDI 3.2
  3. Como Timbrar CFDI 3.2

Como Timbrar CFDI 3.2

app-flow-timbrado.fw.png

 

Versiones de Timbrado

Actualmente contamos con 6 versiones de timbrado las cuales cumplen distintas funciones:

Version Timbrado
Request al Servidor
Response del Servidor
TimbrarCFDI Soap Envelope Complemento TFD
Timbrar String XML, String Token Complemento TFD
TimbrarV2 String XML, String Token Valida que no este timbrado previamente y en caso de estarlo regresa un el mismo comprobante previamente timbrado en caso contrario genera un nuevo TimbreFiscalDigital:

Comprobante CFDI + Complemento TFD

TimbrarV3 String XML, String Token Valida que no este timbrado previamente y en caso de estarlo regresa un soap exception en caso contrario regresa:

Comprobante CFDI + Complemento TFD

TimbrarV4 String XML, String Token No valida duplicados, genera un nuevo timbre y regresa:

Comprobante CFDI + Complemento TFD

TimbrarV5 String XML, String Token Antes de timbrar retira el complemento addenda, posteriormente lo timbra y al final vuelve ha insertar el complemento addenda.

Comprobante CFDI + Complemento TFD + Complemento Addenda

TimbrarV6 String XML en Base64, String Token Valida que no este timbrado previamente y en caso de estarlo regresa un el mismo comprobante previamente timbrado en caso contrario genera un nuevo TimbreFiscalDigital:

Resultado : cadenaOriginal,certificadoSAT,cfdiTimbrado,fechaTimbrado,qrCode,selloSAT,uuid,versionTFD

URL de pruebas

http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx

 

Para poder consumir el servicio en lenguajes como C# o JAVA es necesario primero agregar la referencia al servicio web.

 

TimbrarCFDI

TimbrarCFDI recibe un comprobante sellado en formato string o en su defecto en bytes, retornando el complemento timbre en caso de ser exitosas las validaciones, o en su defecto retorna una excepción detallando el error de validación.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito

Paso 2: Se envían los datos del CFDI tipo objeto que genera la referencia del servicio.

A continuación se enviara el comprobante ya sellado, esto se hará mediante la librería correspondiente, o en su defecto en formato Curl.

 Request Envelope XML

TimbrarXML

TimbrarXML recibe un soap envelope con un xml sellado, así como el token de acceso, retornando el complemento tfd en formato string, en caso de ser exitosas las validaciones, o en su defecto retorna una excepción detallando el error de validación.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito

Paso 2: Enviar XML sellado en formato string.

A continuación se deberá enviar la información necesaria para generar el complemento timbre, esto se refiere al XML sellado, así como el token de acceso respetando la siguiente estructura:

 

	
using System;
using System.IO;
using Test.Autenticacion;
using Test.Timbrado;
 
namespace Test
{
    class Program
    {
        static void Main()
        {
            try
            {
                wsAutenticacionSoapClient Autentica = new wsAutenticacionSoapClient();
                wsTimbradoSoapClient Timbrado = new wsTimbradoSoapClient();
                string Token = Autentica.AutenticarBasico("demo", "123456789");
                string XML = File.ReadAllText("factura1peso.xml");
                string Result = Timbrado.TimbrarXML(XML, Token);
                Console.WriteLine(Result);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 public static void main(String... args) {
        WsTimbrado stamp = new WsTimbrado();
       
        WsTimbradoSoap soap = stamp.getWsTimbradoSoap();
        String timbre = soap.timbrarXML("xmlComprobante", "tokenAutenticacion");
        
       
       System.out.println(timbre);
    }

	
<?php $options = array("trace" => 1, "exceptions" => true);
    
    $urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL";
     
      
    try
    {
       
        $timbrado = new SoapClient($urlTimbrado, $options);
       
       
         
        $timbrarData = array("xmlComprobante" => "aqui tu xml", "tokenAutenticacion" => "aqui tu token");
        $result = $timbrado->TimbrarXML($timbrarData)->TimbrarXMLResult;
        header("Content-type: text/xml");
        echo $result;
        
       
    }
    catch(Exception $e)
    {
        die($e->getMessage());
    }
?>

from suds.client import Client
import sys
 
reload(sys)
sys.setdefaultencoding("utf-8")

urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL"

timbrado = Client(urlTimbrado, faults = False)
  
try:
    token = autentica.service.AutenticarBasico("demo", "123456789")
    xml = None
    with open("archivo_a_timbrar.xml2) as f:
        xml = f.read()
     
    """ Fix """
    xml = xml.replace("&amp;","&amp;amp;")
 
    result = timbrado.service.TimbrarXML(xml, token)
    print(result)
 
except Exception as e:
    print(e)

 

Timbrar XML V2

Timbrar XML V2 recibe un soap envelope con un xml sellado, asi como el token de acceso, retornando el comprobante timbrado en formato string.

Valida que el sello del comprobante no este duplicado, si esta duplicado regresa el comprobante con el mismo timbre con el que anteriormente fue timbrado.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito

Paso 2: Enviar XML sellado

A continuación se deberá enviar la información necesaria para generar el complemento timbre, esto se refiere al XML sellado, así como el token de acceso respetando la siguiente estructura:

 

	
using System;
using System.IO;
using Test.Autenticacion;
using Test.Timbrado;
 
namespace Test
{
    class Program
    {
        static void Main()
        {
            try
            {
               
                wsTimbradoSoapClient Timbrado = new wsTimbradoSoapClient();
              
                string Result = Timbrado.TimbrarXMLV2("Tu XML", "Tu Token");
                Console.WriteLine(Result);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 public static void main(String... args) {
        WsTimbrado stamp = new WsTimbrado();
       
        WsTimbradoSoap soap = stamp.getWsTimbradoSoap();
        String timbre = soap.timbrarXMLV2("xmlComprobante", "tokenAutenticacion");
        
       
       System.out.println(timbre);
    }

	
<?php $options = array("trace" => 1, "exceptions" => true);
    
    $urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL";
     
      
    try
    {
       
        $timbrado = new SoapClient($urlTimbrado, $options);
       
       
         
        $timbrarData = array("xmlComprobante" => "aqui tu xml", "tokenAutenticacion" => "aqui tu token");
        $result = $timbrado->TimbrarXMLV2($timbrarData)->TimbrarXMLV2Result;
        header("Content-type: text/xml");
        echo $result;
        
       
    }
    catch(Exception $e)
    {
        die($e->getMessage());
    }
?>

from suds.client import Client
import sys
 
reload(sys)
sys.setdefaultencoding("utf-8")

urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL"

timbrado = Client(urlTimbrado, faults = False)
  
try:
   
    xml = None
    with open("archivo_a_timbrar.xml2) as f:
        xml = f.read()
     
    """ Fix """
    xml = xml.replace("&amp;","&amp;amp;")
 
    result = timbrado.service.TimbrarXMLV2(xml, token)
    print(result)
 
except Exception as e:
    print(e)

 

TimbrarV3

Timbrar XML V3 recibe un soap envelope con un xml sellado, asi como el token de acceso, retornando el comprobante timbrado en formato string.

Valida que el sello del comprobante no este duplicado, si esta duplicado regresa un soap exception.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito

Paso 2: Enviar XML sellado

A continuación se debera enviar la información necesaria para generar el complemento timbre, esto se refiere al XML sellado, asi como el token de acceso respetando la siguiente estructura:

 

	
using System;
using System.IO;
using Test.Autenticacion;
using Test.Timbrado;
 
namespace Test
{
    class Program
    {
        static void Main()
        {
            try
            {
               
                wsTimbradoSoapClient Timbrado = new wsTimbradoSoapClient();
              
                string Result = Timbrado.TimbrarXMLV3("Tu XML", "Tu Token");
                Console.WriteLine(Result);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 public static void main(String... args) {
        WsTimbrado stamp = new WsTimbrado();
       
        WsTimbradoSoap soap = stamp.getWsTimbradoSoap();
        String timbre = soap.timbrarXMLV3("xmlComprobante", "tokenAutenticacion");
        
       
       System.out.println(timbre);
    }

	
&lt;?php $options = array("trace" =&gt; 1, "exceptions" =&gt; true);
    
    $urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL";
     
      
    try
    {
       
        $timbrado = new SoapClient($urlTimbrado, $options);
       
       
         
        $timbrarData = array("xmlComprobante" =&gt; "aqui tu xml", "tokenAutenticacion" =&gt; "aqui tu token");
        $result = $timbrado-&gt;TimbrarXMLV3($timbrarData)-&gt;TimbrarXMLV3Result;
        header("Content-type: text/xml");
        echo $result;
        
       
    }
    catch(Exception $e)
    {
        die($e-&gt;getMessage());
    }
?&gt;

from suds.client import Client
import sys
 
reload(sys)
sys.setdefaultencoding("utf-8")

urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL"

timbrado = Client(urlTimbrado, faults = False)
  
try:
   
    xml = None
    with open("archivo_a_timbrar.xml2) as f:
        xml = f.read()
     
    """ Fix """
    xml = xml.replace("&amp;amp;","&amp;amp;amp;")
 
    result = timbrado.service.TimbrarXMLV3(xml, token)
    print(result)
 
except Exception as e:
    print(e)

TimbrarV4

Timbrar XML V4 recibe un soap envelope con un xml sellado, asi como el token de acceso, retornando el comprobante timbrado en formato string.

No valida duplicados, genera un nuevo timbre.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito.

Paso 2: Enviar XML sellado

A continuación se deberá enviar la información necesaria para generar el complemento timbre, esto se refiere al XML sellado, asi como el token de acceso respetando la siguiente estructura:

 

	
using System;
using System.IO;
using Test.Autenticacion;
using Test.Timbrado;
 
namespace Test
{
    class Program
    {
        static void Main()
        {
            try
            {
               
                wsTimbradoSoapClient Timbrado = new wsTimbradoSoapClient();
              
                string Result = Timbrado.TimbrarXMLV4("Tu XML", "Tu Token");
                Console.WriteLine(Result);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 public static void main(String... args) {
        WsTimbrado stamp = new WsTimbrado();
       
        WsTimbradoSoap soap = stamp.getWsTimbradoSoap();
        String timbre = soap.timbrarXMLV4("xmlComprobante", "tokenAutenticacion");
        
       
       System.out.println(timbre);
    }

	
&amp;lt;?php $options = array("trace" =&amp;gt; 1, "exceptions" =&amp;gt; true);
    
    $urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL";
     
      
    try
    {
       
        $timbrado = new SoapClient($urlTimbrado, $options);
       
       
         
        $timbrarData = array("xmlComprobante" =&amp;gt; "aqui tu xml", "tokenAutenticacion" =&amp;gt; "aqui tu token");
        $result = $timbrado-&amp;gt;TimbrarXMLV4($timbrarData)-&amp;gt;TimbrarXMLV4Result;
        header("Content-type: text/xml");
        echo $result;
        
       
    }
    catch(Exception $e)
    {
        die($e-&amp;gt;getMessage());
    }
?&amp;gt;

from suds.client import Client
import sys
 
reload(sys)
sys.setdefaultencoding("utf-8")

urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL"

timbrado = Client(urlTimbrado, faults = False)
  
try:
   
    xml = None
    with open("archivo_a_timbrar.xml2) as f:
        xml = f.read()
     
    """ Fix """
    xml = xml.replace("&amp;amp;amp;","&amp;amp;amp;amp;")
 
    result = timbrado.service.TimbrarXMLV4(xml, token)
    print(result)
 
except Exception as e:
    print(e)

TimbrarV5

Timbrar XML V5 recibe un soap envelope con un xml sellado, asi como el token de acceso, retornando el comprobante timbrado en formato string.

Antes de timbrar retira el complemento addenda, si todo esta correcto, timbra el comprobante, vuelve ha insertar el complemento addenda, y regresa el comprobante timbrado con los addendas que tenia.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito

Paso 2: Enviar XML sellado

A continuación se deberá enviar la información necesaria para generar el complemento timbre, esto se refiere al XML sellado, asi como el token de acceso respetando la siguiente estructura:

	
using System;
using System.IO;
using Test.Autenticacion;
using Test.Timbrado;
 
namespace Test
{
    class Program
    {
        static void Main()
        {
            try
            {
               
                wsTimbradoSoapClient Timbrado = new wsTimbradoSoapClient();
              
                string Result = Timbrado.TimbrarXMLV5("Tu XML", "Tu Token");
                Console.WriteLine(Result);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 public static void main(String... args) {
        WsTimbrado stamp = new WsTimbrado();
       
        WsTimbradoSoap soap = stamp.getWsTimbradoSoap();
        String timbre = soap.timbrarXMLV5("xmlComprobante", "tokenAutenticacion");
        
       
       System.out.println(timbre);
    }

	
&amp;amp;lt;?php $options = array("trace" =&amp;amp;gt; 1, "exceptions" =&amp;amp;gt; true);
    
    $urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL";
     
      
    try
    {
       
        $timbrado = new SoapClient($urlTimbrado, $options);
       
       
         
        $timbrarData = array("xmlComprobante" =&amp;amp;gt; "aqui tu xml", "tokenAutenticacion" =&amp;amp;gt; "aqui tu token");
        $result = $timbrado-&amp;amp;gt;TimbrarXMLV5($timbrarData)-&amp;amp;gt;TimbrarXMLV5Result;
        header("Content-type: text/xml");
        echo $result;
        
       
    }
    catch(Exception $e)
    {
        die($e-&amp;amp;gt;getMessage());
    }
?&amp;amp;gt;

from suds.client import Client
import sys
 
reload(sys)
sys.setdefaultencoding("utf-8")

urlTimbrado = "http://pruebascfdi.smartweb.com.mx/Timbrado/wsTimbrado.asmx?WSDL"

timbrado = Client(urlTimbrado, faults = False)
  
try:
   
    xml = None
    with open("archivo_a_timbrar.xml2) as f:
        xml = f.read()
     
    """ Fix """
    xml = xml.replace("&amp;amp;amp;amp;","&amp;amp;amp;amp;amp;")
 
    result = timbrado.service.TimbrarXMLV5(xml, token)
    print(result)
 
except Exception as e:
    print(e)

TimbrarV6

Timbrar XML V6 recibe un soap envelope con un xml sellado en base 64 y un token de acceso. Como resultado el servicio regresa cadenaOriginal,certificadoSAT,cfdiTimbrado,fechaTimbrado,qrCode,selloSAT,uuid,versionTFD.

Valida que el sello del comprobante no este duplicado, si esta duplicado regresa el comprobante con el mismo timbre con el que anteriormente fue timbrado.

Paso 1: Obtener token de acceso, o en su defecto usar token infinito

Paso 2: Enviar XML sellado en base 64.

A continuación se deberá enviar la información necesaria para generar el complemento timbre, esto se refiere al XML sellado, así como el token de acceso respetando la siguiente estructura:

 

Updated on mayo 26, 2017

Was this article helpful?

Related Articles