3. Ejemplos de codigo 💻 - NTlink/ntlink-ws-cfdi-documentation GitHub Wiki

🌟 Introducción

Los ejemplos que se muestran a continuación tienen por objeto que los desarrolladores puedan realizar y comprobar lo siguiente:

  • Pruebas y validación
  • Demostración de uso
  • Facilitación de integración
  • Depuración y soporte

Y se exponen a efecto de que usando las credenciales para el Ambiente de Pruebas, puedan hacer las pruebas pertinentes, en caso de requerir asesoría o soporte, no dudes en contactarnos a través de nuestros Medios de contacto

#️⃣ JAVA

image

Este código es una prueba en Java que valida el proceso de timbrado de un CFDI, lee un archivo XML de comprobante fiscal, reemplaza un marcador de fecha con la hora actual menos 10 minutos y envía la solicitud de timbrado sin sello mediante el cliente SOAP, luego, verifica que la respuesta no sea nula, que no haya errores y que el CFDI timbrado contenga un UUID, asegurando así que el proceso de timbrado se realizó correctamente.

Para poder usar el siguiente codigo es necesario importar el SDK del web service de NTlink, el cual puedes descargar en el siguiente archivo jar y agregarlo a tu proyecto o puedes compilarlo desde nuestro repositorio de git , donde tambien puedes encontrar mas ejemplos de uso.

import com.mx.ntlink.error.SoapClientException;
import com.mx.ntlink.models.generated.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class NtLinkClientTest {

    private static final String TEST_USER = "[email protected]";
    private static final String TEST_PASS = "Factura.2022*";
    private static final String DATE_REPLACEMENT = "%fecha-timbrado%";


        @Test
        public void timbraPUE_test() throws SoapClientException, IOException {

        String comprobante =
            new String(Files.readAllBytes(Paths.get("./src/test/resources/cfdi-samples/cfdi-pue.xml")));

        comprobante =
            comprobante.replace(
                DATE_REPLACEMENT, formatter.format(LocalDateTime.now().minusMinutes(10)));

        TimbraCfdiQrSinSello cfdiSinSello = new TimbraCfdiQrSinSello();
        cfdiSinSello.setPassword(TEST_PASS);
        cfdiSinSello.setUserName(TEST_USER);
        cfdiSinSello.setComprobante(comprobante);
        TimbraCfdiQrSinSelloResponse response = client.timbrarSinSelloConQr(cfdiSinSello);

        Assert.assertNotNull(response);
        Assert.assertNotNull(response.getTimbraCfdiQrSinSelloResult());
        Assert.assertTrue(response.getTimbraCfdiQrSinSelloResult().getDescripcionError().isEmpty());
        Assert.assertTrue(
            "Contains UUID", response.getTimbraCfdiQrSinSelloResult().getCfdi().contains("UUID"));
        }
    }

#️⃣ C#

image

Este código en C# es un cliente de prueba para el servicio de timbrado en NtLink, establece una conexión con el servicio SOAP ServicioTimbradoClient, lee un archivo XML de un CFDI desde el disco, y lo envía al método TimbraCfdiSinSelloAsync junto con las credenciales de prueba, posteriormente espera la respuesta del servicio y la imprime en la consola, verificando así que el timbrado se realice correctamente.

Puede encontrar un ejemplo de implementacion C# en el siguiente video de muestra

using System;
using System.IO;
using System.Threading.Tasks;

namespace NTlinkTest
{
    class Program
    {
        static async Task Main(string[] args)
        {
            NTService.ServicioTimbradoClient ws = new NTService.ServicioTimbradoClient();

            Console.WriteLine("Conecting to WS");

            StreamReader fo = new StreamReader("C:\development\ntlink-proxy-ws\src\test\resources\xml\ingreso-pue.xml");
            string xmlstring = fo.ReadToEnd();
            fo.Close();
            Console.WriteLine(xmlstring);
            Task<string> result = ws.TimbraCfdiSinSelloAsync("[email protected]", "Factura.2021*", xmlstring);

            Console.WriteLine("Executing call with xml");
            string r = await result;

            Console.WriteLine(r);

        }
    }
}

#️⃣ PYTHON

pip install zeep

from zeep import Client
from zeep.transports import Transport
from requests import Session
import xml.etree.ElementTree as ET

# Cargar el archivo XML
tree = ET.parse('archivo.xml')  # Reemplaza 'archivo.xml' con la ruta de tu archivo XML
root = tree.getroot()

# Convertir el XML a una cadena (string)
xml_string = ET.tostring(root, encoding='utf-8').decode('utf-8')

# URL del WSDL y del servicio SOAP
wsdl_url = "http://dev-cfdi4.ntlink.com.mx/cfdi40/servicio-timbrado/servicio-timbrado.wsdl"

# Crear sesión para manejar solicitudes con Zeep
session = Session()
session.verify = False  # Desactivar verificación SSL si es necesario
transport = Transport(session=session)

# Crear cliente SOAP
client = Client(wsdl=wsdl_url, transport=transport)

# Datos para la solicitud
user_name = "[email protected]"
password = "NTPruebas.2021*?"
comprobante = xml_string

# Llamar al método del servicio SOAP
try:
    response = client.service.TimbraCfdiSinSello(
        userName=user_name,
        password=password,
        comprobante=comprobante
    )

    # Imprimir respuesta
    print("Respuesta del servicio:")
    print(response)

except Exception as e:
    print(f"Error al consumir el servicio SOAP: {e}")

#️⃣ JS

npm install soap

const soap = require("soap");
const fs = require("fs"); // Módulo para manejar archivos

// URL del WSDL
const wsdlUrl = "http://dev-cfdi4.ntlink.com.mx/cfdi40/servicio-timbrado/servicio-timbrado.wsdl";

// Datos de autenticación
const userName = "[email protected]";
const password = "NTPruebas.2021*?";

// Ruta del archivo XML
const xmlFilePath = "archivo.xml"; // Cambia esto por la ruta de tu archivo XML

// Leer el archivo XML
fs.readFile(xmlFilePath, "utf8", (err, comprobante) => {
  if (err) {
    console.error("Error al leer el archivo XML:", err);
    return;
  }

  // Crear cliente SOAP y llamar al método
  soap.createClient(wsdlUrl, (err, client) => {
    if (err) {
      console.error("Error al crear el cliente SOAP:", err);
      return;
    }

    // Llamada al servicio
    client.TimbraCfdiSinSello(
      { userName, password, comprobante },
      (err, result) => {
        if (err) {
          console.error("Error en la petición SOAP:", err);
          return;
        }
        console.log("Respuesta del servicio:", result);
      }
    );
  });
});

#️⃣ PHP

Habilita la extensión SOAP en php.ini Abre php.ini con un editor de texto. 📍 Ubicación: makefile C:\xampp8\php\php.ini Busca esta línea (usa Ctrl + F para encontrarla): ;extension=soap Descoméntala eliminando el ; al inicio, así: extension=soap Guarda el archivo y reinicia el servidor.

<?php
// URL del WSDL del servicio
$wsdlUrl = "http://dev-cfdi4.ntlink.com.mx/cfdi40/servicio-timbrado/servicio-timbrado.wsdl";

// Datos de autenticación
$userName = "[email protected]";
$password = "NTPruebas.2021*?";

// Ruta del archivo XML
$xmlFilePath = "ruta/al/archivo.xml"; // Cambia esto por la ruta de tu archivo XML

// Leer el archivo XML
if (!file_exists($xmlFilePath)) {
    die("El archivo XML no existe en la ruta especificada.");
}

$comprobante = file_get_contents($xmlFilePath); // Leer el contenido del archivo XML

try {
    // Crear cliente SOAP
    $client = new SoapClient($wsdlUrl, [
        "trace" => 1,       // Habilita trazas para depuración
        "exceptions" => 1,  // Maneja excepciones en errores
    ]);

    // Llamar al método TimbraCfdiSinSello
    $params = [
        "userName" => $userName,
        "password" => $password,
        "comprobante" => $comprobante,
    ];

    $response = $client->__soapCall("TimbraCfdiSinSello", [$params]);

   // Extraer el XML del resultado
    $xmlTimbrado = $response->TimbraCfdiSinSelloResult;

    // Mostrar el XML formateado (elimina <pre> si quieres solo el XML crudo)
    header('Content-Type: text/xml; charset=utf-8');
    echo htmlspecialchars_decode($xmlTimbrado);
} catch (Exception $e) {
    // Captura errores
    echo "Error al consumir el servicio SOAP: " . $e->getMessage();
}
⚠️ **GitHub.com Fallback** ⚠️