Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #581  
Antiguo 11-05-2021
joselugrk joselugrk is offline
Miembro
 
Registrado: abr 2021
Posts: 28
Poder: 0
joselugrk Va por buen camino
Ayuda Chilkat - Error Envío Fichero

Cita:
Empezado por Sistel Ver Mensaje
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
Responder Con Cita
  #582  
Antiguo 11-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
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
Responder Con Cita
  #583  
Antiguo 11-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
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
Responder Con Cita
  #584  
Antiguo 11-05-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 372
Poder: 5
Sistel Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
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
Responder Con Cita
  #585  
Antiguo 11-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
Cita:
Empezado por Sistel Ver Mensaje
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
Responder Con Cita
  #586  
Antiguo 12-05-2021
Sistel Sistel is offline
Miembro
 
Registrado: nov 2019
Ubicación: Bilbao
Posts: 372
Poder: 5
Sistel Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
...
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
Responder Con Cita
  #587  
Antiguo 12-05-2021
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 143
Poder: 4
rci Va por buen camino
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 Ver Mensaje
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.
Responder Con Cita
  #588  
Antiguo 12-05-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
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 rci Ver Mensaje
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 ñáéüç...
__________________
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
  #589  
Antiguo 12-05-2021
sline sline is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
sline Va por buen camino
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 Ver Mensaje
Nos hemos quedado aquí:
Responder Con Cita
  #590  
Antiguo 12-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
Cita:
Empezado por sline Ver Mensaje
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
Responder Con Cita
  #591  
Antiguo 12-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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
Responder Con Cita
  #592  
Antiguo 12-05-2021
sline sline is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
sline Va por buen camino
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 Ver Mensaje
te explico el código de la dirección qr para GIP
Responder Con Cita
  #593  
Antiguo 12-05-2021
sline sline is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
sline Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
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.
Responder Con Cita
  #594  
Antiguo 12-05-2021
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
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 sline Ver Mensaje
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.
__________________
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
  #595  
Antiguo 12-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
Cita:
Empezado por sline Ver Mensaje
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
Responder Con Cita
  #596  
Antiguo 12-05-2021
sline sline is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
sline Va por buen camino
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] Ver Mensaje
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.
Responder Con Cita
  #597  
Antiguo 12-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
Cita:
Empezado por sline Ver Mensaje
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
Responder Con Cita
  #598  
Antiguo 12-05-2021
sline sline is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
sline Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
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 "/" ?
Responder Con Cita
  #599  
Antiguo 12-05-2021
bilbur bilbur is offline
Miembro
 
Registrado: dic 2019
Posts: 60
Poder: 5
bilbur Va por buen camino
Cita:
Empezado por sline Ver Mensaje
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
Responder Con Cita
  #600  
Antiguo 12-05-2021
sline sline is offline
Miembro
 
Registrado: may 2021
Posts: 18
Poder: 0
sline Va por buen camino
Cita:
Empezado por bilbur Ver Mensaje
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?
Responder Con Cita
Respuesta



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 3557 Hace 20 Horas 17:42:47
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 14:04:37.


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