Descarga LCO del FTP del SAT

Y para empezar Que es una Factura Electronica? Como empiezo? Necesito Autorizacion? Que medios hay para Facturar Electronicamente? estos y todos los temas de iniciacion deberan estar aqui
criss25
Mensajes: 3
Registrado: Lun Ago 29, 2016 6:00 pm

Descarga LCO del FTP del SAT

Mensajepor criss25 » Mié Oct 12, 2016 12:48 pm

Buenas tardes,
alguien me puede apoyar con la descarga de los archivos de LCO del SAT, tengo un proceso desarrollado en .NET para su descarga diaria, pero desde hace días estoy tratando de descargarlo y el servidor del SAT me cierra la conexión; y los necesito para validar las facturas y no depender tanto del servidor del SAT al momento de validarlas ya que se satura mucho.

Estos son los sitios de donde hago la descarga:

ftp://ftp2.sat.gob.mx/agti_servicio_ftp ... obante_ftp
ftp://ftp2.sat.gob.mx/agti_ftp/cfds_ftp/

Alguien tiene algun otra solución para esto?

Saludos..

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Descarga LCO del FTP del SAT

Mensajepor Dado » Mié Oct 12, 2016 4:33 pm

Recuerdo haber visto aqui en el foro un mensaje donde mencionaba que ya se podian descargar de un blob del SAT con el protocolo http

Dale una buscada por aqui

O si alguien del foro recuerda mas informacion que nos pueda compartir
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

fortiz
Mensajes: 221
Registrado: Vie Dic 10, 2010 9:11 am

Re: Descarga LCO del FTP del SAT

Mensajepor fortiz » Jue Oct 13, 2016 8:52 am

Buen dia

Yo uso este programa para descargar la LCO

Código: Seleccionar todo

<?php
echo "Inicia proceso ".date("c")."\n";
$fech = date("Y-m-d");
$url = "https://cfdisat.blob.core.windows.net/lco?restype=container&comp=list&prefix=LCO_$fech";
echo "$url\n";
$opts = array('http' => array('method'=>'GET',
                              'timeout' => 5,
                              'protocol_version' => 1.1,
                              'header' => 'Connection: close'
                          )
             );
$ctx = stream_context_create($opts);
$xmltxt = file_get_contents($url,false,$ctx);
file_put_contents("lista.xml",$xmltxt);
$xml = new DOMDocument("1.0","UTF-8");
$xml->loadXML($xmltxt);
$Blob = $xml->getElementsByTagName('Blob');
foreach ($Blob as $file) {
    $name = leenodo($file,"Name");
    $url = leenodo($file,"Url");
    $md5 = leenodo($file,"Content-MD5");
    echo "\n----------------\nnombre=$name\nurl=$url\nhash=$md5\n\n";
    $ok = leeurl($name, $url, $md5);
}
echo "Termina proceso ".date("c")."\n";

function leenodo($node,$name) {
    $paso = $node->getElementsByTagName($name);
    foreach ($paso as $otro) {
        $ret = $otro->nodeValue;
    }
    return $ret;
}

function leeurl($name,$url,$md5) {
    echo "Inicia $name : ".date("c")."\n";
    $data = file_get_contents($url);
    file_put_contents($name,$data);
    $hash = base64_encode(md5($data,true));
    if ($hash == $md5) {
        echo "Ok\n";
        $ret = true;
    } else {
       echo  "Hash no coincide $hash\n";
       $ret = false;
    }
    echo "Termina $name : ".date("c")."\n";
    return $ret;
}
?>


Y para verificar, descomprimir y extraer los datos en formato delimitado por pipes y concatenarlo en un solo archivo uso este script

Código: Seleccionar todo

#!/bin/bash
dia=`date +%Y-%m-%d`
rm -f sin.csv sin_*.xml sin_*.csv
for parte in 1 2 3 4 5
do
  file=LCO_${dia}_${parte}.XML
  rm -f $file
  if [ -r $file.gz ]
  then
    echo $file
    gunzip $file.gz
    openssl smime -verify -in $file -inform der -noverify -out sin_${parte}.xml
    xsltproc sql.xslt sin_${parte}.xml  >sin_${parte}.csv
    cat sin_${parte}.csv >>sin.csv
  fi
done
echo listo


El xsltproc usa este pequeño archivo xslt para convertir el xml en csv en un formato amigable para ser incorporado a mi base de datos

Código: Seleccionar todo

<xsl:stylesheet version = '1.0'
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
    xmlns:lco='http:/www.sat.gob.mx/cfd/LCO'>

<xsl:output method = "text" />

<xsl:template match="/">
    <xsl:apply-templates select="//lco:Contribuyente"/>
</xsl:template>

<xsl:template match="lco:Contribuyente">
    <xsl:apply-templates select="lco:Certificado">
        <xsl:value-of select="@RFC"/>
        <xsl:with-param name="rfc" select="@RFC" />
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="lco:Certificado">
    <xsl:param name="rfc" />
    <xsl:value-of select="$rfc"/>|<xsl:value-of select="@ValidezObligaciones"/>|<xsl:value-of select="@EstatusCertificado"/>|<xsl:value-of select="@noCertificado"/>|<xsl:value-of select="@FechaFinal"/>|<xsl:value-of select="@FechaInicio"/><xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>


Y ya deja el archivo en este formato

Código: Seleccionar todo

$ head sin.csv
&RA040119JFA|1|A|00001000000202200752|2016-10-24T15:19:49|2012-10-24T15:19:49
AAAA610822FX3|1|A|00001000000306562027|2019-03-26T22:16:51|2015-03-26T22:16:51
AAA9806257B2|1|A|00001000000202620356|2016-12-15T20:13:34|2012-12-15T20:13:34
AAA1006245L7|1|A|00001000000401177121|2020-01-14T18:03:20|2016-01-14T18:03:20
AAA990902AK4|1|A|00001000000202722501|2017-01-03T17:39:40|2013-01-03T17:39:40
AAA940629JM4|1|A|00001000000402789351|2020-06-10T21:59:15|2016-06-10T21:59:15
AAAA660929KC2|1|A|00001000000303464744|2018-03-25T18:21:23|2014-03-25T18:21:23
AAAA430111S64|1|A|00001000000301988192|2017-12-23T17:00:41|2013-12-23T17:00:41
A&A060722994|1|A|00001000000302615471|2018-01-24T02:26:11|2014-01-24T02:26:11
AAA130705KX0|1|A|00001000000301128269|2017-10-24T15:47:34|2013-10-24T15:47:34


Bitácora de ejecución

Código: Seleccionar todo

$ php descarga_lco.php
Inicia proceso 2016-10-13T08:47:15-05:00
https://cfdisat.blob.core.windows.net/lco?restype=container&comp=list&prefix=LCO_2016-10-13

----------------
nombre=LCO_2016-10-13_1.XML.gz
url=https://cfdisat.blob.core.windows.net/lco/LCO_2016-10-13_1.XML.gz
hash=s3XT2Q5KNyHfE2EbGP4QaQ==

Inicia LCO_2016-10-13_1.XML.gz : 2016-10-13T08:47:15-05:00
Ok
Termina LCO_2016-10-13_1.XML.gz : 2016-10-13T08:48:12-05:00

----------------
nombre=LCO_2016-10-13_2.XML.gz
url=https://cfdisat.blob.core.windows.net/lco/LCO_2016-10-13_2.XML.gz
hash=dQFv9anqqT+kKLygjasnJw==

Inicia LCO_2016-10-13_2.XML.gz : 2016-10-13T08:48:13-05:00
Ok
Termina LCO_2016-10-13_2.XML.gz : 2016-10-13T08:48:53-05:00
Termina proceso 2016-10-13T08:48:53-05:00
[ortiz@pac-devel lco]$ ./procesa_xml.sh
LCO_2016-10-13_1.XML
Verification successful
LCO_2016-10-13_2.XML
Verification successful
listo
[ortiz@pac-devel lco]$ ll
total 2731832
-rw-rw-r-- 1 ortiz dev 611741767 Oct 13 08:48 LCO_2016-10-13_1.XML
-rw-rw-r-- 1 ortiz dev 446515714 Oct 13 08:48 LCO_2016-10-13_2.XML
-rw-rw-r-- 1 ortiz dev      1534 Oct 13 08:47 descarga_lco.php
-rw-rw-r-- 1 ortiz dev      1214 Oct 13 08:47 lista.xml
-rwxrwxr-x 1 ortiz dev       395 Oct 13 08:47 procesa_xml.sh
-rw-rw-r-- 1 ortiz dev 340414409 Oct 13 08:50 sin.csv
-rw-rw-r-- 1 ortiz dev 196743628 Oct 13 08:50 sin_1.csv
-rw-rw-r-- 1 ortiz dev 611740073 Oct 13 08:49 sin_1.xml
-rw-rw-r-- 1 ortiz dev 143670781 Oct 13 08:50 sin_2.csv
-rw-rw-r-- 1 ortiz dev 446514020 Oct 13 08:50 sin_2.xml
-rw-rw-r-- 1 ortiz dev       857 Oct 13 08:47 sql.xslt


Saludos

criss25
Mensajes: 3
Registrado: Lun Ago 29, 2016 6:00 pm

Re: Descarga LCO del FTP del SAT

Mensajepor criss25 » Jue Oct 13, 2016 12:35 pm

Si Funciona tu Solución

Muchas Gracias.. ;)

Avatar de Usuario
Sinchi
Mensajes: 81
Registrado: Vie Jul 22, 2016 8:06 am
Ubicación: LATAM

Re: Descarga LCO del FTP del SAT

Mensajepor Sinchi » Jue Oct 20, 2016 5:45 am

Funciona muy bien. Nomas le agregaría al PHP al principio la siguiente linea para los que estamos en otra zona horaria.

date_default_timezone_set('America/Mexico_City');

Y al bash script también lo correspondiente


Volver a “Iniciando con la Factura Electronica”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados