Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 62
Poder: 7
bilbur Va por buen camino
Cita:
Empezado por Sistel Ver Mensaje
¡¡¡¡ Genial, Bilbur !!!!

Estaba atrancado con el tema de la firma.
No conseguía firmar el XML sin errores.
Seguro que con tu clase Firmador, salgo, por fín, del atolladero.

Un cordial saludo

Si necesitas ayuda en la implementación, me dices. No sea que se me olvidara subir algo.
Para comprobar las firmas y antes de enviarlas yo utilizo estos dos enlaces

http://tools.chilkat.io/xmlDsigVerify.cshtml

https://web.uanataca.com/pe/servicio...ma-electronica

Si te da correcto en las dos validaciones pues ¡eureka!
Responder Con Cita
  #2  
Antiguo 03-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 62
Poder: 7
bilbur Va por buen camino
PHP Envío a TBAI GIP

Os adjunto lo que tengo hecho para el envío a Gipuzkoa
Este envío es el más sencillo
Más o menos lo que hago es:
  1. Proceso previo o simultáneo a la emisión y firma de la factura
  2. En el directorio donde están las facturas firmadas, creo, si no están, los directorios de Envios y Respuestas.
  3. Si la factura firmada existe en el directorio de facturas firmadas, la envío a TBAI GIP
  4. Me guardo la respuesta y si es afirmativa muevo la factura firmada al directorio de Envios
<div>
Código PHP:
if($hacienda_foral == 'GIP' && $orden_tbai != '000000')     {    
    
$directorio_TBAI $originales."TBAI/".$cif_340."/";
    
$directorio_TBAI_envios $originales."TBAI/".$cif_340."/Envios/";        
    if (!
is_dir($directorio_TBAI_envios))  mkdir($directorio_TBAI_envios0777);
    
$directorio_respuestas $directorio_TBAI.'Respuestas/';   
    if (!
is_dir($directorio_respuestas))  mkdir($directorio_respuestas0777);    

    
$estado_tbai '';
    
$xml_enviado_tbai $orden_tbai.'.xsig';
    
$guardado_enviar_tbai $directorio_TBAI.$xml_enviado_tbai;    
    if (
file_exists($guardado_enviar_tbai)) 
    {    
    
$estado_tbai 'No enviado';
    
$descripcion_TBAI $estado_tbai;
    
$xml file_get_contents($guardado_enviar_tbai);

    
$header_soap = array(
    
"Content-Type: application/xml;charset=utf-8",
    
"Accept: application/xml",
    
"Content-length: ".strlen($xml)
    );

$soap_do curl_init();
curl_setopt($soap_doCURLOPT_URL$url_TBAI );
curl_setopt($soap_doCURLOPT_CONNECTTIMEOUT100);
curl_setopt($soap_doCURLOPT_TIMEOUT,        100);
curl_setopt($soap_doCURLOPT_RETURNTRANSFERtrue);
curl_setopt($soap_doCURLOPT_FOLLOWLOCATIONtrue);
curl_setopt($soap_doCURLOPT_SSL_VERIFYPEERfalse);
curl_setopt($soap_doCURLOPT_SSL_VERIFYHOSTfalse);
curl_setopt($soap_doCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($soap_doCURLOPT_POST,           true );
curl_setopt($soap_doCURLOPT_SSLCERT,        getcwd().'/_certificandos'.$alias_pdf.'/'.$cif_340.'.pem' );
curl_setopt($soap_doCURLOPT_POSTFIELDS,     $xml);
curl_setopt($soap_doCURLOPT_HTTPHEADER,     $header_soap);

    
$response curl_exec($soap_do);     
    if(!
curl_exec($soap_do)) {
    
$err 'Error: ' curl_error($soap_do);
    
curl_close($soap_do);
    echo 
"<br>No se puede conectar con la TBAI GIP.<br><br>";    
    
print_r($err);
    echo 
"<br>";    
    echo 
"<br><b>Respuesta de la TBAI GIP: 312</b><br><br>";    
    
print_r($response);
    } else {
    
curl_close($soap_do);

    
$response preg_replace('/(<\s*)\w+:/','$1',$response);   // removes <xxx:
    
$response preg_replace('/(<\/\s*)\w+:/','$1',$response); // removes </xxx:
    
$response preg_replace('/\s+xmlns:[^>]+/','',$response); // removes xmlns:...    

    
$use_errors libxml_use_internal_errors(true);    
    
$parser simplexml_load_string($response);
    if (
$parser === false) {
    echo 
"<br>No se puede cargar el fichero xml devuelto por la TBA GIP.<br><br>";
    echo 
"<br>";    
    echo 
"<br><b>Respuesta de la TBAI GIP:</b><br><br>";    
    
print_r($response);
    }
    
libxml_clear_errors();
    
libxml_use_internal_errors($use_errors);    
    if (
$parser === false) exit();
    
$parser->asXML($directorio_respuestas.$orden_tbai.'.xml');
    }

    
$facturas_en_TBAI $parser;
    if (
$facturas_en_TBAI === false)    
    {
    echo 
"<br><b>Respuesta de TBAI parser:</b><br><br>";
    
print_r ($facturas_en_TBAI);
    }
    
$guardado_enviado_tbai $directorio_TBAI_envios.$xml_enviado_tbai;
    
    
$nodo $facturas_en_TBAI->Salida;
    
$Estado $nodo->Estado;    
    if(
$Estado == '00')    
    
rename($guardado_enviar_tbai,$guardado_enviado_tbai); /// atencion a esto
    
unset($facturas_en_TBAI);
    }    
     } 
// if($hacienda_foral == 'GIP') 
</div>Aparte tengo un script para visualizar la respuesta
En este lo más interesante puede ser la generación de la url del mensaje TBAI para verlo como si se tratara del código QR



Código PHP:
<?php

    $directorio_respuestas 
$directorio_TBAI.'Respuestas/';   
    if (!
is_dir($directorio_respuestas))  mkdir($directorio_respuestas0777);
    
$directorio_envios $directorio_TBAI.'Envios/';   
    if (!
is_dir($directorio_envios))  mkdir($directorio_envios0777);
    
    
$estado_tbai '';

    
$xml_enviado_tbai $orden_tbai.'.xsig';    
    
$guardado_enviado_tbai $directorio_envios.$xml_enviado_tbai;    
    if (
file_exists($guardado_enviado_tbai)) 
    
$estado_tbai 'Enviado'; else $estado_tbai 'No enviado';
    
$descripcion_TBAI $estado_tbai;

    if(
$estado_tbai == 'Enviado')
    {    
    
$msg_TBAI '';
    
$xml_actual_enviado simplexml_load_file($guardado_enviado_tbai);    
    
$signatureNodeActual $xml_actual_enviado->children('ds'true)->Signature;    
    
$SignatureValueFirmaFacturaActual $signatureNodeActual->SignatureValue;
    
$SignatureValueFirmaFacturaActual substr($SignatureValueFirmaFacturaActual,0,13);    
    
$factura_tbai_serie  $xml_actual_enviado->Factura->CabeceraFactura->SerieFactura;    
    
$factura_tbai_numero $xml_actual_enviado->Factura->CabeceraFactura->NumFactura;
    
$factura_tbai_fecha  $xml_actual_enviado->Factura->CabeceraFactura->FechaExpedicionFactura;    
    
$factura_tbai_fecha_dd substr($factura_tbai_fecha,0,2);
    
$factura_tbai_fecha_mm substr($factura_tbai_fecha,3,2);    
    
$factura_tbai_fecha_aa substr($factura_tbai_fecha,-2);        
    
$factura_tbai_importe  $xml_actual_enviado->Factura->DatosFactura->ImporteTotalFactura;        
    
$TBAIID  'TBAI'.$caracterSeparador.$cif_340.$caracterSeparador.$factura_tbai_fecha_dd;
    
$TBAIID .= $factura_tbai_fecha_mm.$factura_tbai_fecha_aa.$caracterSeparador;
    
$TBAIID .= $SignatureValueFirmaFacturaActual.$caracterSeparador;
    
$TBAIID utf8_encode($TBAIID);    
    
$cod_crc8 crc8($TBAIID);
    
$TBAIID  $TBAIID.$cod_crc8;
    unset(
$xml_actual_enviado);
    
$msg_TBAI =  $url_TBAI_QR.'?id='.$TBAIID.'&s='.$factura_tbai_serie.'&nf='.$factura_tbai_numero.'&i='.$factura_tbai_importe;
    
$msg_TBAI utf8_encode($msg_TBAI);    
    
$cod_crc8 crc8($msg_TBAI);
    
$msg_TBAI $msg_TBAI.'&cr='.$cod_crc8;    
    
$xml_respuesta $orden_tbai.'.xml';
    
$guardado_respuesta $directorio_respuestas.$xml_respuesta;
    if (
file_exists($guardado_respuesta)) 
    {
    
$respuesta_tbai simplexml_load_file($guardado_respuesta);
    if (
$respuesta_tbai === false) {
    
$estado_tbai 'No se puede leer la respuesta de TBAI';
    } else {
    
$estado_tbai 'Existe respuesta de TBAI';
    }
    } else {
    
$estado_tbai 'No se encuentra la respuesta de TBAI';
    
$sin_respuesta_tbai     '<?xml version="1.0" encoding="UTF-8"?>';
    
$sin_respuesta_tbai    .= '<Salida></Salida>';
    
$respuesta_tbai simplexml_load_string($sin_respuesta_tbai);    
    }
    
$descripcion_TBAI $estado_tbai;

    
$nodo $respuesta_tbai->Salida;
    
$Estado $nodo->Estado;
    
$FechaRecepcion $nodo->FechaRecepcion;

    if(
$Estado == '00')
    {    
    
$IdentificadorTBAI $nodo->IdentificadorTBAI;    
    
$Descripcion $nodo->Descripcion;
    
$Descripcion utf8_decode($Descripcion);
    
$CSV_tbai 'CSV: '.$nodo->CSV;
    
$ResultadosValidacion $nodo->ResultadosValidacion;
    
$CodigoRV $ResultadosValidacion->Codigo;
    if(
$CodigoRV)    
    
$DescripcionRV $errores_envio_TBAI["$CodigoRV"];    
    
$estado_tbai 'Correcto';    
    
$descripcion_TBAI $estado_tbai.': '.$IdentificadorTBAI.' '.$FechaRecepcion.' '.$Descripcion.' '.$CSV_tbai;
    if(
$CodigoRV)
    {    
    
$descripcion_TBAI .= ' '.$CodigoRV.' '.$DescripcionRV;
    
$estado_tbai 'Aviso';    
    }
    }    
    
    if(
$Estado == '01')    
    {
    
$ResultadosValidacion $nodo->ResultadosValidacion;
    
$CodigoRV $ResultadosValidacion->Codigo;
    
$DescripcionRV $errores_envio_TBAI["$CodigoRV"];    
    if(
substr($DescripcionRV,0,5) == 'Aviso' || $CodigoRV == '005' )
    
$estado_tbai 'Aviso';    
    else    
$estado_tbai 'Rechazado';
    
$descripcion_TBAI $estado_tbai.': '.$FechaRecepcion.' '.$CodigoRV.' '.$DescripcionRV;
    }
    unset(
$respuesta_tbai);
    } 
//  enviado
Tengo, si interesa, la generación del código QR para PDF con la libreria fpdf.


Comentamos ...
Responder Con Cita
  #3  
Antiguo 20-05-2021
canfora canfora is offline
Registrado
 
Registrado: may 2021
Posts: 3
Poder: 0
canfora Va por buen camino
PHP Envío a TBAI GIP

Buenos días,

Me acabo de poner con la programación en php para el envío de XML a TBAI a Gipuzkoa.
Estoy utilizando el código que sugerís a continuación y recibo en todo momento el siguiente error:
"
No se puede conectar con la TBAI GIP.

Error: unable to use client certificate (no key found or wrong pass phrase?)

Respuesta de la TBAI GIP: 312
"
Tengo un certificado pfx, el cual indico en la línea de declaración del CURLOPT_SSLCERT y añado la siguiente linea:
curl_setopt($soap_do, CURLOPT_SSLCERTPASSWD, $pass);

Si utilizo una conexión más sencilla, como la que indico a continuación, recibo el siguiente error:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXML);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

ERROR:
"
01
Rechazado
Baztertua

001
Error: No se ha utilizado certificado de cliente.
Errorea: Ez da erabili bezeroaren ziurtagiririk.
"

Muchísimas gracias por vuestra ayuda.

Cita:
Empezado por bilbur Ver Mensaje
Os adjunto lo que tengo hecho para el envío a Gipuzkoa
Este envío es el más sencillo
Más o menos lo que hago es:
  1. Proceso previo o simultáneo a la emisión y firma de la factura
  2. En el directorio donde están las facturas firmadas, creo, si no están, los directorios de Envios y Respuestas.
  3. Si la factura firmada existe en el directorio de facturas firmadas, la envío a TBAI GIP
  4. Me guardo la respuesta y si es afirmativa muevo la factura firmada al directorio de Envios
<div>
Código PHP:
if($hacienda_foral == 'GIP' && $orden_tbai != '000000')     {    
    
$directorio_TBAI $originales."TBAI/".$cif_340."/";
    
$directorio_TBAI_envios $originales."TBAI/".$cif_340."/Envios/";        
    if (!
is_dir($directorio_TBAI_envios))  mkdir($directorio_TBAI_envios0777);
    
$directorio_respuestas $directorio_TBAI.'Respuestas/';   
    if (!
is_dir($directorio_respuestas))  mkdir($directorio_respuestas0777);    

    
$estado_tbai '';
    
$xml_enviado_tbai $orden_tbai.'.xsig';
    
$guardado_enviar_tbai $directorio_TBAI.$xml_enviado_tbai;    
    if (
file_exists($guardado_enviar_tbai)) 
    {    
    
$estado_tbai 'No enviado';
    
$descripcion_TBAI $estado_tbai;
    
$xml file_get_contents($guardado_enviar_tbai);

    
$header_soap = array(
    
"Content-Type: application/xml;charset=utf-8",
    
"Accept: application/xml",
    
"Content-length: ".strlen($xml)
    );

$soap_do curl_init();
curl_setopt($soap_doCURLOPT_URL$url_TBAI );
curl_setopt($soap_doCURLOPT_CONNECTTIMEOUT100);
curl_setopt($soap_doCURLOPT_TIMEOUT,        100);
curl_setopt($soap_doCURLOPT_RETURNTRANSFERtrue);
curl_setopt($soap_doCURLOPT_FOLLOWLOCATIONtrue);
curl_setopt($soap_doCURLOPT_SSL_VERIFYPEERfalse);
curl_setopt($soap_doCURLOPT_SSL_VERIFYHOSTfalse);
curl_setopt($soap_doCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($soap_doCURLOPT_POST,           true );
curl_setopt($soap_doCURLOPT_SSLCERT,        getcwd().'/_certificandos'.$alias_pdf.'/'.$cif_340.'.pem' );
curl_setopt($soap_doCURLOPT_POSTFIELDS,     $xml);
curl_setopt($soap_doCURLOPT_HTTPHEADER,     $header_soap);

    
$response curl_exec($soap_do);     
    if(!
curl_exec($soap_do)) {
    
$err 'Error: ' curl_error($soap_do);
    
curl_close($soap_do);
    echo 
"<br>No se puede conectar con la TBAI GIP.<br><br>";    
    
print_r($err);
    echo 
"<br>";    
    echo 
"<br><b>Respuesta de la TBAI GIP: 312</b><br><br>";    
    
print_r($response);
    } else {
    
curl_close($soap_do);

    
$response preg_replace('/(<\s*)\w+:/','$1',$response);   // removes <xxx:
    
$response preg_replace('/(<\/\s*)\w+:/','$1',$response); // removes </xxx:
    
$response preg_replace('/\s+xmlns:[^>]+/','',$response); // removes xmlns:...    

    
$use_errors libxml_use_internal_errors(true);    
    
$parser simplexml_load_string($response);
    if (
$parser === false) {
    echo 
"<br>No se puede cargar el fichero xml devuelto por la TBA GIP.<br><br>";
    echo 
"<br>";    
    echo 
"<br><b>Respuesta de la TBAI GIP:</b><br><br>";    
    
print_r($response);
    }
    
libxml_clear_errors();
    
libxml_use_internal_errors($use_errors);    
    if (
$parser === false) exit();
    
$parser->asXML($directorio_respuestas.$orden_tbai.'.xml');
    }

    
$facturas_en_TBAI $parser;
    if (
$facturas_en_TBAI === false)    
    {
    echo 
"<br><b>Respuesta de TBAI parser:</b><br><br>";
    
print_r ($facturas_en_TBAI);
    }
    
$guardado_enviado_tbai $directorio_TBAI_envios.$xml_enviado_tbai;
    
    
$nodo $facturas_en_TBAI->Salida;
    
$Estado $nodo->Estado;    
    if(
$Estado == '00')    
    
rename($guardado_enviar_tbai,$guardado_enviado_tbai); /// atencion a esto
    
unset($facturas_en_TBAI);
    }    
     } 
// if($hacienda_foral == 'GIP') 
</div>Aparte tengo un script para visualizar la respuesta
En este lo más interesante puede ser la generación de la url del mensaje TBAI para verlo como si se tratara del código QR



Código PHP:
<?php

    $directorio_respuestas 
$directorio_TBAI.'Respuestas/';   
    if (!
is_dir($directorio_respuestas))  mkdir($directorio_respuestas0777);
    
$directorio_envios $directorio_TBAI.'Envios/';   
    if (!
is_dir($directorio_envios))  mkdir($directorio_envios0777);
    
    
$estado_tbai '';

    
$xml_enviado_tbai $orden_tbai.'.xsig';    
    
$guardado_enviado_tbai $directorio_envios.$xml_enviado_tbai;    
    if (
file_exists($guardado_enviado_tbai)) 
    
$estado_tbai 'Enviado'; else $estado_tbai 'No enviado';
    
$descripcion_TBAI $estado_tbai;

    if(
$estado_tbai == 'Enviado')
    {    
    
$msg_TBAI '';
    
$xml_actual_enviado simplexml_load_file($guardado_enviado_tbai);    
    
$signatureNodeActual $xml_actual_enviado->children('ds'true)->Signature;    
    
$SignatureValueFirmaFacturaActual $signatureNodeActual->SignatureValue;
    
$SignatureValueFirmaFacturaActual substr($SignatureValueFirmaFacturaActual,0,13);    
    
$factura_tbai_serie  $xml_actual_enviado->Factura->CabeceraFactura->SerieFactura;    
    
$factura_tbai_numero $xml_actual_enviado->Factura->CabeceraFactura->NumFactura;
    
$factura_tbai_fecha  $xml_actual_enviado->Factura->CabeceraFactura->FechaExpedicionFactura;    
    
$factura_tbai_fecha_dd substr($factura_tbai_fecha,0,2);
    
$factura_tbai_fecha_mm substr($factura_tbai_fecha,3,2);    
    
$factura_tbai_fecha_aa substr($factura_tbai_fecha,-2);        
    
$factura_tbai_importe  $xml_actual_enviado->Factura->DatosFactura->ImporteTotalFactura;        
    
$TBAIID  'TBAI'.$caracterSeparador.$cif_340.$caracterSeparador.$factura_tbai_fecha_dd;
    
$TBAIID .= $factura_tbai_fecha_mm.$factura_tbai_fecha_aa.$caracterSeparador;
    
$TBAIID .= $SignatureValueFirmaFacturaActual.$caracterSeparador;
    
$TBAIID utf8_encode($TBAIID);    
    
$cod_crc8 crc8($TBAIID);
    
$TBAIID  $TBAIID.$cod_crc8;
    unset(
$xml_actual_enviado);
    
$msg_TBAI =  $url_TBAI_QR.'?id='.$TBAIID.'&s='.$factura_tbai_serie.'&nf='.$factura_tbai_numero.'&i='.$factura_tbai_importe;
    
$msg_TBAI utf8_encode($msg_TBAI);    
    
$cod_crc8 crc8($msg_TBAI);
    
$msg_TBAI $msg_TBAI.'&cr='.$cod_crc8;    
    
$xml_respuesta $orden_tbai.'.xml';
    
$guardado_respuesta $directorio_respuestas.$xml_respuesta;
    if (
file_exists($guardado_respuesta)) 
    {
    
$respuesta_tbai simplexml_load_file($guardado_respuesta);
    if (
$respuesta_tbai === false) {
    
$estado_tbai 'No se puede leer la respuesta de TBAI';
    } else {
    
$estado_tbai 'Existe respuesta de TBAI';
    }
    } else {
    
$estado_tbai 'No se encuentra la respuesta de TBAI';
    
$sin_respuesta_tbai     '<?xml version="1.0" encoding="UTF-8"?>';
    
$sin_respuesta_tbai    .= '<Salida></Salida>';
    
$respuesta_tbai simplexml_load_string($sin_respuesta_tbai);    
    }
    
$descripcion_TBAI $estado_tbai;

    
$nodo $respuesta_tbai->Salida;
    
$Estado $nodo->Estado;
    
$FechaRecepcion $nodo->FechaRecepcion;

    if(
$Estado == '00')
    {    
    
$IdentificadorTBAI $nodo->IdentificadorTBAI;    
    
$Descripcion $nodo->Descripcion;
    
$Descripcion utf8_decode($Descripcion);
    
$CSV_tbai 'CSV: '.$nodo->CSV;
    
$ResultadosValidacion $nodo->ResultadosValidacion;
    
$CodigoRV $ResultadosValidacion->Codigo;
    if(
$CodigoRV)    
    
$DescripcionRV $errores_envio_TBAI["$CodigoRV"];    
    
$estado_tbai 'Correcto';    
    
$descripcion_TBAI $estado_tbai.': '.$IdentificadorTBAI.' '.$FechaRecepcion.' '.$Descripcion.' '.$CSV_tbai;
    if(
$CodigoRV)
    {    
    
$descripcion_TBAI .= ' '.$CodigoRV.' '.$DescripcionRV;
    
$estado_tbai 'Aviso';    
    }
    }    
    
    if(
$Estado == '01')    
    {
    
$ResultadosValidacion $nodo->ResultadosValidacion;
    
$CodigoRV $ResultadosValidacion->Codigo;
    
$DescripcionRV $errores_envio_TBAI["$CodigoRV"];    
    if(
substr($DescripcionRV,0,5) == 'Aviso' || $CodigoRV == '005' )
    
$estado_tbai 'Aviso';    
    else    
$estado_tbai 'Rechazado';
    
$descripcion_TBAI $estado_tbai.': '.$FechaRecepcion.' '.$CodigoRV.' '.$DescripcionRV;
    }
    unset(
$respuesta_tbai);
    } 
//  enviado
Tengo, si interesa, la generación del código QR para PDF con la libreria fpdf.


Comentamos ...
Responder Con Cita
  #4  
Antiguo 20-05-2021
tejano tejano is offline
Miembro
 
Registrado: dic 2020
Posts: 132
Poder: 6
tejano Va por buen camino
Buenos días,

Estoy con el formato LROE 240 de la DFB.
Sobre el campo "Factura emitida", "TicketBai" hay que codificar el fichero TicketBai en Base64.
El fichero TicketBai al que se refieren que hay que codificar, es el fichero ya firmado, no?

Gracias
Responder Con Cita
  #5  
Antiguo 20-05-2021
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.229
Poder: 24
keys Va por buen camino
Cita:
Empezado por tejano Ver Mensaje
Buenos días,

Estoy con el formato LROE 240 de la DFB.
Sobre el campo "Factura emitida", "TicketBai" hay que codificar el fichero TicketBai en Base64.
El fichero TicketBai al que se refieren que hay que codificar, es el fichero ya firmado, no?

Gracias
Si hay que enviar el fichero ya firmado.
Responder Con Cita
  #6  
Antiguo 20-05-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por canfora Ver Mensaje
01
Rechazado
Baztertua

001
Error: No se ha utilizado certificado de cliente.
Errorea: Ez da erabili bezeroaren ziurtagiririk.

El error parece claro, no les está llegando el certificado al enviar.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 20-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 62
Poder: 7
bilbur Va por buen camino
Cita:
Empezado por canfora Ver Mensaje
Buenos días,

Me acabo de poner con la programación en php para el envío de XML a TBAI a Gipuzkoa.
Estoy utilizando el código que sugerís a continuación y recibo en todo momento el siguiente error:
"
No se puede conectar con la TBAI GIP.

Error: unable to use client certificate (no key found or wrong pass phrase?)

Respuesta de la TBAI GIP: 312
"
Tengo un certificado pfx, el cual indico en la línea de declaración del CURLOPT_SSLCERT y añado la siguiente linea:
curl_setopt($soap_do, CURLOPT_SSLCERTPASSWD, $pass);

Si utilizo una conexión más sencilla, como la que indico a continuación, recibo el siguiente error:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXML);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

ERROR:
"
01
Rechazado
Baztertua

001
Error: No se ha utilizado certificado de cliente.
Errorea: Ez da erabili bezeroaren ziurtagiririk.
"

Muchísimas gracias por vuestra ayuda.
Pasa el certificado a .pem
En el envío a GIP o BAtUZ hay que identificarse, pero no firmar
El certificado ha de estar tb instalado en el navegador (creo)
El .pem no requiere pass
Si necesitas el "como" tengo un apaño para importar certificados pfx y pasarlos a pem
Ya dices
Responder Con Cita
  #8  
Antiguo 20-05-2021
canfora canfora is offline
Registrado
 
Registrado: may 2021
Posts: 3
Poder: 0
canfora Va por buen camino
Buenas,

tengo este pequeño código para pasar el certificado a pem, pero sigue sin funcionarme.

Código:
$data = file_get_contents($dir_cert);
openssl_pkcs12_read($data, $certs, $certPassword);

$publicChain = array($certs['cert']);
if (!empty($certs['extracerts'])) {
	$publicChain = array_merge($publicChain, $certs['extracerts']);
}
$privateKey = openssl_pkey_get_private($certs['pkey']);
Paso la variable $publicChain

Muchas gracias!!



Cita:
Empezado por bilbur Ver Mensaje
Pasa el certificado a .pem
En el envío a GIP o BAtUZ hay que identificarse, pero no firmar
El certificado ha de estar tb instalado en el navegador (creo)
El .pem no requiere pass
Si necesitas el "como" tengo un apaño para importar certificados pfx y pasarlos a pem
Ya dices
Responder Con Cita
  #9  
Antiguo 21-05-2021
canfora canfora is offline
Registrado
 
Registrado: may 2021
Posts: 3
Poder: 0
canfora Va por buen camino
Buenos días!!!

Ya conseguí la conexión. Ahora toca pegarse con el XML.

Muchas gracias,

Cita:
Empezado por canfora Ver Mensaje
Buenas,

tengo este pequeño código para pasar el certificado a pem, pero sigue sin funcionarme.

Código:
$data = file_get_contents($dir_cert);
openssl_pkcs12_read($data, $certs, $certPassword);

$publicChain = array($certs['cert']);
if (!empty($certs['extracerts'])) {
	$publicChain = array_merge($publicChain, $certs['extracerts']);
}
$privateKey = openssl_pkey_get_private($certs['pkey']);
Paso la variable $publicChain

Muchas gracias!!
Responder Con Cita
  #10  
Antiguo 05-01-2022
GorkaB GorkaB is offline
Miembro
 
Registrado: dic 2021
Posts: 20
Poder: 0
GorkaB Va por buen camino
Cita:
Empezado por canfora Ver Mensaje
Buenos días!!!

Ya conseguí la conexión. Ahora toca pegarse con el XML.

Muchas gracias,

Hola canfora,
Me quedé ahí... ¿Cómo lo solucionaste?

Me da error:
Código PHP:
Errorcould not load PEM client certificateOpenSSL error  error:0909006C:PEM routines:get_name:no start line, (no key foundwrong  pass phrase, or wrong file format?) 
Responder Con Cita
  #11  
Antiguo 26-05-2021
luismartin luismartin is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
luismartin Va por buen camino
Cita:
Empezado por canfora Ver Mensaje
Buenos días,

Me acabo de poner con la programación en php para el envío de XML a TBAI a Gipuzkoa.
Estoy utilizando el código que sugerís a continuación y recibo en todo momento el siguiente error:
"
No se puede conectar con la TBAI GIP.

Error: unable to use client certificate (no key found or wrong pass phrase?)

Respuesta de la TBAI GIP: 312
"
Tengo un certificado pfx, el cual indico en la línea de declaración del CURLOPT_SSLCERT y añado la siguiente linea:
curl_setopt($soap_do, CURLOPT_SSLCERTPASSWD, $pass);

Si utilizo una conexión más sencilla, como la que indico a continuación, recibo el siguiente error:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXML);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

ERROR:
"
01
Rechazado
Baztertua

001
Error: No se ha utilizado certificado de cliente.
Errorea: Ez da erabili bezeroaren ziurtagiririk.
"

Muchísimas gracias por vuestra ayuda.

Hola Canfora, a ver si esto te puede ayudar, ya que llegué a ese punto, y finalmente la conexión me la validó (aunque ahora estoy con otro problema):
como te indica Bilbur, debes usar un certificado de tipo PEM, pero según he hecho yo, generando 3 ficheros PEM por separado (usando el comando openssl): el del cliente, el de la clave privada, y el de la autoridad certificadora:

Cita:
openssl pkcs12 -in abcd.pfx -out ca.pem -cacerts -nokeys
openssl pkcs12 -in abcd.pfx -out client.pem -clcerts -nokeys
openssl pkcs12 -in abcd.pfx -out key.pem -nocerts
No he podido poner el enlace de la fuente por ser un usuario nuevo Y lo que tampoco tengo aún claro, es cómo hacer esta conversión de forma automática, sin necesidad de user input.

Al final, el código de la petición cURL es este:

Código PHP:
        $xmlStr file_get_contents($rutaFacturaXML);
        
        
$ch curl_init($url);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_SSLCERTPATH_TEMP '/client.pem');
        
curl_setopt($chCURLOPT_SSLKEYPATH_TEMP '/key.pem');
        
curl_setopt($chCURLOPT_CAINFOPATH_TEMP '/ca.pem');
        
curl_setopt($chCURLOPT_SSLKEYPASSWD$clave);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEER1);
        
curl_setopt($chCURLOPT_POSTFIELDS$xmlStr);
        
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/xml; charset=utf-8')); 
        
$resp curl_exec($ch); 
Responder Con Cita
  #12  
Antiguo 26-05-2021
luismartin luismartin is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
luismartin Va por buen camino
(002) Error: No se permite firma Enveloping.

Hola a todos, soy nuevo en el foro, aunque ya lo llevo usando un tiempo, y me ha sido de gran ayuda para la generación de las facturas TBAI.

El problema con el que me encuentro ahora, es que al realizar el envío, recibo este error:

Código:
(002) Error: El fichero de alta TicketBAI no cumple el esquema XSD. No se permite firma Enveloping.
En la documentación de TBAI, vi que esto se debe a que la firma que genero, se hace en formato Enveloping, cuando debería ser Enveloped.

Para la generación de la firma en el documento, utilizo el comando de la aplicación Autofirma, con las siguientes opciones:

Código:
autofirma  sign -i ruta/fichero.xml -o ruta/fichero.firmado.xml -format xades -store pkcs12:certificado.pfx -password ***** -filter "imported"
El fichero generado, fichero.firmado.xml, pasa la validación de estos validadores que he encotrado en este mismo hilo:
Uno de chilkat
Y otro de uanataca (lo siento, aún no puedo poner enlaces al ser usuario nuevo)

Posteriormente, vi el mensaje #470 en el hilo, y añadí la opción que indica poner:
Código:
-config="format=XAdES Enveloped\npolicyIdentifier=h......"
Pero al hacerlo, recibo el error de formato no permitido.

Alguien sabría decirme qué más debo hacer para obtener la firma en el formato Enveloped??

Gracias!
Responder Con Cita
  #13  
Antiguo 26-05-2021
tejano tejano is offline
Miembro
 
Registrado: dic 2020
Posts: 132
Poder: 6
tejano Va por buen camino
Cita:
Empezado por luismartin Ver Mensaje
Hola a todos, soy nuevo en el foro, aunque ya lo llevo usando un tiempo, y me ha sido de gran ayuda para la generación de las facturas TBAI.

El problema con el que me encuentro ahora, es que al realizar el envío, recibo este error:

Código:
(002) Error: El fichero de alta TicketBAI no cumple el esquema XSD. No se permite firma Enveloping.
En la documentación de TBAI, vi que esto se debe a que la firma que genero, se hace en formato Enveloping, cuando debería ser Enveloped.

Para la generación de la firma en el documento, utilizo el comando de la aplicación Autofirma, con las siguientes opciones:

Código:
autofirma  sign -i ruta/fichero.xml -o ruta/fichero.firmado.xml -format xades -store pkcs12:certificado.pfx -password ***** -filter "imported"
El fichero generado, fichero.firmado.xml, pasa la validación de estos validadores que he encotrado en este mismo hilo:
Uno de chilkat
Y otro de uanataca (lo siento, aún no puedo poner enlaces al ser usuario nuevo)

Posteriormente, vi el mensaje #470 en el hilo, y añadí la opción que indica poner:
Código:
-config="format=XAdES Enveloped\npolicyIdentifier=h......"
Pero al hacerlo, recibo el error de formato no permitido.

Alguien sabría decirme qué más debo hacer para obtener la firma en el formato Enveloped??

Gracias!
Te doy las instrucciones para la DBF con la línea de comando de autofirma "autofirmacommandline"

AutoFirmaCommandLine.exe sign
-i nombre_fichero
-o nombre_fichero_firmado
-store pkcs12:nombre_certificado.p12
-password contraseña_certificado
-filter nombre_certificado.p12
-format xades -xml
-config "format=XAdES Enveloped
\npolicyIdentifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf
\npolicyIdentifierHash=Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=
\npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256
\npolicyQualifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf

A mi me funciona bien, aunque tarda unos 3 sg por cada fichero.

Esto lo pusieron en el foro hace algún tiempo y me ayudo mucho.
Responder Con Cita
  #14  
Antiguo 26-05-2021
luismartin luismartin is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
luismartin Va por buen camino
Cita:
Empezado por tejano Ver Mensaje
Te doy las instrucciones para la DBF con la línea de comando de autofirma "autofirmacommandline"

AutoFirmaCommandLine.exe sign
-i nombre_fichero
-o nombre_fichero_firmado
-store pkcs12:nombre_certificado.p12
-password contraseña_certificado
-filter nombre_certificado.p12
-format xades -xml
-config "format=XAdES Enveloped
\npolicyIdentifier=..../fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf
\npolicyIdentifierHash=Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=
\npolicyIdentifierHashAlgorithm=..../2001/04/xmlenc#sha256
\npolicyQualifier=.../fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf

A mi me funciona bien, aunque tarda unos 3 sg por cada fichero.

Esto lo pusieron en el foro hace algún tiempo y me ayudo mucho.
Hola tejano. Sí, justo eso es lo que decía que había probado después del primer error. Lo he probado de nuevo, y sigo con el mismo error (de nuevo tengo que quitar los enlaces que hay dentro del formato, porque de momento, no me deja publicar si los pongo):

Código:
No se reconoce el parametro -config=format=XAdES Enveloped
policyIdentifier=...sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf
policyIdentifierHash=Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=
policyIdentifierHashAlgorithm=.../2001/04/xmlenc#sha256
policyQualifier=.../fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf
Responder Con Cita
  #15  
Antiguo 26-05-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Cita:
Empezado por tejano Ver Mensaje
Te doy las instrucciones para la DBF con la línea de comando de autofirma "autofirmacommandline"

AutoFirmaCommandLine.exe sign
-i nombre_fichero
-o nombre_fichero_firmado
-store pkcs12:nombre_certificado.p12
-password contraseña_certificado
-filter nombre_certificado.p12
-format xades -xml
-config "format=XAdES Enveloped
\npolicyIdentifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf
\npolicyIdentifierHash=Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=
\npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256
\npolicyQualifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf

A mi me funciona bien, aunque tarda unos 3 sg por cada fichero.

Esto lo pusieron en el foro hace algún tiempo y me ayudo mucho.
Hola tejano,

Yo también probé Autofirma para este tema de TicketBAI.
(Aunque odio con todas mis fuerzas las aplicaciones en Java )
Y también noté que tardaba del orden de segundos la firma de cada fichero.

Me puse a desarrollarlo en PHP (y sin librerías externas).
Y ahora la generación del XML y su firma tardan en total unos 15 milisegundos.

Saludos
Responder Con Cita
  #16  
Antiguo 26-05-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Cita:
Empezado por luismartin Ver Mensaje
Código PHP:
        $xmlStr file_get_contents($rutaFacturaXML);
        
        
$ch curl_init($url);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_SSLCERTPATH_TEMP '/client.pem');
        
curl_setopt($chCURLOPT_SSLKEYPATH_TEMP '/key.pem');
        
curl_setopt($chCURLOPT_CAINFOPATH_TEMP '/ca.pem');
        
curl_setopt($chCURLOPT_SSLKEYPASSWD$clave);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEER1);
        
curl_setopt($chCURLOPT_POSTFIELDS$xmlStr);
        
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/xml; charset=utf-8')); 
        
$resp curl_exec($ch); 
Hola luismartin,

Cuando ya tienes convertido el certificado a formato PEM, ya no necesitas la clave.
Puedes quitar la línea curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $clave);
Tampoco se necesita el certificado CA de la Autoridad Certificadora.
Así que puede quitar también curl_setopt($ch, CURLOPT_CAINFO, PATH_TEMP . '/ca.pem');

Saludos
Responder Con Cita
  #17  
Antiguo 26-05-2021
luismartin luismartin is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
luismartin Va por buen camino
Cita:
Empezado por Sistel Ver Mensaje
Hola luismartin,

Cuando ya tienes convertido el certificado a formato PEM, ya no necesitas la clave.
Puedes quitar la línea curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $clave);
Tampoco se necesita el certificado CA de la Autoridad Certificadora.
Así que puede quitar también curl_setopt($ch, CURLOPT_CAINFO, PATH_TEMP . '/ca.pem');

Saludos
Gracias Sistel! No tenía ni idea. El tema de los certificados y firmas digitales es muy alien para mi.
Responder Con Cita
  #18  
Antiguo 26-05-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 484
Poder: 7
Sistel Va por buen camino
Cita:
Empezado por luismartin Ver Mensaje
Gracias Sistel! No tenía ni idea. El tema de los certificados y firmas digitales es muy alien para mi.
Normal.
Para mí también el tema de certificados digitales era territorio comanche ... hasta hace poco.

Saludos
Responder Con Cita
  #19  
Antiguo 05-01-2022
GorkaB GorkaB is offline
Miembro
 
Registrado: dic 2021
Posts: 20
Poder: 0
GorkaB Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
Os adjunto lo que tengo hecho para el envío a Gipuzkoa...
...Tengo, si interesa, la generación del código QR para PDF con la libreria fpdf.

Comentamos ...

Me interesa la generación del QR. Bueno, primero de todo, muchísimas gracias por lo compartido, me está ayudando muchísimo. ¿Hay algún apartado en donde estén recopilados todos los archivos de php?


Muchísimas gracias de nuevo,
Un saludo
Responder Con Cita
  #20  
Antiguo 05-05-2021
Edgar7 Edgar7 is offline
Miembro
 
Registrado: nov 2020
Posts: 10
Poder: 0
Edgar7 Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
Si necesitas ayuda en la implementación, me dices. No sea que se me olvidara subir algo.
Para comprobar las firmas y antes de enviarlas yo utilizo estos dos enlaces

Si te da correcto en las dos validaciones pues ¡eureka!

Lo primero de todo, gracias por compartir el código de PHP, y a todos los miembros del hilo por que se aclaran muchas dudas que se va generando durante el desarrollo.

Llevo ya un tiempo con esto y la firma de momento es con diferencia lo que mas problema me esta dando, y tras probar tu codigo la cuestión es:

Y si no da correcto en ninguna validación?? Estoy usando un certificado de empresa con extensión p12 pero creo que ese no es el problema, y ya no se que mas hacer, he intentado comparar con un archivo TicketBAI que de ejemplo que me descargue de ello y ese si que pasa la validación pero por mas que los comparo no entiendo muy bien el problema.

Signature is Invalid
Number of Reference Digests = 3
Reference 1 digest is invalid because the computed digest differs from the digest in the XML.
Reference 2 digest is invalid because the computed digest differs from the digest in the XML.
Reference 3 digest is valid.

¿Podrías confirmarme si el código que tienes puesto te genera correctamente la firma o decirme si te ha pasado algo similar?

Muchas gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice newtron Internet 3716 19-01-2026 20:01:34
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 09:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 16:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 09:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 09:21:14


La franja horaria es GMT +2. Ahora son las 01:19:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi