SEGUNDA ENTREGA..PHP..
Sellar y meter todo a un xml. con la cadena que sale del xlst.
Código PHP:
$file=$keyP; // Ruta del certificado
$datos = file($file);
$certificado = ""; $carga=false;
for ($i=0; $i<sizeof($datos); $i++) //lellendo el certificado
{
if (strstr($datos[$i],"END CERTIFICATE")) $carga=false;
if ($carga) $certificado .= trim($datos[$i]);
if (strstr($datos[$i],"BEGIN CERTIFICATE")) $carga=true;
}
$root->setAttribute("certificado",$certificado);//lo pegamos al xml
$xml->formatOutput = true; //Genera un archivo con el mensaje XML + EDI O lo guarda en cfdsello
$todo = $xml->saveXML();
if ($ruta != "/dev/null")
{
$xml->formatOutput = true;
$xml->save($ruta.$nufa.".xml"); //con este xml se empalma el xslt ver 1
}
else
{
$paso = $todo;
$conn->replace("cfdsello",array("selldocu"=>$nufa,"sellcade"=>$cadena_original,"sellxml"=>$paso),"selldocu",true);
}
$file=$ruta."aaa010101aaa.key.pem"; //llave privada
$dom1 = new DOMDocument();
$dom1->load($ruta.$nufa.".xml"); //Cargas el XML de la factura (los datos aun estan incompletos)
$xsl = new DOMDocument;
$xsl->load($ruta."cadenaoriginal_1_0.xslt"); //Cargas el xsl
$proc = new XSLTProcessor;
$proc->registerPHPFunctions();
if (!$proc->hasExsltSupport()){echo"EXSLT NO disponible"; die('EXSLT NO disponible');}
$proc->importStyleSheet($xsl);
$cadena_original=$proc->transformToXML($dom1); //Transformas la salida, y obtiens la cadena original
$pkeyid = openssl_get_privatekey(file_get_contents($file)); //Obtienes la llave privada
openssl_sign($cadena_original, $crypttext, $pkeyid, OPENSSL_ALGO_MD5); //Firmas la cadena original
openssl_free_key($pkeyid);
$sello = base64_encode($crypttext); //lo codifica en base64
//$root->setAttribute("sello",$sello); //pegamos el sello al xml forma sencilla jjejejeje
$comp=$dom1->getElementsByTagName('Comprobante')->item(0)->attributes->getNamedItem('sello')->nodeValue=$sello; //agregas el sello
$dom1->save($ruta2.$_SESSION['pestananom'].$nufa.".xml"); //guardas de nuevo el sml ya completo
---------------funcion------------- es la misma que esta en la pagina de la corona.
function cargaAtt(&$nodo, $attr) //Funcion que carga los atributos a la etiqueta XML
{
global $xml, $cadena_original;
$quitar = array('sello'=>1,'noCertificado'=>1,'certificado'=>1);
foreach ($attr as $key => $val)
{
$val = preg_replace('/\s\s+/', ' ', $val); // Regla 5a y 5c
$val = trim($val); // Regla 5b
if (strlen($val)>0)
{ // Regla 6
$val = utf8_encode(str_replace("|","/",$val));
//$val = str_replace("|","/",$val);
$nodo->setAttribute($key,$val);
if (!isset($quitar[$key]))if (substr($key,0,3) != "xml" && substr($key,0,4) != "xsi:")$cadena_original .= $val . "|";
}
}
}
Saluds.. PHPEROS, que se diviertan, ya estoy emitiendo.
grax zeroccm por contestar en el otro hilo
(
Cita:
Iniciado por Nanox Ver Mensaje
alguien ya pudo?
)