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

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2021
Ramon88 Ramon88 is offline
Miembro
 
Registrado: ago 2021
Posts: 143
Poder: 4
Ramon88 Va por buen camino
Esto me dicen:
Código:
  Egun on, Buenos días
  
  Para cuando se producen rechazos por parte del servicio de recepción de TicketBAI se va a disponer de un servicio para subsanar el envío siguiendo los siguientes pasos:
  
  • Corregir el problema que ha producido el rechazo
  • Enviar el nuevo XML corregido SIN FIRMAR al servicio de subsanación de TicketBAI “Zuzendu”
El rechazo de ficheros ha de ser algo muy excepcional ya que las validaciones que lo provocan son mínimas y muy básicas. Las facturas rechazadas y posteriormente subsanadas se registran en la BD con una marca especial para su posterior análisis. Siempre recomendamos a las empresas de desarrollo que antes de proceder a realizar el envío a TicketBAI el propio software haga unas comprobaciones mínimas en el XML para garantizar que no se producirá rechazo del mismo:
  • Validar el XML frente al esquema XSD. Esta validación evitará la mayor parte de los problemas de rechazo
  • Asegurarse de que se informan los datos básicos: número de factura, fecha de expedición, indicar una línea de detalle como mínimo e indicar factura rectificada en rectificativa.
  • Comprobar que el certificado de envío es válido y su identidad está relacionada con el emisor.
Por lo que si la factura rechazada es correcta, únicamente habría que corregir el fichero XML a través de servicio “Zuzendu”. En el caso de que la factura no fuese correcta con un error material en la misma, el procedimiento para dicho caso está todavía por publicar.
Responder Con Cita
  #2  
Antiguo 22-10-2021
Avatar de thinkows
thinkows thinkows is offline
Miembro
 
Registrado: mar 2020
Ubicación: Sabadell
Posts: 99
Poder: 6
thinkows Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:
Código:
  Egun on, Buenos días
  
  Para cuando se producen rechazos por parte del servicio de recepción de TicketBAI se va a disponer de un servicio para subsanar el envío siguiendo los siguientes pasos:
  
  • Corregir el problema que ha producido el rechazo
  • Enviar el nuevo XML corregido SIN FIRMAR al servicio de subsanación de TicketBAI “Zuzendu”
El rechazo de ficheros ha de ser algo muy excepcional ya que las validaciones que lo provocan son mínimas y muy básicas. Las facturas rechazadas y posteriormente subsanadas se registran en la BD con una marca especial para su posterior análisis. Siempre recomendamos a las empresas de desarrollo que antes de proceder a realizar el envío a TicketBAI el propio software haga unas comprobaciones mínimas en el XML para garantizar que no se producirá rechazo del mismo:
  • Validar el XML frente al esquema XSD. Esta validación evitará la mayor parte de los problemas de rechazo
  • Asegurarse de que se informan los datos básicos: número de factura, fecha de expedición, indicar una línea de detalle como mínimo e indicar factura rectificada en rectificativa.
  • Comprobar que el certificado de envío es válido y su identidad está relacionada con el emisor.
Por lo que si la factura rechazada es correcta, únicamente habría que corregir el fichero XML a través de servicio “Zuzendu”. En el caso de que la factura no fuese correcta con un error material en la misma, el procedimiento para dicho caso está todavía por publicar.
O sea, si lo he entendido bien, aparate del Zuzendu está por publicar otro procedimiento ?

"En el caso de que la factura no fuese correcta con un error material en la misma, el procedimiento para dicho caso está todavía por publicar."

De ahí el aplazamiento .... nos vamos a extinguir pronto
Responder Con Cita
  #3  
Antiguo 22-10-2021
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
Question Factura simplificada cualificada y destinatario no nacional => TipoDesglose?

Hola, si tenemos una factura simplificada cualificada (con los datos del destinatario) y el destinatario no es nacional, como informais el desglose? a nivel de operación o de factura?

Yo pienso que el desglose tiene que ser a nivel de operación porque el destinatario no es nacional, si lo hago de esta forma Araba y Gipuzkoa lo aceptan sin errores pero Bizkaia da el siguiente error:
B4_2000027
TipoDesglose: La factura contiene un Tipo de desglose incorrecto. Ha de ser a nivel de operación cuando sea una factura completa y el destinatario sea extranjero (IDOtro o NIF que empiece por N). En cualquier otro caso, el desglose ha de ser a nivel de factura.

Parece ser que hay alguna incompatibilidad entre factura simplificada y desglose por tipo de operación para Batuz.

Envié un correo a las tres agencias preguntando y de Araba me contestaron:
Cita:
En una factura de ese tipo (que viene regulada en el artículo 7.2 y 7.3 del Reglamento de Facturación), si el destinatario es no nacional se deberán utilizar los tipos de identificación establecidos en el Anexo I

El desglose será a nivel de operación, puesto que está así designado para cuando el destinatario es un “no nacional”. No hay incompatibilidad alguna por el hecho de ser simplificada.
De Bizkaia me contestaron:
Cita:
Si la factura es simplificada, no se permite el desglose por operación, aunque se identifique un destinario extranjero con un identificador diferente al NIF.
De Gipuzkoa no me han contestado y pregunté hace un mes... Deben estar muy ocupados


En fin, ¿tengo que hacer otra particularidad dependiendo de la diputación foral?


Muchas gracias


Saludos
Responder Con Cita
  #4  
Antiguo 22-10-2021
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
Arrow QR -> URL encoding y CRC

Hola, he estado haciendo pruebas al generar la ruta para el QR y al final creo que Araba funciona de una forma y Bizkaia y Gipuzkoa de otra.


Estaba haciendo pruebas de QR para Araba y en un caso me contestó lo de "parámetros incorrectos". El identificador TBAI de esa factura tiene una barra /
En mi proceso para generar el QR hacia URL encoding de los valores para construir la URL y después generaba el CRC.

Para Bizkaia y Gipuzkoa esto es correcto y funciona. Pero para Araba no, pregunté y me contestaron que el CRC lo tengo que calcular antes del URL encoding.
Si lo hago de esta forma ya funciona pero claro... preferiria hacerlo siempre igual


Probando probando también vi que si no hago URL encoding en ningún momento, y no sustituyo la barra por %2F también funciona y funciona haciendo lo mismo para las tres diputaciones, lo cual me gusta, pero claro, en la documentación dice que tenemos que hacer el encoding y supongo que habrá algún otro carácter que no sea aceptado en una URL y falle si no lo recodifico.


Volví a preguntar a Araba y me contestaron:


Cita:
Para la generación del CRC hay que tener en cuenta la “/” pero eso no tiene que ver con la URL para poder acceder a la consulta de QR. La URL como indicáis os funcionará de ambas maneras siempre y cuando el CRC se haya generado antes del URL encoding.
Vosotros estais filtrando los valores que pasamos como parámetros en la URL del QR o no? Antes y después de generar el QR dependiendo de la diputación?



Muchas gracias y disculpad por tantas preguntas


Saludos
Responder Con Cita
  #5  
Antiguo 25-10-2021
hago_preguntas hago_preguntas is offline
Registrado
 
Registrado: oct 2021
Posts: 8
Poder: 0
hago_preguntas Va por buen camino
Cita:
Empezado por rci Ver Mensaje
Hola, he estado haciendo pruebas al generar la ruta para el QR y al final creo que Araba funciona de una forma y Bizkaia y Gipuzkoa de otra.


Estaba haciendo pruebas de QR para Araba y en un caso me contestó lo de "parámetros incorrectos". El identificador TBAI de esa factura tiene una barra /
En mi proceso para generar el QR hacia URL encoding de los valores para construir la URL y después generaba el CRC.

Para Bizkaia y Gipuzkoa esto es correcto y funciona. Pero para Araba no, pregunté y me contestaron que el CRC lo tengo que calcular antes del URL encoding.
Si lo hago de esta forma ya funciona pero claro... preferiria hacerlo siempre igual


Probando probando también vi que si no hago URL encoding en ningún momento, y no sustituyo la barra por %2F también funciona y funciona haciendo lo mismo para las tres diputaciones, lo cual me gusta, pero claro, en la documentación dice que tenemos que hacer el encoding y supongo que habrá algún otro carácter que no sea aceptado en una URL y falle si no lo recodifico.


Volví a preguntar a Araba y me contestaron:


Vosotros estais filtrando los valores que pasamos como parámetros en la URL del QR o no? Antes y después de generar el QR dependiendo de la diputación?



Muchas gracias y disculpad por tantas preguntas


Saludos
Nos ha pasado con Álava y Guipúzcoa que son las que estamos probando.

Nosotros codificamos los parámetros de la consulta que va en la URL antes de codificar el QR, sin mirar la diputación, que es lo que señala la especificación, pero, como dices, Álava no sigue su especificación, la cual indica que hay que calcular el crc sobre el contenido del QR, y en dicho contenido los parámetros de la consulta de la URL deben estar codificados (URL encondig, que también señalan en su especificación), y por lo tanto la /, el +, los espacios, etc... se sustituyen por sus códigos hexadecimales precedidos del %, para que la URL sea correcta y se pueda navegar a la misma (otra cosa es que muchos navegadores analicen las URLs y las codifiquen y reescriban correctamente antes de hacer la petición).

Lo suyo sería que siguieran sus especificaciones, pero sino lo hacen (deberían de cambiar las especificaciones), tocará calcular sólo la parte del crc de manera distinta en función de la administración que es el parámetro que parece que falla (¡¡¡y eso que es sólo una comunidad con 3 provincias, el día que salte a nivel nacional algo parecido, va a ser un caos!!!).
Responder Con Cita
  #6  
Antiguo 27-10-2021
hago_preguntas hago_preguntas is offline
Registrado
 
Registrado: oct 2021
Posts: 8
Poder: 0
hago_preguntas Va por buen camino
Cita:
Empezado por rci Ver Mensaje
Hola, he estado haciendo pruebas al generar la ruta para el QR y al final creo que Araba funciona de una forma y Bizkaia y Gipuzkoa de otra.


Estaba haciendo pruebas de QR para Araba y en un caso me contestó lo de "parámetros incorrectos". El identificador TBAI de esa factura tiene una barra /
En mi proceso para generar el QR hacia URL encoding de los valores para construir la URL y después generaba el CRC.

Para Bizkaia y Gipuzkoa esto es correcto y funciona. Pero para Araba no, pregunté y me contestaron que el CRC lo tengo que calcular antes del URL encoding.
Si lo hago de esta forma ya funciona pero claro... preferiria hacerlo siempre igual


Probando probando también vi que si no hago URL encoding en ningún momento, y no sustituyo la barra por %2F también funciona y funciona haciendo lo mismo para las tres diputaciones, lo cual me gusta, pero claro, en la documentación dice que tenemos que hacer el encoding y supongo que habrá algún otro carácter que no sea aceptado en una URL y falle si no lo recodifico.


Volví a preguntar a Araba y me contestaron:


Vosotros estais filtrando los valores que pasamos como parámetros en la URL del QR o no? Antes y después de generar el QR dependiendo de la diputación?



Muchas gracias y disculpad por tantas preguntas


Saludos
Ya debería de funcionar como el resto de administraciones, escribimos a Álava para preguntar por la inconsistencia con respecto a las especificaciones, y nos respondieron esto:

Cita:
Hemos implantado una nueva versión en la cual no deberíais tener problemas para realizar dicha consulta.



¿Lo podéis probar?



Un saludo y disculpen las molestias.
Lo probamos con varias que no funcionaban, y ya funcionan como indica la especificación.
Responder Con Cita
  #7  
Antiguo 28-10-2021
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
QR Araba ya funciona igual que las otras

Cita:
Empezado por hago_preguntas Ver Mensaje
Ya debería de funcionar como el resto de administraciones, escribimos a Álava para preguntar por la inconsistencia con respecto a las especificaciones, y nos respondieron esto:



Lo probamos con varias que no funcionaban, y ya funcionan como indica la especificación.



Hola hago_preguntas, acabo de probar el ejemplo que tenia controlado y es cierto, funciona de las dos forma, igual que las otras diputaciones forales y también con su propio sistema.

Muchas gracias
Responder Con Cita
  #8  
Antiguo 22-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:
Código:
  
  
  El rechazo de ficheros ha de ser algo muy excepcional ya que las validaciones que lo provocan son mínimas y muy básicas. Las facturas rechazadas y posteriormente subsanadas se registran en la BD con una marca especial para su posterior análisis.

Muy excepcional, eso quisieran y quisieramos.

Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:
Código:
  • Validar el XML frente al esquema XSD. Esta validación evitará la mayor parte de los problemas de rechazo
Eso es una putada de hilera de grabación.

Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:

Código:
Asegurarse de que se informan los datos      básicos: número de factura, fecha de expedición, indicar una línea de      detalle como mínimo e indicar factura rectificada en rectificativa.

En ello estamos cuando programamos,


Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:

Código:
  • Comprobar que el certificado de envío es válido y su identidad está relacionada con el emisor.

Esto menos mal que me lo he hecho.



Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:

Código:
 Por lo que si la factura rechazada es correcta, únicamente habría que corregir el fichero XML a través de servicio “Zuzendu”.
Únicamente creo que no es la palabra correcta, eso se usa para cuando hay que hacer algo rápido y sencillo.



Cita:
Empezado por Ramon88 Ver Mensaje
Esto me dicen:
Código:
  
En el caso de que la factura no fuese correcta con un error material en la misma, el procedimiento para dicho caso está todavía por publicar.
Ah, sin prisa, estaremos pendientes, no tenemos nada que hacer
Responder Con Cita
  #9  
Antiguo 22-10-2021
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
Acceder a los datos del certificado del emisor

Buenas tardes, estamos intentando hacer las máximas validaciones previas posibles antes de generar la factura y habíamos pensado en comparar los datos del certificado digital con los datos que proporciona el usuario sobre el obligado tributario. Así comprobar que los datos del emisor de la factura coinciden con el certificado digital que utilizamos tanto para firmar como para enviar. Básicamente comprobar que el NIF y la razón social coinciden.
Pero los datos que hay dentro del certificado no los estamos obteniendo de forma clara... no vemos un campo donde haya el NIF y otro con la razón social... hay varias propiedades de texto con múltiples datos dentro...
A parte es diferente para cada certificado, si es de persona física, si es de representante ....


¿Vosotros hacéis esta comprobación?
¿Alguien sabe cómo obtener el NIF y la razón social de forma clara de dentro de un certificado?

Utilizamos C#, ya tenemos el certificado en un objeto de tipo X509Certificate2

Muchas gracias y buen fin de semana!
Responder Con Cita
  #10  
Antiguo 22-10-2021
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 175
Poder: 6
unomasmas Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje

Comprobar que el certificado de envío es válido y su identidad está relacionada con el emisor.
Esto menos mal que me lo he hecho.
¿Cómo lo has hecho? ¿Podemos tener los pasos que has dado (o directamente el código)? Gracias

Última edición por unomasmas fecha: 22-10-2021 a las 19:26:58. Razón: Edición por error tipográfico
Responder Con Cita
  #11  
Antiguo 23-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Cita:
Empezado por unomasmas Ver Mensaje
¿Cómo lo has hecho? ¿Podemos tener los pasos que has dado (o directamente el código)? Gracias
OK. me ha costado varios días crear un php que te devuelva todos los datos del certificado, incluso me devuelve el email de quien lo solicitó( siempre que se haya introducido ese dato al solicitarlo), con lo cual automatiza que envíe un email para advertir de la proximidad de la caducidad a ese Email u a otro. después te paso el php.
Responder Con Cita
  #12  
Antiguo 23-10-2021
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 175
Poder: 6
unomasmas Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
OK. me ha costado varios días crear un php que te devuelva todos los datos del certificado, incluso me devuelve el email de quien lo solicitó( siempre que se haya introducido ese dato al solicitarlo), con lo cual automatiza que envíe un email para advertir de la proximidad de la caducidad a ese Email u a otro. después te paso el php.
Gracias :-)
Estoy pensando (sin ver tu código, claro) que... ¿No hay problemas si seleccionan un certificado de dispositivo? Me parece imposible poder comprobar con quién está asociado ese dispositivo.
Responder Con Cita
  #13  
Antiguo 23-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Cita:
Empezado por unomasmas Ver Mensaje
Gracias :-)
Estoy pensando (sin ver tu código, claro) que... ¿No hay problemas si seleccionan un certificado de dispositivo? Me parece imposible poder comprobar con quién está asociado ese dispositivo.
Supongo que tendrás que comprobar el numero de serie que contenga en vez del NIF
Responder Con Cita
  #14  
Antiguo 23-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Cita:
Empezado por unomasmas Ver Mensaje
¿Cómo lo has hecho? ¿Podemos tener los pasos que has dado (o directamente el código)? Gracias

Supongo que ya todos estais teniendo en cuenta donde estais dejando los php, firmador, anulador,,,
Por si acaso, os advierto que seais cuidadosos pueden sacar las claves facilmente, no lo tengais en servidores públicos, lo lógico es que esté en redes privadas.

Aquí os dejo un ejemplo Curl para llamar al php
Código:
curl.exe --connect-timeout 1  http://xxxx/Caducidad.php?fichero==[NombreCertificado.xxx]=[Clave]=  --data-binary @[path completo donde esta alojado el certificado..xxx]  -o [path donde quereis los datoscertificado ejemplo c:\certs\datos_certificado.txt]
Respetad todos los signos igual que los uso para separar los campos, ya que no he encontrado otra forma de mandarlos(que seguro que la hay)
Intentad que las claves de certificado no contengan signos "=","+",",",solo letras numeros guiones bajos y medios y cualquier signo que no necesite traducirlo a codigo uri(podeis investigar un poco mas si quereis para mandar mas signos, yo me he plantado aqui)


En el php, no solo compruebo el certificado si no que lo dejo alojado en el servidor y machaco el que hubiera, esto es muy bueno para actualizar certificados.
Aquí teneis el Caducidad.php

Código PHP:
<?php 
$p 
file_get_contents('php://input'); // $p stands for params
$datos $_GET['fichero'];
$varias=explode("=",$datos);
$xml=file_get_contents("php://input");
$Clave=$varias[2];
$dir_cert =($_SERVER['DOCUMENT_ROOT'].'/certs');
if (!
file_exists($dir_cert)) {
    
mkdir($dir_cert0700true);
}

$dir_cert $dir_cert.'/'.$varias[1] ;
file_put_contents($dir_cert$p);

    
$fac = new Comprobador();
    
$CompruebaF $fac -> comprobar($dir_cert,$Clave);
    exit;

?>

<?php 
class Comprobador{
    public function 
comprobar($certificadop12$clavecertificado)
    {
    if (!
$pfx file_get_contents($certificadop12))
    {
        echo 
"Error: No se puede leer el fichero del certificado o no existe en la ruta especificada";
       exit;
    }
    if (
openssl_pkcs12_read($pfx$key$clavecertificado))
    {
    
$this->publicKey    $key["cert"];
    
$this->privateKey   $key["pkey"];
    }
    else
    {
        echo 
"Error: No se puede leer el almacén de certificados o la clave no es la correcta.";
           exit;
    }
    
$Comprueba1                       $this->insertaComprobacion();
    return 
$Comprueba1;
    }
    public function 
insertaComprobacion(){
        
$certData   openssl_x509_parse($this->publicKey);
$validFromd1 date('d-m-Y H:i:s'$certData['validFrom_time_t']);
                
$validFromd date('d-m-Y'$certData['validFrom_time_t']);
        
$validFromh date('H:i:s'$certData['validFrom_time_t']);
$validTod1 date('d-m-Y H:i:s'$certData['validTo_time_t']);
                
$validTod date('d-m-Y'$certData['validTo_time_t']);
        
$validToh date('H:i:s'$certData['validTo_time_t']);
    
    echo 
"<FechaDesde>".$validFromd."</FechaDesde>";
    echo 
"\r\n<HoraDesde>".$validFromh."</HoraDesde>";
    echo 
"\r\n<FechaHasta>".$validTod."</FechaHasta>";
    echo 
"\r\n<HoraHasta>".$validToh."</HoraHasta>";
        if (!empty(
$certData['name'])){
        echo 
"\r\n<Nombre>".$certData['name']."</Nombre>";
        }
    if (!empty(
$certData['hash'])){
    
    echo 
"\r\n<Hash>".$certData ['hash']."</Hash>";
    }
    if (!empty(
$certData['C'])){
        
        echo 
"\r\n<Pais>".$certData['C']."</Pais>";
       }
    if (!empty(
$certData['subject']['ST'])){
        
        echo 
"\r\n<Estado>".$certData['subject']['ST']."</Estado>"
       }
    if (!empty(
$certData['subject']['L'])){
        
           echo 
"\r\n<Municipio>".$certData['subject']['L']."</Municipio>";
    }       
    if (!empty(
$certData['subject']['CN'])){
        
        echo 
"\r\n<RazonSocial>".$certData['subject']['CN']."</RazonSocial>";
    } 
    if (!empty(
$certData['extensions']['subjectAltName'])){

        
$variosemails=explode(",",$certData['extensions']['subjectAltName']);
          if (!empty(
$variosemails[0])){
            
$vemails=explode(":",$variosemails[0]);
              if (!empty(
$vemails[1])){
            
                echo 
"\r\n<Email>".$vemails[1]."</Email>";   
             }                
            else
            {
                 echo 
"\r\n<EmailSinFormateo>".$vemails."</EmailSinFormateo>";
        
            }
        if (!empty(
$variosemails[1])){

        echo 
"\r\n<SubjectEmail1>".$variosemails[1]."</SubjectEmail1>";   
        }
        if (!empty(
$variosemails[2])){

        echo 
"\r\n<SubjectEmail2>".$variosemails[2]."</SubjectEmail2>";   
        }

        if (!empty(
$variosemails[3])){

        echo 
"\r\n<SubjectEmail3>".$variosemails[3]."</SubjectEmail3>";   
        }
        if (!empty(
$variosemails[4])){

        echo 
"\r\n<SubjectEmail4>".$variosemails[4]."</SubjectEmail4>";   
        }
        if (!empty(
$variosemails[5])){

        echo 
"\r\n<SubjectEmail5>".$variosemails[5]."</SubjectEmail5>";   
        }
        if (!empty(
$variosemails[6])){

        echo 
"\r\n<SubjectEmail6>".$variosemails[6]."</SubjectEmail6>";   
        }
        }
    }       
    if (!empty(
$certData['extensions']['authorityKeyIdentifier'])){
    
        echo 
"\r\n<KeyAutorizacion>".$certData['extensions']['authorityKeyIdentifier']."</KeyAutorizacion>"
    }      
    if (!empty(
$certData['issuer']['OU'])){
        echo 
"\r\n<Emisor>".$certData['issuer']['OU']."</Emisor>"
    }       
    echo 
"\r\n<ClavePublica>"$this->publicKey ."</ClavePublica>"

    echo 
"\r\n<ClavePrivada>".$this->privateKey."</ClavePrivada>"


    echo 
"\r\n";
    echo 
"\r\n// --- Datos con nombres de campos Originales ---";
    
    echo 
"\r\n<validFrom_time_t>".$validFromd1."</validFrom_time_t>";
    echo 
"\r\n<validTo_time_t>".$validTod1."</validTo_time_t>";
    if (isset(
$certData['subject'])){
        
        foreach (
$certData['subject'] as $item=>$value)
            {
                   echo 
"\r\n<".$item.">"$value."</".$item ">";
            }
        }
        if (isset(
$certData['extensions'])){
         foreach (
$certData['extensions'] as $item=>$value)
            {
                   echo 
"\r\n<".$item.">"$value."</".$item ">";
            }
        }
    
$Comprueba='';
    return 
$Comprueba;
    } 
}
?>
Responder Con Cita
  #15  
Antiguo 25-10-2021
unomasmas unomasmas is offline
Miembro
 
Registrado: dic 2019
Posts: 175
Poder: 6
unomasmas Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Supongo que ya todos estais teniendo en cuenta donde estais dejando los php, firmador, anulador,,,
Por si acaso, os advierto que seais cuidadosos pueden sacar las claves facilmente, no lo tengais en servidores públicos, lo lógico es que esté en redes privadas.

Aquí os dejo un ejemplo Curl para llamar al php
Código:
curl.exe --connect-timeout 1  http://xxxx/Caducidad.php?fichero==[NombreCertificado.xxx]=[Clave]=  --data-binary @[path completo donde esta alojado el certificado..xxx]  -o [path donde quereis los datoscertificado ejemplo c:\certs\datos_certificado.txt]
Respetad todos los signos igual que los uso para separar los campos, ya que no he encontrado otra forma de mandarlos(que seguro que la hay)
Intentad que las claves de certificado no contengan signos "=","+",",",solo letras numeros guiones bajos y medios y cualquier signo que no necesite traducirlo a codigo uri(podeis investigar un poco mas si quereis para mandar mas signos, yo me he plantado aqui)


En el php, no solo compruebo el certificado si no que lo dejo alojado en el servidor y machaco el que hubiera, esto es muy bueno para actualizar certificados.
Aquí teneis el Caducidad.php

Código PHP:
<?php 
$p 
file_get_contents('php://input'); // $p stands for params
$datos $_GET['fichero'];
$varias=explode("=",$datos);
$xml=file_get_contents("php://input");
$Clave=$varias[2];
$dir_cert =($_SERVER['DOCUMENT_ROOT'].'/certs');
if (!
file_exists($dir_cert)) {
    
mkdir($dir_cert0700true);
}

$dir_cert $dir_cert.'/'.$varias[1] ;
file_put_contents($dir_cert$p);

    
$fac = new Comprobador();
    
$CompruebaF $fac -> comprobar($dir_cert,$Clave);
    exit;

?>

<?php 
class Comprobador{
    public function 
comprobar($certificadop12$clavecertificado)
    {
    if (!
$pfx file_get_contents($certificadop12))
    {
        echo 
"Error: No se puede leer el fichero del certificado o no existe en la ruta especificada";
       exit;
    }
    if (
openssl_pkcs12_read($pfx$key$clavecertificado))
    {
    
$this->publicKey    $key["cert"];
    
$this->privateKey   $key["pkey"];
    }
    else
    {
        echo 
"Error: No se puede leer el almacén de certificados o la clave no es la correcta.";
           exit;
    }
    
$Comprueba1                       $this->insertaComprobacion();
    return 
$Comprueba1;
    }
    public function 
insertaComprobacion(){
        
$certData   openssl_x509_parse($this->publicKey);
$validFromd1 date('d-m-Y H:i:s'$certData['validFrom_time_t']);
                
$validFromd date('d-m-Y'$certData['validFrom_time_t']);
        
$validFromh date('H:i:s'$certData['validFrom_time_t']);
$validTod1 date('d-m-Y H:i:s'$certData['validTo_time_t']);
                
$validTod date('d-m-Y'$certData['validTo_time_t']);
        
$validToh date('H:i:s'$certData['validTo_time_t']);
    
    echo 
"<FechaDesde>".$validFromd."</FechaDesde>";
    echo 
"\r\n<HoraDesde>".$validFromh."</HoraDesde>";
    echo 
"\r\n<FechaHasta>".$validTod."</FechaHasta>";
    echo 
"\r\n<HoraHasta>".$validToh."</HoraHasta>";
        if (!empty(
$certData['name'])){
        echo 
"\r\n<Nombre>".$certData['name']."</Nombre>";
        }
    if (!empty(
$certData['hash'])){
    
    echo 
"\r\n<Hash>".$certData ['hash']."</Hash>";
    }
    if (!empty(
$certData['C'])){
        
        echo 
"\r\n<Pais>".$certData['C']."</Pais>";
       }
    if (!empty(
$certData['subject']['ST'])){
        
        echo 
"\r\n<Estado>".$certData['subject']['ST']."</Estado>"
       }
    if (!empty(
$certData['subject']['L'])){
        
           echo 
"\r\n<Municipio>".$certData['subject']['L']."</Municipio>";
    }       
    if (!empty(
$certData['subject']['CN'])){
        
        echo 
"\r\n<RazonSocial>".$certData['subject']['CN']."</RazonSocial>";
    } 
    if (!empty(
$certData['extensions']['subjectAltName'])){

        
$variosemails=explode(",",$certData['extensions']['subjectAltName']);
          if (!empty(
$variosemails[0])){
            
$vemails=explode(":",$variosemails[0]);
              if (!empty(
$vemails[1])){
            
                echo 
"\r\n<Email>".$vemails[1]."</Email>";   
             }                
            else
            {
                 echo 
"\r\n<EmailSinFormateo>".$vemails."</EmailSinFormateo>";
        
            }
        if (!empty(
$variosemails[1])){

        echo 
"\r\n<SubjectEmail1>".$variosemails[1]."</SubjectEmail1>";   
        }
        if (!empty(
$variosemails[2])){

        echo 
"\r\n<SubjectEmail2>".$variosemails[2]."</SubjectEmail2>";   
        }

        if (!empty(
$variosemails[3])){

        echo 
"\r\n<SubjectEmail3>".$variosemails[3]."</SubjectEmail3>";   
        }
        if (!empty(
$variosemails[4])){

        echo 
"\r\n<SubjectEmail4>".$variosemails[4]."</SubjectEmail4>";   
        }
        if (!empty(
$variosemails[5])){

        echo 
"\r\n<SubjectEmail5>".$variosemails[5]."</SubjectEmail5>";   
        }
        if (!empty(
$variosemails[6])){

        echo 
"\r\n<SubjectEmail6>".$variosemails[6]."</SubjectEmail6>";   
        }
        }
    }       
    if (!empty(
$certData['extensions']['authorityKeyIdentifier'])){
    
        echo 
"\r\n<KeyAutorizacion>".$certData['extensions']['authorityKeyIdentifier']."</KeyAutorizacion>"
    }      
    if (!empty(
$certData['issuer']['OU'])){
        echo 
"\r\n<Emisor>".$certData['issuer']['OU']."</Emisor>"
    }       
    echo 
"\r\n<ClavePublica>"$this->publicKey ."</ClavePublica>"

    echo 
"\r\n<ClavePrivada>".$this->privateKey."</ClavePrivada>"


    echo 
"\r\n";
    echo 
"\r\n// --- Datos con nombres de campos Originales ---";
    
    echo 
"\r\n<validFrom_time_t>".$validFromd1."</validFrom_time_t>";
    echo 
"\r\n<validTo_time_t>".$validTod1."</validTo_time_t>";
    if (isset(
$certData['subject'])){
        
        foreach (
$certData['subject'] as $item=>$value)
            {
                   echo 
"\r\n<".$item.">"$value."</".$item ">";
            }
        }
        if (isset(
$certData['extensions'])){
         foreach (
$certData['extensions'] as $item=>$value)
            {
                   echo 
"\r\n<".$item.">"$value."</".$item ">";
            }
        }
    
$Comprueba='';
    return 
$Comprueba;
    } 
}
?>
ermendalenda, muchas gracias por tu aportación. Parece que lo usas para dar información al usuario del certificado...

Finalmente en mi desarrollo voy a usar el método Verify de la clase X509Certificate2 (espacio de nombres System.Security.Cryptography.X509Certificates: https://docs.microsoft.com/es-es/dot...y?view=net-5.0). Resulta bastante simple con esto. Hace una verificación básica pero te dice si el certificado está caducado o si ha sido revocado y algunas cosas más, que yo creo que es lo más a lo que podemos aspirar a saber. Y lo mejor de todo: Es muy simple, sólo hay que llamar al método pasándole como parámetro el certificado

Código:
public bool IsValid(X509Certificate2 x509)
{
    return x509.Verify();
}
Responder Con Cita
  #16  
Antiguo 25-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Cita:
Empezado por unomasmas Ver Mensaje
ermendalenda, muchas gracias por tu aportación. Parece que lo usas para dar información al usuario del certificado...

Finalmente en mi desarrollo voy a usar el método Verify de la clase X509Certificate2 (espacio de nombres System.Security.Cryptography.X509Certificates: https://docs.microsoft.com/es-es/dot...y?view=net-5.0). Resulta bastante simple con esto. Hace una verificación básica pero te dice si el certificado está caducado o si ha sido revocado y algunas cosas más, que yo creo que es lo más a lo que podemos aspirar a saber. Y lo mejor de todo: Es muy simple, sólo hay que llamar al método pasándole como parámetro el certificado

Código:
public bool IsValid(X509Certificate2 x509)
{
    return x509.Verify();
}
Hola. Lo uso para scar la fecha de caducidad para saber si ha caducadoy el nif./cif y comprobarlo con loa datos de facturación. Y para enviar un email al que solicitó el certificado cuando esté cerca la fecha de caducidad
Lo de comprobar revocados no lo había pensado. Pero lo miro tb. Gracias
Responder Con Cita
  #17  
Antiguo 25-10-2021
rci rci is offline
Miembro
 
Registrado: nov 2020
Posts: 416
Poder: 5
rci Va por buen camino
como coger el cif del certificado

Cita:
Empezado por ermendalenda Ver Mensaje
Hola. Lo uso para scar la fecha de caducidad para saber si ha caducadoy el nif./cif y comprobarlo con loa datos de facturación. Y para enviar un email al que solicitó el certificado cuando esté cerca la fecha de caducidad
Lo de comprobar revocados no lo había pensado. Pero lo miro tb. Gracias



Hola ermendalenda, en el código de tu mensaje no consigo ver como coges el nif/cif para compararlo con los datos de facturación.




Muchas gracias por vuestras respuestas.


Saludos
Responder Con Cita
  #18  
Antiguo 26-10-2021
Ramon88 Ramon88 is offline
Miembro
 
Registrado: ago 2021
Posts: 143
Poder: 4
Ramon88 Va por buen camino
Cita:
Empezado por ermendalenda Ver Mensaje
Supongo que ya todos estais teniendo en cuenta donde estais dejando los php, firmador, anulador,,,
Por si acaso, os advierto que seais cuidadosos pueden sacar las claves facilmente, no lo tengais en servidores públicos, lo lógico es que esté en redes privadas.

Aquí os dejo un ejemplo Curl para llamar al php
Código:
curl.exe --connect-timeout 1  http://xxxx/Caducidad.php?fichero==[NombreCertificado.xxx]=[Clave]=  --data-binary @[path completo donde esta alojado el certificado..xxx]  -o [path donde quereis los datoscertificado ejemplo c:\certs\datos_certificado.txt]
Respetad todos los signos igual que los uso para separar los campos, ya que no he encontrado otra forma de mandarlos(que seguro que la hay)
Intentad que las claves de certificado no contengan signos "=","+",",",solo letras numeros guiones bajos y medios y cualquier signo que no necesite traducirlo a codigo uri(podeis investigar un poco mas si quereis para mandar mas signos, yo me he plantado aqui)


En el php, no solo compruebo el certificado si no que lo dejo alojado en el servidor y machaco el que hubiera, esto es muy bueno para actualizar certificados.
Aquí teneis el Caducidad.php

Código PHP:
<?php 
$p 
file_get_contents('php://input'); // $p stands for params
$datos $_GET['fichero'];
$varias=explode("=",$datos);
$xml=file_get_contents("php://input");
$Clave=$varias[2];
$dir_cert =($_SERVER['DOCUMENT_ROOT'].'/certs');
if (!
file_exists($dir_cert)) {
    
mkdir($dir_cert0700true);
}

$dir_cert $dir_cert.'/'.$varias[1] ;
file_put_contents($dir_cert$p);

    
$fac = new Comprobador();
    
$CompruebaF $fac -> comprobar($dir_cert,$Clave);
    exit;

?>

<?php 
class Comprobador{
    public function 
comprobar($certificadop12$clavecertificado)
    {
    if (!
$pfx file_get_contents($certificadop12))
    {
        echo 
"Error: No se puede leer el fichero del certificado o no existe en la ruta especificada";
       exit;
    }
    if (
openssl_pkcs12_read($pfx$key$clavecertificado))
    {
    
$this->publicKey    $key["cert"];
    
$this->privateKey   $key["pkey"];
    }
    else
    {
        echo 
"Error: No se puede leer el almacén de certificados o la clave no es la correcta.";
           exit;
    }
    
$Comprueba1                       $this->insertaComprobacion();
    return 
$Comprueba1;
    }
    public function 
insertaComprobacion(){
        
$certData   openssl_x509_parse($this->publicKey);
$validFromd1 date('d-m-Y H:i:s'$certData['validFrom_time_t']);
                
$validFromd date('d-m-Y'$certData['validFrom_time_t']);
        
$validFromh date('H:i:s'$certData['validFrom_time_t']);
$validTod1 date('d-m-Y H:i:s'$certData['validTo_time_t']);
                
$validTod date('d-m-Y'$certData['validTo_time_t']);
        
$validToh date('H:i:s'$certData['validTo_time_t']);
    
    echo 
"<FechaDesde>".$validFromd."</FechaDesde>";
    echo 
"\r\n<HoraDesde>".$validFromh."</HoraDesde>";
    echo 
"\r\n<FechaHasta>".$validTod."</FechaHasta>";
    echo 
"\r\n<HoraHasta>".$validToh."</HoraHasta>";
        if (!empty(
$certData['name'])){
        echo 
"\r\n<Nombre>".$certData['name']."</Nombre>";
        }
    if (!empty(
$certData['hash'])){
    
    echo 
"\r\n<Hash>".$certData ['hash']."</Hash>";
    }
    if (!empty(
$certData['C'])){
        
        echo 
"\r\n<Pais>".$certData['C']."</Pais>";
       }
    if (!empty(
$certData['subject']['ST'])){
        
        echo 
"\r\n<Estado>".$certData['subject']['ST']."</Estado>"
       }
    if (!empty(
$certData['subject']['L'])){
        
           echo 
"\r\n<Municipio>".$certData['subject']['L']."</Municipio>";
    }       
    if (!empty(
$certData['subject']['CN'])){
        
        echo 
"\r\n<RazonSocial>".$certData['subject']['CN']."</RazonSocial>";
    } 
    if (!empty(
$certData['extensions']['subjectAltName'])){

        
$variosemails=explode(",",$certData['extensions']['subjectAltName']);
          if (!empty(
$variosemails[0])){
            
$vemails=explode(":",$variosemails[0]);
              if (!empty(
$vemails[1])){
            
                echo 
"\r\n<Email>".$vemails[1]."</Email>";   
             }                
            else
            {
                 echo 
"\r\n<EmailSinFormateo>".$vemails."</EmailSinFormateo>";
        
            }
        if (!empty(
$variosemails[1])){

        echo 
"\r\n<SubjectEmail1>".$variosemails[1]."</SubjectEmail1>";   
        }
        if (!empty(
$variosemails[2])){

        echo 
"\r\n<SubjectEmail2>".$variosemails[2]."</SubjectEmail2>";   
        }

        if (!empty(
$variosemails[3])){

        echo 
"\r\n<SubjectEmail3>".$variosemails[3]."</SubjectEmail3>";   
        }
        if (!empty(
$variosemails[4])){

        echo 
"\r\n<SubjectEmail4>".$variosemails[4]."</SubjectEmail4>";   
        }
        if (!empty(
$variosemails[5])){

        echo 
"\r\n<SubjectEmail5>".$variosemails[5]."</SubjectEmail5>";   
        }
        if (!empty(
$variosemails[6])){

        echo 
"\r\n<SubjectEmail6>".$variosemails[6]."</SubjectEmail6>";   
        }
        }
    }       
    if (!empty(
$certData['extensions']['authorityKeyIdentifier'])){
    
        echo 
"\r\n<KeyAutorizacion>".$certData['extensions']['authorityKeyIdentifier']."</KeyAutorizacion>"
    }      
    if (!empty(
$certData['issuer']['OU'])){
        echo 
"\r\n<Emisor>".$certData['issuer']['OU']."</Emisor>"
    }       
    echo 
"\r\n<ClavePublica>"$this->publicKey ."</ClavePublica>"

    echo 
"\r\n<ClavePrivada>".$this->privateKey."</ClavePrivada>"


    echo 
"\r\n";
    echo 
"\r\n// --- Datos con nombres de campos Originales ---";
    
    echo 
"\r\n<validFrom_time_t>".$validFromd1."</validFrom_time_t>";
    echo 
"\r\n<validTo_time_t>".$validTod1."</validTo_time_t>";
    if (isset(
$certData['subject'])){
        
        foreach (
$certData['subject'] as $item=>$value)
            {
                   echo 
"\r\n<".$item.">"$value."</".$item ">";
            }
        }
        if (isset(
$certData['extensions'])){
         foreach (
$certData['extensions'] as $item=>$value)
            {
                   echo 
"\r\n<".$item.">"$value."</".$item ">";
            }
        }
    
$Comprueba='';
    return 
$Comprueba;
    } 
}
?>

Te refieres a la clave del certificado?
Yo lo hago de forma que tenga que estar instalado, y así puedo sacar la fecha de caducidad, cuando quedan 15 días, ya voy avisando que tienen que renovarlo cagando ostias.
Responder Con Cita
  #19  
Antiguo 26-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Cita:
Empezado por Ramon88 Ver Mensaje
Te refieres a la clave del certificado?
Yo lo hago de forma que tenga que estar instalado, y así puedo sacar la fecha de caducidad, cuando quedan 15 días, ya voy avisando que tienen que renovarlo cagando ostias.
Yo lo hago por fichero sin instalar y aun así puedo sacar todos los datos. Como trabajo con múltiples empresas con buzoneo de datos les mando el certificado por transferencia de datos y se autoinstala en un almacén propio sin posibilidad de error de equivocarme de empresa ya que antes de untoinstalar se comprueban automaticamente y me ahorro Dolores de cabeza. Aparte. Eva mandando correos cuando faltan 45, 30, 15 días y todos los días cuando falta una semana, indicándome que empresa y certificado es el que está apunto de caducar.
Responder Con Cita
  #20  
Antiguo 26-10-2021
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 1.768
Poder: 5
ermendalenda Va por buen camino
Pregunta a ver que pensais

Tengo un tpv que emite facturas en modo manual, pero a la vez maneja cobros desatendidos en un cajón de autocobro y un tpv datáfono, estos cobros on facturas que van al mismo número de serie correlativos (la 3 formas de cobro), me está dando problemas de lentitud usar el encadenamiento en los 3 casos, he pensado que aunque el cobro se gestione finalmente desde el mismo tpv y misma serie, puedo considerarlos como distintos dispositivos(números de serie) y así cada uno lo encadenó independientemente?
Con el numerador de la serie no me suele dar el problema por que es lo primero que cambio y no tiene que esperar la firma, que aunque sean décimas de segundos es un incordio
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 3706 Hace 2 Semanas 09:38:43
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 19:03:03.


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