1. Home
  2. Timbrado Versión 1

Timbrado Versión 1

Esta versión te regresa solo el TFD de la factura (cfdi) que mandaste a timbrar.

Timbrar CFDI recibe un comprobante sellado en formato string o en su defecto en bytes, posteriormente retorna el complemento Timbre Fiscal Digital (TFD) correspondiente al xml que se mando a timbrar ó en su defecto retorna una excepción detallando el error de validación.

Pasos para poder timbrar una factura:

Importante

Cabe mencionar que el comprobante deberá ser debidamente emitido y sellado con los nuevos estándares de la versión 3.3 de CFDI. Si aun no esta familiarizado , o desea saber mas acerca de el, lo invitamos a leer la sección CFDI 3.3.

HTTP Request y Response

A continuación se muestran ejemplos del HTTP Request y sus respectivos HTTP Response para esta versión de timbrado.

Códigos de Response

Los códigos más comunes que se pueden recibir en peticiones REST son las siguientes:

  • 200: Significa que la petición fue exitosa y se timbró la factura.
  • 400: Significa que hubo un error en la solicitud del servicio, por lo general son errores de estructura del comprobante.
  • 401: Significa que hubo un error de autorización, por lo general es porque el token o el usuario y password son incorrectos.
  • 404: Significa que no puede encontrar el path de timbrado, por lo general es porque colocaron de manera erronea la URL del servicio REST.

HTTP Request

HTTP Response 200

HTTP Response 400

HTTP Response 401

HTTP Response 404

 

Modalidad base 64

A continuación se muestran ejemplos del HTTP Request y sus respectivos HTTP Response para esta versión de timbrado en modalidad base64.

 

 

HTTP Request

HTTP Response 200

HTTP Response 400

HTTP Response 401

HTTP Response 404

 

Timbrar con las librerias

Si esta utilizando el xml de ejemplo del repositorio es posible que obtenga el mensaje de fecha expirada lo cual indica que hizo bien el procedimiento sin embargo el xml ya venció, así que no se preocupe eso es normal.


Ir al Repositorio de C# en GitHub

using System;
using System.IO;
using System.Text;
using SW.Helpers;
using SW.Services.Stamp;
 
namespace ExampleSDK
{
    class Program
    {
        static void Main()
        {
            try
            {
                //Ejemplo Timbrado utilizando la librería sw-sdk ( https://www.nuget.org/packages/SW-sdk/ )
                //Para mayor referencia: https://github.com/lunasoft/sw-sdk-dotnet
                //Creamos una instancia de tipo Stamp 
                //A esta le pasamos la Url, Usuario y Contraseña para obtener el token
                //Automaticamente despues de obtenerlo se procedera a timbrar el xml
                Stamp stamp = new Stamp("http://services.test.sw.com.mx", "demo", "123456789");
                string xml = Encoding.UTF8.GetString(File.ReadAllBytes("file.xml"));
                StampResponseV1 response = stamp.TimbrarV1(xml);
            }
            catch (Exception e)
            {
            }
        }
    }
}


Ir al Repositorio de PHP en GitHub

<?php
	require_once "vendor/autoload.php";
	use SWServices\Stamp\StampService as StampService;

	 try{
		header("Content-type: application/json");
		$params = array(
			"url"=>"http://services.test.sw.com.mx",
			"user"=>"demo",
			"password"=>"123456789"
			);
		$xml = file_get_contents("./file.xml");
		$stamp = StampService::Set($params);
		$result = $stamp::StampV1($xml);
		echo $result;

	}
	catch(Exception $e){
		header("Content-type: text/plain");
		echo "Caught exception: ",  $e->getMessage();
	}
?>;


Ir al Repositorio de Java en GitHub

package Tests.Stamp;
import Exceptions.AuthException;
import Exceptions.GenaralException;
import Services.Stamp.SWStampService;
 
public class StampTest {
 
    public static void main() throws AuthException, GenaralException, IOException {
        try{
        //Ejemplo Timbrado utilizando la librería sw-java ( https://search.maven.org/#search%7Cga%7C1%7Ca%3A%22SW-JAVA%22 )
        //Para mayor referencia: https://github.com/lunasoft/sw-sdk-java
        //Es preferible inicializar el objeto con el usuario y password de nuestra cuenta, en caso contrario se puede incluir solamente el token de acceso
        //Se especifica el base path, esto para consumir el api de pruebas o productivo
        SWStampService api = new SWStampService("demo","123456789","http://services.test.sw.com.mx");
        
        //Se inicializa un objeto response, que obtendra la respuesta del api
        SuccessV1Response response = null;
        
        //Se asigna el resultado de la respuesta a dicho objeto
        //Se ejecuta el metodo "Stamp", que timbrara nuestro comprobante posteriormente sellado, asi como la versión del servicio de timbrado,
        //puede ver mas de estas versiones en el apartado "Versiones de timbrado"
        response = (SuccessV1Response)api.Stamp(Utils.dummy_xml_string,"v1");
        
        //El objeto response tendra así los atributos:
        // Status: estado de la petición procesada, puede ser : "success", "fail", "error"
        // HttpStatusCode: Codigo de respuesta HTTP del servidor: eg. 200, 400, 500
        // Data: Cuerpo de la respuesta que arroja el servidor
        //En este caso arrojara el complemento timbre: {"tfd":"&amp;amp;lt;Complemento&amp;amp;gt;"}
        System.out.println(response.Status);
        System.out.println(response.HttpStatusCode);
        System.out.println(response.tfd);
       //En caso de obtener estatus "fail", "error"
        //Se puede visualizar en los campos message, messageDetail
        System.out.println(response.message);
        System.out.println(response.messageDetail);
        
        }
        catch(Exception e){
            
            System.out.println(e.getMessage());
        }
      }
}

curl --request POST 
  --url http://services.test.sw.com.mx/cfdi33/stamp/v1 
  --header "authorization: T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbXB3YVZxTHdOdHAwVXY2NTdJb1hkREtXTzE3dk9pMmdMdkFDR2xFWFVPUXpTUm9mTG1ySXdZbFNja3FRa0RlYURqbzdzdlI2UUx1WGJiKzViUWY2dnZGbFloUDJ6RjhFTGF4M1BySnJ4cHF0YjUvbmRyWWpjTkVLN3ppd3RxL0dJPQ.T2lYQ0t4L0RHVkR4dHZ5Nkk1VHNEakZ3Y0J4Nk9GODZuRyt4cE1wVm5tbFlVcU92YUJTZWlHU3pER1kySnlXRTF4alNUS0ZWcUlVS0NhelhqaXdnWTRncklVSWVvZlFZMWNyUjVxYUFxMWFxcStUL1IzdGpHRTJqdS9Zakw2UGRiMTFPRlV3a2kyOWI5WUZHWk85ODJtU0M2UlJEUkFTVXhYTDNKZVdhOXIySE1tUVlFdm1jN3kvRStBQlpLRi9NeWJrd0R3clhpYWJrVUMwV0Mwd3FhUXdpUFF5NW5PN3J5cklMb0FETHlxVFRtRW16UW5ZVjAwUjdCa2g0Yk1iTExCeXJkVDRhMGMxOUZ1YWlIUWRRVC8yalFTNUczZXdvWlF0cSt2UW0waFZKY2gyaW5jeElydXN3clNPUDNvU1J2dm9weHBTSlZYNU9aaGsvalpQMUxrUndzK0dHS2dpTittY1JmR3o2M3NqNkh4MW9KVXMvUHhZYzVLQS9UK2E1SVhEZFJKYWx4ZmlEWDFuSXlqc2ZRYXlUQk1ldlZkU2tEdU10NFVMdHZKUURLblBxakw0SDl5bUxabDFLNmNPbEp6b3Jtd2Q1V2htRHlTdDZ6eTFRdUNnYnVvK2tuVUdhMmwrVWRCZi9rQkU9.7k2gVCGSZKLzJK5Ky3Nr5tKxvGSJhL13Q8W-YhT0uIo" 
  --header "cache-control: no-cache" 
  --form xml=@33.xml


La informacion de como autenticarse para esta libreria la puedes encontrar en este Enlace


La informacion de como autenticarse para esta libreria la puedes encontrar en este Enlace


La informacion de como autenticarse para esta libreria la puedes encontrar en este Enlace


Ir al Repositorio de Node.js en GitHub

const fs = require("fs"); //referencia al módulo File System
const StampService = require("sw-sdk-nodejs").StampService; //referencia al módulo de timbrado

var params = { //parámetros para la autenticación
	user: "demo",
	password: "123456789",
	url: "services.test.sw.com.mx",
};
 
fs.readFile("./file.xml", "utf8", function(err, contents) { //leemos el archivo xml
	if(err) { //si ocurrió un error al leer el archivo lo mostramos
		let errRes = {
			status: "error",
			message: err.message,
			messageDetail: err.message
		}
		console.log(errRes);
	} else { //en caso contrario creamos un callback donde se manipula la información
		var callback = (error, data) => {
			if(error)//si ocurre un error, aqui lo manipulamos
				console.log(error);
			else //manipulamos el resultado
				console.log(data);
		};

    	let xml = contents; //asignamos el contenido del archivo
    	let stamp = StampService.Set(params);//asignamos los parámetros al stampservice
    	stamp.StampV1(xml, callback);//utilizamos el servicio
	}
});

XML de Ejemplo

 

Para realizar la integración con nuestros servicios recomendamos utilizar POSTMAN, facilita las pruebas previas a la codificación.
Puedes importar el archivo POSTMAN-collection que proporcionamos al final del articulo para su descarga en POSTMAN para que puedas realizar pruebas funcionales de nuestro servicio.

Updated on julio 8, 2019

Article Attachments

Was this article helpful?