Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Interpretar este codigo para solo imprimir

Estas en el tema de Interpretar este codigo para solo imprimir en el foro de PHP en Foros del Web. Hola que tal buen tengo este código que no e sabido interpretar y por eso acudo a ustedes lo que requiero de esto es solamente ...
  #1 (permalink)  
Antiguo 05/03/2014, 15:42
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Pregunta Interpretar este codigo para solo imprimir

Hola que tal buen tengo este código que no e sabido interpretar y por eso acudo a ustedes lo que requiero de esto es solamente imprimir los datos del archivo XML sin validar como se supone que lo hace lo único que requiero es que imprima todos los datos extraídos del archivo XML pero no entiendo por que no lo hace ...

a por cierto es para validar XML

El código este en esta pagina Aqui puedes ver el código del que hablo

solo quiero imprimir los datos extraídos pero no entiendo que me falte
  #2 (permalink)  
Antiguo 06/03/2014, 07:41
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Interpretar este codigo para solo imprimir

Pretendes que alguien entienda el codigo que colocaste?
pon porlo menos un ejemplo
  #3 (permalink)  
Antiguo 07/03/2014, 11:14
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Pregunta Respuesta: Interpretar este codigo para solo imprimir

Bueno eso falto mencionar que encontré este código.

Código PHP:
<HTML>
<HEAD>
<meta http-equiv="Expires" content="Mon, 26 Jul 1997 05:00:00 GMT">
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<TITLE>Validacion de Facturas electronicas CFD/CFDI XML</TITLE>
<link rel="STYLESHEET" href="../../fortiz.css" media="screen" type="text/css">
</HEAD>
<BODY>
<div align=center>
<H1>Validacion de Facturas Electronicas XML (CFD/CFDI)</H1>
<form method='post' enctype='multipart/form-data'>
 Archivo <input type='file' name='arch' size='60'>
 <INPUT TYPE="submit" VALUE="Valida" >
 <br><br><hr>
</FORM>
<a href=../cfdcvali.phps>Codigo Fuente</a>
<?php
if (trim($_FILES['arch']['name'])=="") die("no arch");
if (
$_FILES['arch']['error']==|| $_FILES['arch']['size']==0) {
    echo 
"<h1><red>NO SUBIO archivo, demasiado grande</red></h1>";
    die();

$arch $_FILES['arch']['tmp_name'];
$texto file_get_contents($arch);
unlink($arch);

// Quita Addenda solo valida fiscal
$texto preg_replace('{<Addenda.*/Addenda>}is''<Addenda/>'$texto);
$texto preg_replace('{<cfdi:Addenda.*/cfdi:Addenda>}is''<cfdi:Addenda/>'$texto);
// Para ver en la Pantalla el XML recibido  (sin addenda) 
/* * Paquetes para ver bonito el codigo en la pantalla
 * No son necesarios 'para validar'
 * solo son para 'ver bonito' lo que se valida
 * Son gratuitos se obtienen de pear.php.net
 * http://pear.php.net/package/XML_Beautifier/
 * http://pear.php.net/package/Text_Highlighter/
 * */
require_once 'Beautifier.php';
require_once 
'Highlighter.php';

$fmt = new XML_Beautifier();
$fmt->setOption("multilineTags"TRUE);
$paso $fmt->formatString($texto);
if (
substr($paso,0,10)!="XML_Parser"$texto=$paso// XML correctamente formado
$hl =& Text_Highlighter::factory('XML',array('numbers'=>HL_NUMBERS_TABLE));
echo 
"<div style='height:300px; overflow:auto';";
echo 
$hl->highlight($texto);
echo 
"</div>";

libxml_use_internal_errors(true);   // Gracias a Salim Giacoman
$xml = new DOMDocument();
$ok $xml->loadXML($texto);
if (!
$ok) {
   
display_xml_errors(); 
   die();
}
//   Con XPath obtenemos el valor de los atributos del XML
$xp = new DOMXpath($xml);
$rfc getpath("//@rfc");
$data['rfc'] = utf8_decode($rfc[0]);
$data['rfc_receptor'] = utf8_decode($rfc[1]);
$data['total'] = getpath("//@total");
if (
is_array($data['total'])) $data['total'] = $data['total'][0];
$data['version'] = getpath("//@version");
if (
is_array($data['version'])) $data['version'] = $data['version'][0];
$data['version'] = trim($data['version']);
$data['seri'] = utf8_decode(trim(getpath("//@serie")));
$data['foli'] = trim(getpath("//@folio"));
$data['fecha'] = trim(getpath("//@fecha"));
$data['noap'] = trim(getpath("//@noAprobacion"));
$data['anoa'] = trim(getpath("//@anoAprobacion"));
$data['no_cert'] = getpath("//@noCertificado");
if (
is_array($data['no_cert'])) $data['no_cert'] = $data['no_cert'][0];
$data['no_cert'] = trim($data['no_cert']);
$data['cert'] = getpath("//@certificado");
$data['sell'] = getpath("//@sello");
$data['sellocfd'] = getpath("//@selloCFD");
$data['sellosat'] = getpath("//@selloSAT");
$data['no_cert_sat'] = getpath("//@noCertificadoSAT");
$data['uuid'] = getpath("//@UUID");
//   Valores guardados en un arreglo para ser usado por las funciones
//  Conexion a la base de datos para leer la lista de Series/folios y CSD
//  autorizados por el SAT
//  http://www.lacorona.com.mx/fortiz/sat/valida.php  para ver estas tablas
//  myconn es una conexion a MI BASE DE DATOS
//  yo uso adodb http://phplens.com/lens/adodb/docs-adodb.htm
//  pero ya los parametros de conexion a mi base de datos no te digo ;)
require_once "myconn/myconn.inc.php";
$conn=myconn();

if (
$data['version']=="2.0" || $data['version']=="2.2") {
    
valida_folio();
}
valida_certificado();
valida_xsd();
valida_sello();
if (
$data['sellosat']!="") {
   
valida_sello_tfd();
}
if (
$data['version']=="3.2") {
    
valida_en_sat();
}

// {{{ valida_folio()
function valida_folio() {
global 
$data,$conn;
$qry "select * from cfdfolios where RFC='".$data['rfc']."' and 
                     Serie='"
.$data['seri']."' and 
                     FolioInicial <= "
.$data['foli']." and 
                     FolioFinal >= "
.$data['foli'];
$rowfolios $conn->getrow($qry);
if (
trim($rowfolios['rfc'])==$data['rfc'] && 
    
trim($rowfolios['serie'])==$data['seri']) {
        echo 
"<h3>Folio Autorizado</h3>";
    if(
$data['noap']!=$rowfolios['noaprobacion'] || $data['anoa']!=$rowfolios['anoaprobacion']) {
        echo 
"<h3><font color=red>El numero reportado no es el autorizado</font></h3>";
    }
} else {
    echo 
"<h3><font color=red>Folio no autorizado</font></h3>";
}
echo 
"<hr>";
}
// }}}
// {{{ Valida certificado
function valida_certificado() {
global 
$data,$conn;
$qry "select * from cfdcsd where RFC='".$data['rfc']."' and 
                                   no_serie='"
.$data['no_cert']."'";
$rowcsd $conn->getrow($qry);
if (
trim($rowcsd['rfc'])==$data['rfc'] && 
    
trim($rowcsd['no_serie'])==$data['no_cert']) {
    
$fini=$rowcsd['fec_inicial_cert'];
    
$ffin=$rowcsd['fec_final_cert'];
    echo 
"<h3>Certificado valido del $fini al $ffin</h3>";
} else {
    echo 
"<h3>Certificado no autorizado</h3>";
}
echo 
"<hr>";
}
function 
valida_xsd() {
    
/*
     * Todos los archivos que se requieren para hacer la validacion
     * fueron descargados del portal del SAT pero los tengo localmente
     * almacenados en mi maquina para que las validaciones ssean mas rapidas.
     * Ademas el archivo prinicpal cfdv32.xsd esta 'un poco' modifcado para
     * que importe los complementos
     *
     * La version de mi maquina los pueden obtener de la misma URL
     *
     * http://www.lacorona.com.mx/fortiz/sat/cfdv32.xsd
     * http://www.lacorona.com.mx/fortiz/sat/ecc.xsd
     * http://www.lacorona.com.mx/fortiz/sat/...
     * */
global $data$xml,$texto;
libxml_use_internal_errors(true);   // Gracias a Salim Giacoman
switch ($data['version']) {
  case 
"2.0":
    echo 
"Version 2.0 CFD<br>";
    
$ok $xml->schemaValidate("cfdv2complemento.xsd");
    break;
  case 
"2.2":
    echo 
"Version 2.2 CFD<br>";
    
$ok $xml->schemaValidate("cfdv22complemento.xsd");
    break;
  case 
"3.0":
    echo 
"Version 3.0 (CFDI)<br>";
    
$ok $xml->schemaValidate("cfdv3complemento.xsd");
    break;
  case 
"3.2":
    echo 
"Version 3.2 CFDI<br>";
    
$ok $xml->schemaValidate("cfdv32.xsd");
    break;
  default:
    
$ok false;
    echo 
"Version invalida ".$data['version']."<br>";
}
if (
$ok) {
    echo 
"<h3>Esquema valido</h3>";
} else {
    echo 
"<h3>Estructura contra esquema incorrecta</h3>";
    
display_xml_errors(); 
}
echo 
"<hr>";
}
////////////////// Segunda parte...
  #4 (permalink)  
Antiguo 07/03/2014, 11:15
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Pregunta Respuesta: Interpretar este codigo para solo imprimir

Segunda parte del codigo si lo quieren ver completo sigan la liga ... del inicio
Código PHP:
// {{{ Valida Sello
function valida_sello() {
    
/*
     * Todos los archivos que se requieren para generar la cadena original
     * fueron descargados del portal del SAT pero los tengo localmente
     * almacenados en mi maquina para que el proceso sea mas rapido.
     * Todos los archivos estan modificacion por el numero de version 2 a 1,
     * para que no mande warning PHP
     * La version de mi maquina los pueden obtener de la misma URL
     * http://www.lacorona.com.mx/fortiz/sat/cadenaoriginal_TFD_1_0.xslt
     * http://www.lacorona.com.mx/fortiz/sat/ecc.xslt
     * http://www.lacorona.com.mx/fortiz/sat/...
     */ 
global $data$xml;

$xsl = new DOMDocument;
switch (
$data['version']) {
  case 
"2.0":
      
$xsl->load('cadenaoriginal_2_0.xslt');
      if (
substr($data['fecha'],0,4)<2011) {
          echo 
"md5 \n";
          
$algo OPENSSL_ALGO_MD5;
      } else {
          echo 
"sha1 \n";
          
$algo =OPENSSL_ALGO_SHA1;
      }
      break;
  case 
"2.2":
      echo 
"2.2\n";
      
$xsl->load('cadenaoriginal_2_2.xslt');
      echo 
"sha1 \n";
      
$algo OPENSSL_ALGO_SHA1;
      break;
  case 
"3.0":
      
$xsl->load('cadenaoriginal_3_0.xslt');
      if (
substr($data['fecha'],0,4)<2011) {
          echo 
"md5 \n";
          
$algo OPENSSL_ALGO_MD5;
      } else {
          echo 
"sha1 \n";
          
$algo =OPENSSL_ALGO_SHA1;
      }
      break;
  case 
"3.2":
      echo 
"3.2\n";
      
$xsl->load('cadenaoriginal_3_2.xslt');
      echo 
"sha1 \n";
      
$algo OPENSSL_ALGO_SHA1;
      break;
  default:
      echo 
"version incorrecta ".$data['version']."\n";
      break;
}

$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 
$cadena $proc->transformToXML($xml);
echo 
"Cadena Original<br><p align=left>$cadena</p><br>";
if (
$algo==OPENSSL_ALGO_SHA1) {
    
$sha1=sha1($cadena);
    echo 
"hash sha1=$sha1<br>";
} else {
    
$md5=md5($cadena);
    echo 
"hash md5=$md5<br>";
}

if (!
mb_check_encoding($cadena,"utf-8")) {
    echo 
"<h3>Error no esta en UTF-8!</h3>";
}

/* 
 * El domicilio es opcional, pero si no lo ponemos el xslt del SAT genera 
 * doble pip en el pais ..., dice que el sello es correcto pero los PACs 
 * que validan bien lo rechazan ... 
 */
$doble preg_match('/.\|\|./',$cadena);
if (
$doble===1) {
    echo 
"<h3><font color=red>La cadena tiene doble pipes en medio ...</font></h3>";
}
// Primer certificado (o unico) del emisor
// Los demas certificados es del PAC, Timbre, etc.
$pem = (sizeof($data['cert'])<=1) ? $data['cert'] : $data['cert'][0];

$pem eregi_replace("[\n|\r|\n\r]"''$pem);
$pem preg_replace('/\s\s+/'''$pem); 
// Si no incluye el certificado bajarlo del FTP del sat ....
if (strlen($pem)==0) {
    echo 
"No incluye certificado interno, descargdo del FTP del sat ...<br>";
    
$no_cert $data['no_cert'];
    
$p1=substr($no_cert,0,6);
    
$p2=substr($no_cert,6,6);
    
$p3=substr($no_cert,12,2);
    
$p4=substr($no_cert,14,2);
    
$p5=substr($no_cert,16,2);
    
$path "ftp://ftp2.sat.gob.mx/certificados/FEA/$p1/$p2/$p3/$p4/$p5/$no_cert.cer";
    
$der file_get_contents($path);
    
$pem base64_encode($der);
    echo 
"path=$path<br>";
}

$cert "-----BEGIN CERTIFICATE-----\n".chunk_split($pem,64)."-----END CERTIFICATE-----\n";
$pubkeyid openssl_get_publickey(openssl_x509_read($cert));
$ok openssl_verify($cadena
                     
base64_decode($data['sell']), 
                     
$pubkeyid
                     
$algo);
if (
$ok == 1) {
    echo 
"<h3>Sello ok</h3>";
} else {
    echo 
"<h3>Sello incorrecto</h3>";
    while (
$msg openssl_error_string())
        echo 
$msg"\n";
}
openssl_free_key($pubkeyid);
echo 
"<hr>";
$paso openssl_x509_parse($cert);
$serial convierte($paso['serialNumber']);
if (
$serial!=$data['no_cert']) {
    echo 
"Serie reportada ".$data['no_cert']." serie usada $serial<br>";
}

}
// }}} Valida Sello
function valida_sello_tfd() {
global 
$data$texto;

if (
$data['sell'] != $data['sellocfd']) {
    echo 
"<h3>sello Comprobante diferente que sello TFD!, manipulado?</h3>";
}

// Quita la parte del CFDI
$texto_tfd preg_replace('{<cfdi:Comprobante.*<tfd:}is''<tfd:'$texto);
$texto_tfd trim(preg_replace('{</cfdi:.*$}is'''$texto_tfd));
// Si no tiene el namespace definido, se agrega
if (strpos($texto_tfd,"xmlns:tfd")===FALSE) {

    
$texto_tfd substr($texto_tfd,0,-2).' xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" />';
}
// Solo se quedo el tfd:
$xml_tfd = new DOMDocument();
$ok $xml_tfd->loadXML($texto_tfd);

$xsl = new DOMDocument;
$xsl->load('cadenaoriginal_TFD_1_0.xslt');
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

$cadena $proc->transformToXML($xml_tfd);
echo 
"Cadena Original TFD<br><p align=left>$cadena</p><br>";

if (!
mb_check_encoding($cadena,"utf-8")) {
    echo 
"<h3>Error no esta en UTF-8!</h3>";
}

$no_cert=$data['no_cert_sat'];
$p1=substr($no_cert,0,6);
$p2=substr($no_cert,6,6);
$p3=substr($no_cert,12,2);
$p4=substr($no_cert,14,2);
$p5=substr($no_cert,16,2);
$path "ftp://ftp2.sat.gob.mx/certificados/FEA/$p1/$p2/$p3/$p4/$p5/$no_cert.cer";
echo 
"Certificado SAT $path<br>";
$der file_get_contents($path);
$pem base64_encode($der);

$cert "-----BEGIN CERTIFICATE-----\n".chunk_split($pem,64)."-----END CERTIFICATE-----\n";
// file_put_contents("/tmp/llave.cer.pem",$cert);
$pubkeyid openssl_get_publickey(openssl_x509_read($cert));
$ok openssl_verify($cadena
                     
base64_decode($data['sellosat']), 
                     
$pubkeyid
                     
OPENSSL_ALGO_SHA1);
if (
$ok == 1) {
    echo 
"<h3>Sello TFD ok</h3>";
} else {
    echo 
"<h3>Sello TFD incorrecto</h3>";
    while (
$msg openssl_error_string())
        echo 
$msg"\n";
}
openssl_free_key($pubkeyid);
echo 
"<hr>";

}
// }}} Valida Sello
// {{{ Valida este XML en el servidor del SAT 
// ftp://ftp2.sat.gob.mx/asistencia_servicio_ftp/publicaciones/cfdi/WS_ConsultaCFDI.pdf
function valida_en_sat() {
    global 
$data;
    
error_reporting(E_ALL);
    require_once(
'nusoap/nusoap.php');
    
$url "https://consultaqr.facturaelectronica.sat.gob.mx/consultacfdiservice.svc?wsdl";

    
$soapclient = new nusoap_client($url,$esWSDL=true);
    
$soapclient->soap_defencoding 'UTF-8'
    
$soapclient->decode_utf8 false;

    
$rfc_emisor $data['rfc'];
    
$rfc_receptor $data['rfc_receptor'];
    
$impo = (double)$data['total'];
    
$impo=sprintf("%.6f"$impo);
    
$impo str_pad($impo,17,"0",STR_PAD_LEFT);

    
$uuid strtoupper($data['uuid']);

    
$factura "?re=$rfc_emisor&rr=$rfc_receptor&tt=$impo&id=$uuid";

    
$prm = array('expresionImpresa'=>$factura);

    
$buscar=$soapclient->call('Consulta',$prm);

    echo 
"<h3>El portal del SAT reporta</h3>";
    echo 
"El codigo: ".$buscar['ConsultaResult']['CodigoEstatus']."<br>";
    echo 
"El estado: ".$buscar['ConsultaResult']['Estado']."<br>";

}
function 
convierte($dec) {
    
$hex=bcdechex($dec);
    
$ser="";
    for (
$i=1$i<strlen($hex); $i=$i+2) {
        
$ser.=substr($hex,$i,1);
    }
    return 
$ser;
}
function 
bcdechex($dec) {
    
$last bcmod($dec16);
    
$remain bcdiv(bcsub($dec$last), 16);
    if(
$remain == 0) {
        return 
dechex($last);
    } else {
        return 
bcdechex($remain).dechex($last);
    }
}
function 
getpath($qry) {
global 
$xp;
$prm = array();
$nodelist $xp->query($qry);
foreach (
$nodelist as $tmpnode)  {
    
$prm[] = trim($tmpnode->nodeValue);
    }
$ret = (sizeof($prm)<=1) ? $prm[0] : $prm;
return(
$ret);
}
function 
display_xml_errors() {
    global 
$texto;
    
$lineas explode("\n"$texto);
    
$errors libxml_get_errors();

    echo 
"<pre>";
    foreach (
$errors as $error) {
        echo 
display_xml_error($error$lineas);
    }
    echo 
"</pre>";

    
libxml_clear_errors();
}
function 
display_xml_error($error$lineas) {
    
$return  htmlspecialchars($lineas[$error->line 1]) . "\n7";
    
$return .= str_repeat('-'$error->column) . "^\n";

    switch (
$error->level) {
        case 
LIBXML_ERR_WARNING:
            
$return .= "Warning $error->code: ";
            break;
         case 
LIBXML_ERR_ERROR:
            
$return .= "Error $error->code: ";
            break;
        case 
LIBXML_ERR_FATAL:
            
$return .= "Fatal Error $error->code: ";
            break;
    }

    
$return .= trim($error->message) .
               
"\n  Linea: $error->line" .
               
"\n  Columna: $error->column";
    echo 
"$return\n\n--------------------------------------------\n\n";
}
?></div></BODY></HTML> 
http://www.lacorona.com.mx/fortiz/sat/cfdcvali.phps

Etiquetas: interpretar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:31.