Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

joselugrk 11-05-2021 17:11:55

Ayuda Chilkat - Error Envío Fichero
 
Cita:

Empezado por Sistel (Mensaje 540881)
Hola joselugrk,

Eso ya tiene muy buena pinta.
El error B4_2000033, según el documento de validaciones y errores del LROE (.../fitxategiak/batuz/lroe/Batuz_LROE_Validaciones_Errores_V1_0_5.pdf) es
La Cuota del impuesto tiene un valor incorrecto para los campos Tipo impositivo y Base imponible suministrados.

Ya es error normal en los datos económicos de la factura.

Saludos

Hola Sistel,

Si miras en las especificaciones de envío pone la versión LROE_PF_140_1_1_Ingresos_ConfacturaConSG_AltaPeticion_V1_0_2.xsd. Y en el ejemplo
Ejemplo_1_LROE_PF_140_IngresosConFacturaConSG_79732487C.xml también pone la misma versión.

Parece que están desfasados en la creación de los documentos y su implantación en el entorno de pruebas. ¿Cómo les habrá funcionado a ellos?

Saludos y mi agradecimiento por el esfuerzo realizado,
Joselu

bilbur 11-05-2021 18:53:35

Consultas a Batuz
 
Me funcionan bien las consultas, excepto el filtro por fechas


Código:

<?xml version='1.0' encoding='UTF-8'?>
<lrpjfecsgcp:LROEPJ240FacturasEmitidasConSGConsultaPeticion
xmlns:lrpjfecsgcp='https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_ConsultaPeticion_V1_0_0.xsd'>
    <Cabecera>
    <Modelo>240</Modelo>
    <Capitulo>1</Capitulo>
    <Subcapitulo>1.1</Subcapitulo>
    <Operacion>C00</Operacion>
    <Version>1.0</Version>
    <Ejercicio>2021</Ejercicio>
    <ObligadoTributario>
    <NIF>xxxxxxx</NIF>
    <ApellidosNombreRazonSocial>xxxxxxxxx, S.L.</ApellidosNombreRazonSocial>
    </ObligadoTributario>
    </Cabecera>
    <FiltroConsultaFacturasEmitidasConSG>
    <CabeceraFactura>
    <FechaExpedicionFactura>
    <Desde>11-05-2021</Desde>
    <Hasta>11-05-2021</Hasta>
    </FechaExpedicionFactura>

    </CabeceraFactura>
    <NumPaginaConsulta>1</NumPaginaConsulta>
    </FiltroConsultaFacturasEmitidasConSG>
    </lrpjfecsgcp:LROEPJ240FacturasEmitidasConSGConsultaPeticion>

Me devuelve el Error B4_1000001 El XML no cumple el esquema.[Linea:13 Columna:91] Error:cvc-complex-type.2.4.a

Por más que miro el xsd no encuentro el error
Seguro que es cosa de "ellos" pero por preguntar que no quede
Gracias

bilbur 11-05-2021 19:11:03

PHP Envío a TBAI BIZ Batuz
 
Como ya me funciona bien lo de los envíos a batuz os dejo el código


Lo primero que hago es separar por ejercicios el envío, no sea que en enero quira enviar facturas de diciembre y de enero


Código PHP:


    if (file_exists($guardado_enviar_tbai)) {
    $fra_enviada = file_get_contents($guardado_enviar_tbai);
    $fichero = base64_encode($fra_enviada);    
     $xml_facturas[] = "<TicketBai>".$fichero."</TicketBai>";    // array de facturas
    }
   $xml  = "<?xml version='1.0' encoding='UTF-8'?>";
    $xml .= "<lrpjfecsgap:LROEPJ240FacturasEmitidasConSGAltaPeticion
    xmlns:lrpjfecsgap='https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd'>";
    $xml .= "<Cabecera>
    <Modelo>240</Modelo>
    <Capitulo>1</Capitulo>
    <Subcapitulo>1.1</Subcapitulo>
    <Operacion>A00</Operacion>
    <Version>1.0</Version>
    <Ejercicio>".$xml_ejercicio."</Ejercicio>  // ejercicio 2020 o 2021 o 2022 ...
    <ObligadoTributario>
    <NIF>".$cif_340."</NIF>
    <ApellidosNombreRazonSocial>".$mombre_340."</ApellidosNombreRazonSocial>
    </ObligadoTributario>
    </Cabecera>";
    
    $xml .= "<FacturasEmitidas>";
    
    foreach($xml_facturas as $value) // array con los tbai en base64
    {
    $xml .= "<FacturaEmitida>";
     $xml .= $value;
    $xml .= "</FacturaEmitida>";    
    }
    $xml .= "</FacturasEmitidas>";
    $xml .= "</lrpjfecsgap:LROEPJ240FacturasEmitidasConSGAltaPeticion>";

    $ahora = round(microtime(true) * 10000);
    $ahora = sprintf ( "%.0f", $ahora );    // nombre del fichero xml de envío
    $guardar_como_xml = 'LROE_240_'.$ahora.'.xml';
    file_put_contents($directorio_TBAI_envios.$guardar_como_xml, $xml);
    $guardar_como_gzip = 'LROE_240_'.$ahora.'.xml.gz';
    
    $xml_data = file_get_contents($directorio_TBAI_envios.$guardar_como_xml);
    $gzip_data = gzencode($xml_data); //  nombre del fichero gz de envío

$eusbizkaian3data  = '{"con":"LROE","apa":"1.1","inte":';
$eusbizkaian3data .= '{"nif":"'.$cif_340.'","nrs":"'.$mombre_340.'"},';
$eusbizkaian3data .= '"drs":{"mode":"240","ejer":"'.$xml_ejercicio.'"}}';

    $header_soap = array(
    "Accept-Encoding: gzip",
    "Content-Encoding: gzip",
    "Content-Type: application/octet-stream",
    "eus-bizkaia-n3-version: 1.0",
    "eus-bizkaia-n3-content-type: application/xml",
    "eus-bizkaia-n3-data: ".$eusbizkaian3data,
    "Content-length: ".strlen($gzip_data)
    );

$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL,                 $url_TBAI); // url de envío pruebas
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT,     500);
curl_setopt($soap_do, CURLOPT_TIMEOUT,            500);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER,     true);
curl_setopt($soap_do, CURLOPT_HEADER  ,     true);
curl_setopt($soap_do, CURLOPT_FOLLOWLOCATION,     true);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER,     false);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST,     false);
curl_setopt($soap_do, CURLOPT_USERAGENT,         'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($soap_do, CURLOPT_POST,               true);
curl_setopt($soap_do, CURLOPT_SSLCERT,            getcwd().'/_certificandos'.$alias_pdf.'/'.$cif_340.'.pem');
curl_setopt($soap_do, CURLOPT_POSTFIELDS,         $gzip_data);
curl_setopt($soap_do, CURLOPT_HTTPHEADER,         $header_soap);
chdir('ticketBAI');    

    $response = curl_exec($soap_do); 
    $size_response = curl_getinfo($soap_do, CURLINFO_HEADER_SIZE);
    $header_response = substr($response, 0, $size_response);
    $body_response = substr($response, $size_response);

    function get_headers_from_curl_response($header_response) // para la cabecera respuesta
    {
    $headers_r = array();
    foreach (explode("\r\n", $header_response) as $i => $line)
    if ($i !== 0)
    {
    list ($key, $value) = explode(': ', $line);
    $headers_r[$key] = utf8_encode($value);
    }
    return $headers_r;
    }

Continúo para ver las cabeceras de respuesta


Código PHP:

    $headers_r get_headers_from_curl_response($header_response);
//var_dump($headers_r);
    
$respuesta_tipo $headers_r['eus-bizkaia-n3-tipo-respuesta'];

    if(
$respuesta_tipo == 'Incorrecto')
    {
    include_once(
$_SERVER['DOCUMENT_ROOT'].'/_configs/_header_ifx.php' );        
    
$respuesta_codigo  $headers_r['eus-bizkaia-n3-codigo-respuesta'];
    
$respuesta_mensaje $headers_r['eus-bizkaia-n3-mensaje-respuesta'];        
    echo 
"<br><TABLE align=center width=97% class=gris>";
    echo 
"<tr class=amarillo>";
    echo 
"<td align=left><div id=tit1>
    Respuesta del envío de hoy a TBAI Bizkaia de facturas emitidas firmadas"
;
    echo 
"&nbsp;&nbsp;&nbsp;<b>$respuesta_tipo</b></td></tr>";
    echo 
"<tr class=amarillo>";    
    echo 
"<td align=left><div id=tit1>
    Error 
$respuesta_codigo";
    echo 
"&nbsp;&nbsp;&nbsp;<b>$respuesta_mensaje</b></td>";    
    echo
"</tr></table><br>";
//    exit();
    


Si va todo bien descomprimo, descomprimo y guardo


Código PHP:

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



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

    
$use_errors libxml_use_internal_errors(true);    
    
$parser simplexml_load_string($xmlString);
    if (
$parser === false) {
    echo 
"<br>No se puede cargar el fichero comprimido devuelto por la TBAI.<br><br>";
    echo 
"<br>";    
    echo 
"<br><b>Respuesta de la TBAI 0:</b><br><br>";    
    
print_r($headers_r);

    exit();
    }
    
libxml_clear_errors();
    
libxml_use_internal_errors($use_errors);    
    if (
$parser === false) exit();
    
$parser->asXML($directorio_respuestas.'LROE_240_'.$ahora.'.xml');
    } 

Para mostrar los registros, pendiente de afinar


Código PHP:

    $facturas_en_TBAI $parser;
    if (
$facturas_en_TBAI === false)    
    {
    echo 
"<br><b>Respuesta de TBAI parser:</b><br><br>";
    
print_r ($facturas_en_TBAI);
    }

    echo 
"<br><TABLE align=center width=97% class=gris>";
    echo 
"<tr class=amarillo>";
    echo 
"<td align=left><div id=tit1>
    Respuesta del envío de hoy a TBAI Bizkaia de facturas emitidas firmadas"
;
    echo 
"&nbsp;&nbsp;&nbsp;<b>$respuesta_tipo</b></td>";
    echo
"</tr></table><br>";
    
    if(
$respuesta_tipo == 'Incorrecto' || $respuesta_tipo == 'Parcialmente correcto')
    {
    include_once(
$_SERVER['DOCUMENT_ROOT'].'/_configs/_header_ifx.php' );        
    
$respuesta_codigo  $headers_r['eus-bizkaia-n3-codigo-respuesta'];
    
$respuesta_mensaje $headers_r['eus-bizkaia-n3-mensaje-respuesta'];        

    echo 
"<TABLE align=center width=97% class=gris id='sortedtable'><thead>";
    echo 
"<tr class=odd>";
    echo 
"<th align=left><div id=tit2>Factura</div></th>";
    echo 
"<th align=left><div id=tit2>Fecha</div></th>";
    echo 
"<th align=left><div id=tit2>Error</div></th>";
    echo 
"<th align=left><div id=tit2>Descripción</div></th>";    
    echo 
"</tr></thead>";

    
$a 0;
    foreach (
$facturas_en_TBAI->Registros->Registro as $nodo
    {
    
$SerieFactura $nodo->Identificador->IDFactura->SerieFactura;    
    
$NumFactura $nodo->Identificador->IDFactura->NumFactura;            
    
$FechaExpedicionFactura $nodo->Identificador->IDFactura->FechaExpedicionFactura;
    
$EstadoRegistro $nodo->SituacionRegistro->EstadoRegistro;
    
$CodigoErrorRegistro $nodo->SituacionRegistro->CodigoErrorRegistro;
    
$DescripcionErrorRegistro $nodo->SituacionRegistro->DescripcionErrorRegistro;
    
$DescripcionErrorRegistro utf8_decode($DescripcionErrorRegistro);

    if(
$EstadoRegistro == 'Correcto' || $CodigoErrorRegistro == 'B4_2000003')
    {
    
$xml_enviado_tbai $guardado_enviar[$SerieFactura.'-'.$NumFactura];    
    
$guardado_enviar_tbai  $directorio_TBAI.$xml_enviado_tbai;
    
$guardado_enviado_tbai $directorio_TBAI_envios.$xml_enviado_tbai;        
    
rename($guardado_enviar_tbai,$guardado_enviado_tbai); /// atencion a esto        
    
}
        
    if(
$EstadoRegistro != 'Correcto')
    {    
    echo 
"<tr "; if( $a%== ) echo " class=odd";                
    echo 
"><td class=firstcol align=left><div id=tit3>&nbsp;".$SerieFactura.'-'.$NumFactura."</div></td>";
    echo 
"<td align=left><div id=tit3>&nbsp;".$FechaExpedicionFactura."</div></td>";
    echo 
"<td align=left><div id=tit3>&nbsp;".$CodigoErrorRegistro."</div></td>";
    echo 
"<td align=left><div id=tit3>&nbsp;".$DescripcionErrorRegistro."</div></td>";
    
    
$a++;
    echo 
"</tr>";
    }

    } 
// fin foreach ($facturas_en_TBAI->Registros->Registro as $nodo)     
    
echo '</table><br>';    
    }    
    
//  fin if($respuesta_tipo == 'Incorrecto' || $respuesta_tipo == 'Parcialmente correcto')

    
if($respuesta_tipo == 'Correcto')
    {    
    include_once(
$_SERVER['DOCUMENT_ROOT'].'/_configs/_header_ifx.php' );    
    foreach (
$facturas_en_TBAI->Registros->Registro as $nodo
    {
    
$SerieFactura $nodo->Identificador->IDFactura->SerieFactura;    
    
$NumFactura $nodo->Identificador->IDFactura->NumFactura;    
    
$xml_enviado_tbai $guardado_enviar[$SerieFactura.'-'.$NumFactura];    
    
$guardado_enviar_tbai  $directorio_TBAI.$xml_enviado_tbai;
    
$guardado_enviado_tbai $directorio_TBAI_envios.$xml_enviado_tbai;        
    
rename($guardado_enviar_tbai,$guardado_enviado_tbai); /// atencion a esto            
    
}
    }    
    
//  fin if($respuesta_tipo == 'Correcto')
    
unset($facturas_en_TBAI); 

Comentamos

Sistel 11-05-2021 21:22:36

Cita:

Empezado por bilbur (Mensaje 540886)
Como ya me funciona bien lo de los envíos a batuz os dejo el código
...

Hola Bilbur,

Muchas gracias, una vez más por compartir tu código.

Aún no he llegado a la fase de envío a Batuz.
Estoy aún en la fase de firma del XML.
Y me ha venido de maravilla tu código para la firma.
¡¡¡Funciona de perlas!!!
Se parece bastante al que yo estaba desarrollando (aunque estaba atrancado) basado en https://github.com/josemmo/Facturae-PHP

Hay una detallito que no entiendo de tu clase Firmador():
Código PHP:

$signTime1 date('Y-m-d\TH:i:s+01:00'); 

¿Porqué le añades 1 segundo a la hora de la firma?

Lo dicho, muchas gracias de nuevo.

Saludos

bilbur 11-05-2021 22:53:39

Cita:

Empezado por Sistel (Mensaje 540887)
Hola B...
Se parece bastante al que yo estaba desarrollando (aunque estaba atrancado) basado en https://github.com/josemmo/Facturae-PHP

Hay una detallito que no entiendo de tu clase Firmador():
Código PHP:

$signTime1 date('Y-m-d\TH:i:s+01:00'); 

¿Porqué le añades 1 segundo a la hora de la firma?...

El firmador.php no es mío, es un apaño basado en facturae de Josemmo con adaptaciones de otro firmador de Costa Rica. https://github.com/CRLibre/API_Hacienda
El de facturae es fantástico pero un poco farragoso con los xmlns y no lograba "entenderlo"

No añado 1 segundo, añado 1 hora (o 2 horas) por no se qué de la zona horaria Europa/Madrid
Seguramente se pueda quitar sin problemas.
Si necesitas alguna aclaración para la firma, sólo has de preguntar

Sistel 12-05-2021 09:41:35

Cita:

Empezado por bilbur (Mensaje 540888)
...
No añado 1 segundo, añado 1 hora (o 2 horas) por no se qué de la zona horaria Europa/Madrid
Seguramente se pueda quitar sin problemas.
...

Hola Bilbur,

Perdón, no había entendido bien la función date() que ejecutabas.
Ya veo que es por el tema de la hora UTC+1

Gracias.
Saludos

rci 12-05-2021 11:28:15

Firmar xml ticketBAI utilizando c#
 
Hola, yo también estoy intentando firmar las facturas para tickeBAI en C# y no consigo que me acepten la factura como válida.

Código:

<?xml version="1.0" encoding="utf-8"?>
      <ResultadosValidacion>
        <Codigo>008</Codigo>
        <Descripcion>El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- Reference URI="#Signature509508-SignedProperties932727" failed to verify. Reference URI="" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)</Descripcion>

Alguien ha encontrado algún ejemplo en c# para firmar para TicketBAI? No encuentro nada por internet en c#


Coincido con Noe277 en que la documentación no es suficientemente detallada para firmar los xml.



Cualquier ayuda se agradece!

Muchas gracias!




Cita:

Empezado por Noe277 (Mensaje 540839)
Estoy teniendo muchos problemas a la hora de firmar las facturas, ¿Alguien lo ha conseguido en C#?

Empecé adaptando la aplicación que ofrecen en PAe y he logrado firmar XMLs con una estructura muy similar a la que muestran en el ejemplo oficial, no obstante algunas etiquetas como "<DataObjectFormat>" parecen tener algunos campos distintos, (Podría ser un problema) pero en general creo que podría dar el pego.

El caso es que siempre recibo el siguiente error:
"org.apache.axis.types.URI$MalformedURIException: No scheme found in URI"

Lo que no es de extrañar ya que el campo donde se encuentra la URI <xades:Identifier> y los tres de la política de firma no hay donde entenderlos, en cada documento dicen unos valores distintos...

Actualmente la política la genero así:

Código:

                        <xades:SignaturePolicyIdentifier>
                            <xades:SignaturePolicyId>
                                <xades:SigPolicyId>
                                    <xades:Identifier>Politica de firma TicketBAI 1.0</xades:Identifier>
                                    <xades:Description/>
                                </xades:SigPolicyId>
                                <xades:SigPolicyHash>
                                    <ds:DigestMethod Algorithm="nopuedoponerenlaces"/>
                                    <ds:DigestValue>6NrKAm60o7u62FUQwzZew24ra2ve9PRQYwC21AM6In0=</ds:DigestValue>
                                </xades:SigPolicyHash>
                                <xades:SigPolicyQualifiers>
                                    <xades:SigPolicyQualifier>
                                        <xades:SPURI>nopuedoponerenlaces</xades:SPURI>
                                    </xades:SigPolicyQualifier>
                                </xades:SigPolicyQualifiers>
                            </xades:SignaturePolicyId>
                        </xades:SignaturePolicyIdentifier>

Algunas preguntas
¿Qué datos insertasteis?, ¿Usasteis algún algoritmo concreto?, ¿Dónde hay documentación medio clara sobre el tema?

En fin, cualquier ayuda es bien recibida, gracias de antemano.


Neftali [Germán.Estévez] 12-05-2021 12:35:29

Cita:

Empezado por rci (Mensaje 540891)
Hola, yo también estoy intentando firmar las facturas para tickeBAI en C# y no consigo que me acepten la factura como válida.

<Descripcion>El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- Reference URI="#Signature509508-SignedProperties932727" failed to verify. Reference URI="" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)</Descripcion>


En esta página hemos hablado de ese error:
https://www.clubdelphi.com/foros/sho...d.php?p=540615

Posible que esté relacionado con la codificación.
Revisa además si tienes caracteres extraños en el mensaje (en la razón social, por ejemplo) como ñáéüç...

sline 12-05-2021 13:12:14

Gracias bilbur!

todo esto me ha permitido continuar con el proceso, pero me encuentro un contratiempo con el qr.
Para generar el código QR es necesario los 13 primeros caracteres de la firma, en ocasiones la firma contiene caracteres como + y al entrar la url para batuz muestra que es incorrecta.
No encuentro nada (o al menos no lo he visto) que limite qué caracteres usar o no, o si hubiera que reemplazarlos.

Cita:

Empezado por bilbur (Mensaje 540763)
Nos hemos quedado aquí:


bilbur 12-05-2021 13:31:35

Cita:

Empezado por sline (Mensaje 540893)
Gracias bilbur!

todo esto me ha permitido continuar con el proceso, pero me encuentro un contratiempo con el qr.
Para generar el código QR es necesario los 13 primeros caracteres de la firma, en ocasiones la firma contiene caracteres como + o / y al entrar la url para batuz muestra que es incorrecta.
No encuentro nada (o al menos no lo he visto) que limite qué caracteres usar o no, o si hubiera que reemplazarlos.


te explico el código de la dirección qr para GIP


$caracterSeparador = '-' // el guión medio o tecla del menos
$cif_340 = cif de la empresa 9 dígitos
$dd$mm$aaa = dia mes año sin separador // 12052021
$SignatureValueFirmaFacturaActua = substr($SignatureValueFirmaFacturaActual,0,13); // 13 primeras posiciones
$TBAIID = utf8_encode($TBAIID); // lo codificas a utf8
$cod_crc8 = crc8($TBAIID); // calculas el crc8
$TBAIID = $TBAIID.$cod_crc8; // se lo añades a la cadena TBAIID
$msg_TBAI = $url_TBAI_QR.'?id='.$TBAIID.'&s='.serie.'&nf='.numero.'&i='.$importe; // creas el enlace TBAI
$msg_TBAI = utf8_encode($msg_TBAI); // otra vez a utf8
$cod_crc8 = crc8($msg_TBAI); // calculas el nuevo crc8
$msg_TBAI = $msg_TBAI.'&cr='.$cod_crc8; // y se lo añades al enalce

Código PHP:

   $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.$dd;
    
$TBAIID .= $mm.$aaaa.$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

Al final queda algo así:

'https://tbai.prep.gipuzkoa.eus/qr/?id=TBAI-B09203993-210421-YQw6BwvgmOe9h-235&s=FR&nf=000115&i=-5.44&cr=012'

Este enlace funciona

bilbur 12-05-2021 13:42:14

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540892)
En esta página hemos hablado de ese error:
https://www.clubdelphi.com/foros/sho...d.php?p=540615

Posible que esté relacionado con la codificación.
Revisa además si tienes caracteres extraños en el mensaje (en la razón social, por ejemplo) como ñáéüç..
.

En las direcciones que no puedes escribir es posible que tengas acentos en "Política de firma..", en direcciones URI
Elimina los acentos en el xml previo a la firma y también en el firmador que utilices

Espero que sea eso

sline 12-05-2021 13:44:23

Eso mismo es lo que hago, aquí pongo 2 ejemplos:


OK: https_//batuz.eus/QRTBAI/?id=TBAI-79732487C-120521-ME4g0D7g/iyVk-038&s=HB202105&nf=00020&i=382.67&cr=189
KO: https_//batuz.eus/QRTBAI/?id=TBAI-79732487C-120521-Kv+9Uth14cqcj-236&s=HS202105&nf=00021&i=1209.10&cr=121
Los datos de la URL son incorrectos (ERR_QR_003)

el 3er carácter de la firma es + "Kv+9Uth14cqcj" y el + en una url por GET suele ser un espacio.
parte de la firma en el xml:
....<ds:SignatureValue Id="xmldsig-118aebca-ded6-937b-16cd-782aa4431aab-sigvalue">Kv+9Uth14cqcjZzk286K7h+FLkm8W5UHukR8+GJkmRvJyKV3.....



Cita:

Empezado por bilbur (Mensaje 540894)
te explico el código de la dirección qr para GIP


sline 12-05-2021 14:09:51

Cita:

Empezado por bilbur (Mensaje 540895)
En las direcciones que no puedes escribir es posible que tengas acentos en "Política de firma..", en direcciones URI
Elimina los acentos en el xml previo a la firma y también en el firmador que utilices

Espero que sea eso


no tengo ningún carácter con tilde en el xml.

Neftali [Germán.Estévez] 12-05-2021 14:56:51

Cita:

Empezado por sline (Mensaje 540897)
no tengo ningún carácter con tilde en el xml.


Revisa entonces que en algun momento no esté cambiando la codificación o que estés realizando el envío con una codificación incorrecta.
Por ejemplo, que no estés guardando en un paso intermedio a fichero y al guardar/recuperar esté cambiando.

bilbur 12-05-2021 15:27:58

Cita:

Empezado por sline (Mensaje 540896)
Eso mismo es lo que hago, aquí pongo 2 ejemplos:


OK: https_//batuz.eus/QRTBAI/?id=TBAI-79732487C-120521-ME4g0D7g/iyVk-038&s=HB202105&nf=00020&i=382.67&cr=189
KO: https_//batuz.eus/QRTBAI/?id=TBAI-79732487C-120521-Kv+9Uth14cqcj-236&s=HS202105&nf=00021&i=1209.10&cr=121


Confirma los crc8
En este validador parace que da otros valores
https://crccalc.com/
Estaré más atontado de lo habitual
Ya me dices

sline 12-05-2021 15:29:21

Genero el xml y a continuación lo firmo como indicó bilbur, en php.
Lo que no sé es si han tenido en cuenta que el carácter + forma parte de base64
https_//es.wikipedia.org/wiki/Base64

Hay un párrafo que pone:
Cita:

Por esta razón existe un Base64 Modificado para URL, donde no se usa el carácter '=' de marcado de relleno, y los caracteres '+' y '/' del Base64 estándar son sustituidos por '-' y '_' respectivamente, de manera que ya no se necesita usar codificadores de URL. Además, no tiene impacto en el tamaño de la codificación, dejándola intacta para uso en base de datos relacionales, formularios web e identificadores de objetos en general.
https_//stackoverflow.com/questions/1228701/code-for-decoding-encoding-a-modified-base64-url
¿sería posible reemplazar los caracteres '+' y '/' por '-' y '_' de la firma y que esta siga siendo válida?



Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540898)
Revisa entonces que en algun momento no esté cambiando la codificación o que estés realizando el envío con una codificación incorrecta.
Por ejemplo, que no estés guardando en un paso intermedio a fichero y al guardar/recuperar esté cambiando.


bilbur 12-05-2021 15:41:42

Cita:

Empezado por sline (Mensaje 540900)
Genero el xml y a continuación lo firmo como indicó bilbur, en php.
Lo que no sé es si han tenido en cuenta que el carácter + forma parte de base64
https_//es.wikipedia.org/wiki/Base64

Hay un párrafo que pone:

https_//stackoverflow.com/questions/1228701/code-for-decoding-encoding-a-modified-base64-url
¿sería posible reemplazar los caracteres '+' y '/' por '-' y '_' de la firma y que esta siga siendo válida?


Ejemplo con + en firma

https://tbai.prep.gipuzkoa.eus/qr/?i...i=18.81&cr=075


Funciona

sline 12-05-2021 15:57:42

Cita:

Empezado por bilbur (Mensaje 540899)
Confirma los crc8

He probado con el código TBAI que viene de ejemplo "TBAI-00000006Y-251019-btFpwP8dcLGAF-" y da 237 como debe ser.

Por ejemplo este "TBAI-79732487C-120521-ME4g0D7g/iyVk-" me devuelve 038 pero en http_//crccalc.com me devuelve 070.
mientas que "TBAI-79732487C-120521-Kv+9Uth14cqcj-" devuelve 236 y es el esperado

Otro ejemplo mas sencillo:
"hola/-" la función para crc8 devuelve 035 mientras que en http_//crccalc.com devuelve 014

Uso esta función para crc8:
https_//www_clubdelphi_com/~hector/foros/showthread.php?p=534948&highlight=crc8#post534948

¿es posible que esta función tenga problemas con "/" ?

bilbur 12-05-2021 16:19:55

Cita:

Empezado por sline (Mensaje 540902)
He probado con el código TBAI que viene de ejemplo "TBAI-00000006Y-251019-btFpwP8dcLGAF-" y da 237 como debe ser.

Por ejemplo este "TBAI-79732487C-120521-ME4g0D7g/iyVk-" me devuelve 038 pero en http_//crccalc.com me devuelve 070.
mientas que "TBAI-79732487C-120521-Kv+9Uth14cqcj-" devuelve 236 y es el esperado

Otro ejemplo mas sencillo:
"hola/-" la función para crc8 devuelve 035 mientras que en http_//crccalc.com devuelve 014

Uso esta función para crc8:
https_//www_clubdelphi_com/~hector/foros/showthread.php?p=534948&highlight=crc8#post534948

¿es posible que esta función tenga problemas con "/" ?

La función está bien
Falla el validador


No obstante prueba este código TBAI con barra, tanto en función como en este validador que parece mejor que el otro
https://toolslick.com/programming/ha...crc-calculator

TBAI-B09203993-200421-aZqWxK/x6JS3U- crc8 = 042

sline 12-05-2021 16:30:19

Cita:

Empezado por bilbur (Mensaje 540903)
La función está bien
Falla el validador

No obstante prueba este código TBAI con barra, tanto en función como en este validador que parece mejor que el otro
http_://toolslick.com/programming/hashing/crc-calculator

TBAI-B09203993-200421-aZqWxK/x6JS3U- crc8 = 042

Todo parece estar en orden, me devuelve: TBAI-B09203993-200421-aZqWxK/x6JS3U-042
¿entonces es cosa de batuz?


La franja horaria es GMT +2. Ahora son las 01:44:22.

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