Timbrado por Web Services
Ejemplos de código para implementación de timbrado desde texto
Cliente en VB.NET
Dim webServices As New WSTimbradoTexto.wsTimbradoTexto4 'referenciaWsLocal.wsTimbradoTexto()
Dim respuesta As New WSTimbradoTexto.resultado4 'referenciaWsLocal.resultado()
'Cargar en contenido el Archivo que contiene la cadena de texto
contenido
respuesta = webServices.TimbrarPorTexto4("demo.sifec@gmail.com", "Acceso$01", "511110", contenido)
'Manejo de ERRORES
If respuesta.errores <> "" Then
TextBox1.Text = (respuesta.errores.ToString)
Else
TextBox1.Text = respuesta.folioUUID
'para descargar el xml timbrado
File.WriteAllBytes(RUTA + "\PruebaXMLTimbrado.xml", respuesta.XML)
'bajando el pdf formato generico
If respuesta.PDF IsNot Nothing Then
File.WriteAllBytes(RUTA + "\PruebaXMLPDFTimbrado.pdf", respuesta.PDF)
End If
TextBox1.Text = ("Creacion exitosa")
End If
Cliente en VB 6
Option Explicit
Private Const cSOAPTimbrar = "<?xml version=""1.0"" encoding=""utf-8""?><soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""><soap:Body><TimbrarPorTexto4 xmlns=
""www.facturaselectronicascfdi.com""><correo>string</correo><pass>string</pass><Proceso>string</Proceso><contenidoArchivo
>string</contenidoArchivo></TimbrarPorTexto4></soap:Body></soap:Envelope>"
Private Const cSOAPCancelar = "<?xml version=""1.0"" encoding=""utf-8""?><soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""><soap:Body><Cancelar4
xmlns=""www.facturaselectronicascfdi.com""><curCorreo>string</curCorreo><password>string</password><RfcEmisor>string</RfcEmisor>
<UUID>string</UUID></Cancelar4></soap:Body></soap:Envelope>"
Private Sub Cancelar_Click()
Dim parser As DOMDocument
Set parser = New DOMDocument
'cargar el codigo SOAP para Cancelar
parser.loadXML cSOAPCancelar
'parametros a enviar
parser.selectSingleNode("/soap:Envelope/soap:Body/Cancelar4/curCorreo").Text = txtCorreo.Text
parser.selectSingleNode("/soap:Envelope/soap:Body/Cancelar4/password").Text = txtPass.Text
parser.selectSingleNode("/soap:Envelope/soap:Body/Cancelar4/RfcEmisor").Text = txtRfcEmisor.Text
parser.selectSingleNode("/soap:Envelope/soap:Body/Cancelar4/UUID").Text = txtUUID.Text
enviarComandoCancelar parser.xml, "www.facturaselectronicascfdi.com/Cancelar4"
End Sub
Private Sub enviarComandoCancelar(ByVal sXml As String, ByVal sSoapAction As String)
' Enviar el comando al servicio Web'
' usar XMLHTTP40 para enviar la información al servicio Web
Dim OHttReq As XMLHTTP40
Set OHttReq = New XMLHTTP40
' Enviar el comando de forma síncrona (se espera a que se reciba la respuesta)
OHttReq.open "POST", txtUrlCancelar.Text, False
' las cabeceras a enviar al servicio Web
' (no incluir los dos puntos en el nombre de la cabecera)
OHttReq.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
OHttReq.setRequestHeader "SOAPAction", sSoapAction
' enviar el comando
OHttReq.send sXml
'
' este será el texto recibido del servicio Web
procesarRespuestaCancelar OHttReq.responseText
'
End Sub
Private Sub procesarRespuestaCancelar(ByVal s As String)
' procesar la respuesta recibida del servicio Web
'Text1.Text = s
'
' Poner los datos en el analizador de XML
Dim parser As DOMDocument
Set parser = New DOMDocument
parser.loadXML s
'
On Error Resume Next
'
Dim error As String
error = parser.selectSingleNode("/soap:Envelope/soap:Body/Cancelar4Response/Cancelar4Result/errores").Text
If error = "" Then
txtRespuestaCancelacion.Text = "Cancelacion Exitosa"
Else
txtErrores.Text = error
End If
'
If Err.Number > 0 Then
txtErrores.SetFocus
End If
End Sub
Private Sub Timbrar_Click()
Dim parser As DOMDocument
Set parser = New DOMDocument
' cargar el código SOAP para Timbrar
parser.loadXML cSOAPTimbrar
'
' Indicar el parámetro a enviar
parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4/correo").Text = txtCorreo.Text
parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4/pass").Text = txtPass.Text
parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4/Proceso").Text = txtProceso.Text
parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4/contenidoArchivo").Text = txtContenido.Text
'
' Mostrar el código XML enviado al servicio Web
'Text2.Text = parser.xml
enviarComando parser.xml, "www.facturaselectronicascfdi.com/TimbrarPorTexto4"
End Sub
Private Sub enviarComando(ByVal sXml As String, ByVal sSoapAction As String)
' Enviar el comando al servicio Web
'
' usar XMLHTTP40 para enviar la información al servicio Web
Dim OHttReq As XMLHTTP40
Set OHttReq = New XMLHTTP40
' Enviar el comando de forma síncrona (se espera a que se reciba la respuesta)
OHttReq.open "POST", txtURL.Text, False
' las cabeceras a enviar al servicio Web
' (no incluir los dos puntos en el nombre de la cabecera)
OHttReq.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
OHttReq.setRequestHeader "SOAPAction", sSoapAction
' enviar el comando
OHttReq.send sXml
'
' este será el texto recibido del servicio Web
procesarRespuesta OHttReq.responseText
'
End Sub
Private Sub procesarRespuesta(ByVal s As String)
' procesar la respuesta recibida del servicio Web
'Text1.Text = s
'
' Poner los datos en el analizador de XML
Dim parser As DOMDocument
Set parser = New DOMDocument
parser.loadXML s
'
'
On Error Resume Next
'
Dim error As String
error = parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4Response/TimbrarPorTexto4Result/errores").Text
If error = "" Then
txtSello = parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4Response/TimbrarPorTexto4Result/sello").Text
txtUUID = parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4Response/TimbrarPorTexto4Result/folioUUID").Text
Dim xml, rutaXml As String
Dim pdf, rutaPdf As String
Dim path As String
path = "C:\respuesta\"
xml = parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4Response/TimbrarPorTexto4Result/XML").Text
pdf = parser.selectSingleNode("/soap:Envelope/soap:Body/TimbrarPorTexto4Response/TimbrarPorTexto4Result/PDF").Text
If xml <> "" Then
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''Escribir la ruta de descarga de MXL''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''
rutaXml = path + txtUUID.Text + ".xml"
Open rutaXml For Binary Access Write As 1
'Escribimos los bytes del array anterior, en el nuevo archivo ( archivo 1 )
Put #1, , decodeBase64(xml)
'Cerramos los dos archivos
Close
End If
If pdf <> "" Then
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''Escribir la ruta de descarga de PDF''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''
rutaPdf = path + txtUUID.Text + ".pdf"
Open rutaPdf For Binary Access Write As 2
'Escribimos los bytes del array anterior, en el nuevo archivo ( archivo 2 )
Put #2, , decodeBase64(pdf)
'Cerramos los dos archivos
Close
End If
Else
txtErrores.Text = error
End If
'
If Err.Number > 0 Then
txtErrores.SetFocus
'Text1.SetFocus
End If
End Sub
Private Sub Form_WS_Load()
Form_WS.Caption = "Cliente VB6" & vbCrLf & "del Servicio Web Timbrado por Texto 4.0"
End Sub
Private Function decodeBase64(ByVal strData As String) As Byte()
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Set objXML = New MSXML2.DOMDocument
Set objNode = objXML.createElement("b64")
objNode.dataType = "bin.base64"
objNode.Text = strData
decodeBase64 = objNode.nodeTypedValue
Set objNode = Nothing
Set objXML = Nothing
End Function
Cliente en PHP
<?php
header('Content-Type: text/html; charset=UTF-8');
//Creamos el objeto con el que mandaremos a Timbrar
$soapclient = new SoapClient('http://pruebas40.facturaselectronicascfdi.com/WsTimbradoTexto4.asmx?WSDL');
$ResultText = '';
$CanceText = '';
if (isset($_POST['TibrarTexto4'])) {
//Cargamos nuestro archivo con la cadena de texto generada apartir de la guia proporcionara
$file = "EjemploFacturaCadenaTextoFactura.txt";
if (file_exists($file) && is_file($file) && is_readable($file)) {
// File exists and is readable, proceed with opening it.
$open = fopen($file, 'r');
$size = filesize($file);
$CadenaTexto = fread($open, $size);
// Resto del codigo
$Correo = "demo.sifec@gmail.com";
$Pass = 'Acceso$01';
$Proceso = "511110";
$ClaveKey = '12345678a';
$params = array('correo' => $Correo, 'pass' => $Pass, 'contenidoArchivo' => $CadenaTexto, 'Proceso' => $Proceso);
try {
$response = $soapclient->TimbrarPorTexto4($params);
if (empty($response->TimbrarPorTexto4Result->errores)) {
$ResultText = Alerta("El timbrado fue correcto UUID: " . $response->TimbrarPorTexto4Result->folioUUID, 'Exito!', 'success');
$file = "XmlTimbrado.pdf";
$miarch = fopen($file, "w");
fwrite($miarch, $response->TimbrarPorTexto4Result->PDF);
fclose($miarch);
$file = "XmlTimbrado.xml";
$miarch = fopen($file, "w");
fwrite($miarch, $response->TimbrarPorTexto4Result->XML);
fclose($miarch);
} else {
$ResultText = Alerta($response->TimbrarPorTexto4Result->errores, 'Error!', 'warning');
}
} catch (Exception $e) {
$ResultText = Alerta($response->TimbrarPorTexto4Result->errores, 'Error!', 'danger');
}
} else {
$ResultText = Alerta("El archivo no tiene permisos de lectura, o no existe.", 'Error;', 'warning');
}
}
function Alerta($text, $titulo, $icon)
{
$oAlerta = "<script>Swal.fire({
title: '" . $titulo . "',
text: '" . addslashes($text) . "',
icon: '" . $icon . "',
confirmButtonText: 'Cerrar'
});</script>";
return $oAlerta;
}
?>
<html>
<head>
<title>Cliente Timbrado de CFDI. v4.0</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.7.10/dist/sweetalert2.all.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/sweetalert2@11.7.10/dist/sweetalert2.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row pt-5">
<div class="col-lg-12">
<div class="card mb-12">
<div class="card-body">
<h5 class="card-title text-center">Cliente Web Service para timbrado de CFDI. v4.0</h5>
<p class="card-text ">
Timbrar40(Corre,Pass, xml, Proceso);</br>
Este metodo requiere que el Emisor del Xml carge su cer y key en la plataforma web para poder realizar el sellado del xml enviado
El xml a timbrar tiene que tener los siguientes atributos vacios NoCetificado="" Certificado="" Sello="" ya que el ws se encargara de sellar con el cer y key cargados, Este metodo regresar el xml timbrado
</p>
<form method="post" action="WS_Cliente_Timbrado_PHP.php" class="text-center">
<input type="submit" name="TibrarTexto4" value="Timbrar" class="btn btn-success">
<?php
if ($ResultText <> '') {
echo $ResultText;
$ResultText = '';
}
?>
</form>
</div>
<div class="card-footer text-center">
<div class="footer-top">
<div class="container">
<div class="row">
<div class="col-lg-4">
<h3>Inowebs</h3>
<a class="me-4 link-secondary" href="https://facturaselectronicascfdi.com/inicio">Inicio</a>
<a class="me-4 link-secondary" href="https://facturaselectronicascfdi.com/precios">Precios</a>
<a class="me-4 link-secondary" href="https://facturaselectronicascfdi.com/blog/BlogIndex">Blog</a>
<a class="me-4 link-secondary" href="https://facturaselectronicascfdi.com/comprar">Comprar</a>
</div>
<div class="col-lg-8">
<div class="footer-links">
<h4>Contáctanos</h4>
<div class="alert alert-info">
<p>Los números de contacto solo estan disponibles en un horario de 9am a 5pm de lunes a viernes</p>
</div>
<p>
<strong>Teléfono Ventas:</strong> (443)690 3616<br>
<strong>Correo:</strong> ventas@inowebs.com, soporte@inowebs.com<br>
</p>
<p>
<a href="https://facturaselectronicascfdi.com/Contact" class="btn btn-primary">Enviar correo</a>
</p>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="copyright">
©INOWEBS <strong>FACTURACIÓN ELECTRÓNICA</strong> TODOS LOS DERECHOS RESERVADOS
</div>
<div class="credits">
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Cliente en Excel VB
Cliente en Java
public static void main(String[] args){
//declaramos nuestras variables
String ruta="K:\\miruta\\";
String correo="demo.sifec@gmail.com";
String pass="Acceso$01";
String rfc="AAA010101AAA";
boolean pdf=true;
String passCer="12345678a";
try {
//KEY RUTA
//Cargar los archivos a las variables
cerFile,keyFile,passCer
Resultado timbrarNomina=timbradoPorTextoNomina(correo,pass,rfc,cerFile,keyFile,passCer,contenidoArchivo,pdf,"Pruebas","3.2-1.2");
if (timbrarNomina.getErrores().equals("")){
//si no existen errores
System.out.println("\n\n\t RESULTAOD EXITOSO\n");
//RUTA DE SALIDA DE PDF
FileOutputStream fos=new FileOutputStream(ruta+"SalidaTimbre.pdf");
fos.write(timbrarNomina.getPDF());
fos.close();
//RUTA DE SALIDA DE XML TIMBRADO
FileOutputStream fos2=new FileOutputStream(ruta+"SalidaTimbre.xml");
fos2.write(timbrarNomina.getXML());
fos2.close();
}
else{
System.out.println("Se generaron los siguientes errores:"+timbrarNomina.getErrores());
}
} catch (Exception e){
System.out.println("ERRORES******:"+e);
}
}
private static org.tempuri.Resultado timbradoPorTextoNomina(String correo,String pass,String rfc,byte[]cerFile,
byte[]keyFile,String passCer,byte[]contenidoArchivo,boolean pdf,String ambiente,String version){
org.tempuri.WsTimbradoTexto service=new org.tempuri.WsTimbradoTexto();
org.tempuri.WsTimbradoTextoSoap port=service.getWsTimbradoTextoSoap12();
return port.timbradoPorTextoNomina(correo,pass,rfc,cerFile,keyFile,passCer,contenidoArchivo,pdf,ambiente, version);
}
Cliente en C#
Cliente en Visual Fox Pro