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: 117
Antigüedad: 15 años, 3 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: 18 años, 4 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: 117
Antigüedad: 15 años, 3 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']==1 || $_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: 117
Antigüedad: 15 años, 3 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($dec, 16);
    
$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:24.