Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validación FACe La "firma de la factura es incorrecta" #175

Open
Jasmsan opened this issue Nov 19, 2024 · 17 comments
Open

Validación FACe La "firma de la factura es incorrecta" #175

Jasmsan opened this issue Nov 19, 2024 · 17 comments
Labels

Comments

@Jasmsan
Copy link

Jasmsan commented Nov 19, 2024

Hola, obtengo el error "La firma de la factura es incorrecta" cuando trato de validar la firma de una factura que se ha generado y firmado con la librería (he usado un certificado de pruebas del FNMT).
¿Puede ser que estoy pasando algo por alto al momento de firmar el fichero?
He probado sólo generar la factura sin la firma y la estructura es correcta según el validador de FACe, e incluso he podido firmar la factura mediante la aplicación de AutoFirma (con el mismo certificado).
El código que he utilizado es el siguiente:

<?php

$fac = new Facturae();
$fac->setNumber('GEN/24-', '00172');
$fac->setIssueDate('01-04-2024');


// Incluimos los datos del vendedor
$fac->setSeller(new FacturaeParty([

  'taxNumber' =>'685',

  'name'      => mb_convert_encoding('Solutions, S.L.', 'UTF-8', 'ISO-8859-1'),

  'address'   => mb_convert_encoding('Montero Ros, 9', 'UTF-8', 'ISO-8859-1'),

  'postCode'  => '32011',

  'town'      => mb_convert_encoding('A Coruña', 'UTF-8', 'ISO-8859-1'),

  'province'  => mb_convert_encoding('A Coruña', 'UTF-8', 'ISO-8859-1')

]));





// Incluimos los datos del comprador,
// una empresa
$fac->setBuyer(new FacturaeParty([

  'isLegalEntity' => true,       // Importante!

  'taxNumber' => 'A708',

  'name' => mb_convert_encoding('S.A.', 'UTF-8', 'ISO-8859-1'),

  'address' => mb_convert_encoding('Pol. C/ 78 - A2 ', 'UTF-8', 'ISO-8859-1'),

  'postCode' => '15895',

  'town' => mb_convert_encoding('Milladoiro - Ames', 'UTF-8', 'ISO-8859-1'),

  'province' => mb_convert_encoding('A', 'UTF-8', 'ISO-8859-1')

]));



// Añadimos los productos a incluir en la factura

$fac->addItem(new FacturaeItem([

  'name' => mb_convert_encoding('Cuota Mensual de ', 'UTF-8', 'ISO-8859-1'),

    'description' => mb_convert_encoding('Cuota Mensual ', 'UTF-8', 'ISO-8859-1'), 

  'quantity' => 1,

  'unitPriceWithoutTax' => 90,

  

  'taxes' => [Facturae::TAX_IVA => 21]

]));


// Ya solo queda firmar la factura ...

$fac->sign( 'certs\FNMT_PER_JUR_NOSMIME.p12', null, '1234' );


// ... y exportarlo a un archivo

$fac->export('fac6111.xsig');

?>

Muchas gracias!
Saludos!

@aolmosg
Copy link

aolmosg commented Nov 21, 2024

Hola @Jasmsan me pasa algo similar con un certificado de ANF AC. En mi caso da el error la política de firma no es correcta. Y dependiendo del certificado con el que pruebe también que la firma de la factura es incorrecta.

Nuestro aplicativo estuvo funcionando con un certificado de FMNT pero caducó y nos proporcionaron otro de ANF AC, He estado consultando con la entidad certificadora y ellos me aseguran que el certificado es valido y que tiene capacidad de firmar. Pero al validar la factura en la página de FACe salta el error de que la política de firma es incorrecta.

Aún así hice un script para ver el contenido del certificado para compararlo con el de FMNT y no sé, si afecta a algo pero veo que el certificado nuevo no tiene relleno el valor smimeencrypt en los purposes y en los certificados viejos si lo lleva relleno a 1. También veo un valor en el certificado viejo: [certificatePolicies] => Policy: 1.3.6.1.4.1.5734.3.11.1 y en el nuevo pone esto: [certificatePolicies] => Policy: 1.3.6.1.4.1.18332.2.5.1.9 Cambian las políticas parece ser.

Desde ANF me comentaban primero lo siguiente: "Según me ha comunicado el departamento de desarrollo, como usted bien ha indicado es muy probable que se deba a las políticas, pero a nosotros no nos es posible cambiarlas," y me instan a "
¿No se podría modificar su plataforma PHP para que aceptase las políticas estos certificados?"

No tengo tan claro que sea un problema del código fuente y ya dudo si es un problema con los certificados, no se si desde FACe habrán cambiado algo en las políticas.

Inspeccionando un poco el código fuente de la librería, veo que cuando se llama a $fac->sign ... vei que se utiliza esta constante:

const SIGN_POLICY_3_1 = array( "name" => "Política de Firma FacturaE v3.1", "url" => "http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf", "digest" => "Ohixl6upD6av8N7pEvDABhEL6hM=" );

Sin embargo esa URL si la cargas parece que redirige a otra : https://www.facturae.gob.es/formato/Polticasfirma/A)%20Versi%C3%B3n%203.1/Politica_Firma_formato_facturae_v3_1.pdf

También veo que por defecto el SCHEMA_3_2_1 para el formato y el ultimo parece ser el SCHEMA_3_2_2 => https://www.facturae.gob.es/formato/Paginas/version-3-2.aspx

Lo que es la política de firma si que veo que en FACe https://www.facturae.gob.es/formato/Paginas/politicas-firma-electronica.aspx sale la 3.1 como la última y es la que trae la librería SIGN_POLICY_3_1 así que no sé por donde puede ir el fallo realmente, si es que FACe ha cambiado algo y tenemos que actualizar código o son los certificados.

A ver si @josemmo puede arrojarnos algo de luz al respecto.

Saludos.

@josemmo
Copy link
Owner

josemmo commented Nov 21, 2024

Hola @Jasmsan,

¿Puedes pasar la factura generada y firmada con la libraría que da problemas? Y también esa misma factura generada por la librería pero firmada con AutoFirma.

No entiendo por qué haces la conversación de encoding en algunos strings, debería ser todo UTF-8.

@josemmo
Copy link
Owner

josemmo commented Nov 21, 2024

Hola @aolmosg,

La política de firma de FacturaE viene definida en la especificación y no se puede cambiar. Es un concepto distinto a las policies que aparecen en un certificado.

Lo que significan esos números o OIDs viene en este documento: https://administracionelectronica.gob.es/PAe/aFirma-Anexo-PSC

@Jasmsan
Copy link
Author

Jasmsan commented Nov 21, 2024

Hola @Jasmsan,

¿Puedes pasar la factura generada y firmada con la libraría que da problemas? Y también esa misma factura generada por la librería pero firmada con AutoFirma.

No entiendo por qué haces la conversación de encoding en algunos strings, debería ser todo UTF-8.

Hola @josemmo,
Gracias por tu apoyo!
La conversión de enconding lo hago porque el script lo estoy generando desde Velneo 6, por lo cual necesito hacerlo en algunos strings.
Te dejo los ficheros que me has pedido en un .zip:
facturas.zip

El fichero fac6111_signed.xsig está generado y firmado con la librería. // No pasa la validación de firma de FACe
El fichero fac6111_autofirma.xsig es una factura generada con la librería (sin firmar) pero firmada con AutoFirma. // Sí pasa la validación de firma de FACe

@Jasmsan
Copy link
Author

Jasmsan commented Nov 21, 2024

Hola @Jasmsan me pasa algo similar con un certificado de ANF AC. En mi caso da el error la política de firma no es correcta. Y dependiendo del certificado con el que pruebe también que la firma de la factura es incorrecta.

Nuestro aplicativo estuvo funcionando con un certificado de FMNT pero caducó y nos proporcionaron otro de ANF AC, He estado consultando con la entidad certificadora y ellos me aseguran que el certificado es valido y que tiene capacidad de firmar. Pero al validar la factura en la página de FACe salta el error de que la política de firma es incorrecta.

Aún así hice un script para ver el contenido del certificado para compararlo con el de FMNT y no sé, si afecta a algo pero veo que el certificado nuevo no tiene relleno el valor smimeencrypt en los purposes y en los certificados viejos si lo lleva relleno a 1. También veo un valor en el certificado viejo: [certificatePolicies] => Policy: 1.3.6.1.4.1.5734.3.11.1 y en el nuevo pone esto: [certificatePolicies] => Policy: 1.3.6.1.4.1.18332.2.5.1.9 Cambian las políticas parece ser.

Desde ANF me comentaban primero lo siguiente: "Según me ha comunicado el departamento de desarrollo, como usted bien ha indicado es muy probable que se deba a las políticas, pero a nosotros no nos es posible cambiarlas," y me instan a " ¿No se podría modificar su plataforma PHP para que aceptase las políticas estos certificados?"

No tengo tan claro que sea un problema del código fuente y ya dudo si es un problema con los certificados, no se si desde FACe habrán cambiado algo en las políticas.

Inspeccionando un poco el código fuente de la librería, veo que cuando se llama a $fac->sign ... vei que se utiliza esta constante:

const SIGN_POLICY_3_1 = array( "name" => "Política de Firma FacturaE v3.1", "url" => "http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf", "digest" => "Ohixl6upD6av8N7pEvDABhEL6hM=" );

Sin embargo esa URL si la cargas parece que redirige a otra : https://www.facturae.gob.es/formato/Polticasfirma/A)%20Versi%C3%B3n%203.1/Politica_Firma_formato_facturae_v3_1.pdf

También veo que por defecto el SCHEMA_3_2_1 para el formato y el ultimo parece ser el SCHEMA_3_2_2 => https://www.facturae.gob.es/formato/Paginas/version-3-2.aspx

Lo que es la política de firma si que veo que en FACe https://www.facturae.gob.es/formato/Paginas/politicas-firma-electronica.aspx sale la 3.1 como la última y es la que trae la librería SIGN_POLICY_3_1 así que no sé por donde puede ir el fallo realmente, si es que FACe ha cambiado algo y tenemos que actualizar código o son los certificados.

A ver si @josemmo puede arrojarnos algo de luz al respecto.

Saludos.

Hola @aolmosg,

Puedes tratar de usar la aplicación de AutoFirma a ver si firmando con el mismo certificado pasa la validación del FACe (sólo para descartar que el problema sea el certificado).

@jesuscarreter
Copy link

jesuscarreter commented Nov 21, 2024

Buenos días,
Creo que hay que hacer una corrección de la función para FACeB2B al recuperar el listado de facturas recibidas "getRegisteredInvoices". Si se opta por obtener el listado completo recibido para la ESF se debería incluir la etiqueta "code" dado que de lo contrario no se puede delimitar el resultado por código de unidad receptora.

XXXXXXXX sustituir por XXXXXXXX

Si estoy en lo incierto ruego me disculpéis.
Saludos.

@aolmosg
Copy link

aolmosg commented Nov 21, 2024

Buenas @josemmo , gracias por responder.

Parece ser que en mi caso estaba usando una versión antigua de la librería (1.4.2) Fallo mío.

He probado a instalarme la última versión 1.8.1 y la he hecho funcionar en PHP 5.6 con OpenSSL 3.0.2, me genera la factura y la firma, pero ahora me pasa como al compañero @Jasmsan, me salta el error "La firma de la factura es incorrecta" cuando intento validarla en https://face.gob.es/es/facturas/validar-visualizar-facturas . Si marco sólo formato Facturae me sale correcto.

El problema es que la web de Face te dice el error pero no te dice "porqué" y vamos a ciegas.

Siguiendo el consejo de @Jasmsan me he instalado el programa de autofirma, como mi aplicativo me genera directamente el fichero .xsig y no el xml, he cogido y le he quitado manualmente el nodo ds:Signature al fichero .xsig y lo he guardado como .xml . Después mediante el programa de autofirma lo he firmado con el mismo certificado y entonces la web de FACe si me valida certificado y firma. Por lo que descartamos que sea problema del certificado, algo hace el programa de autofirma diferente a la librería.

Desde autofirma, si abro el fichero firmado con la libería, tiene un visor y dice: "Los datos contenidos o referenciados en la firma no se corresponden con los datos firmados"

Adjunto por si sirve de algo mis dos archivos:

facturas_facturae_autofirma.zip

Facturae_f_3363 (3) .xml_signed_autofirma.xsig => Firmado con autofirma y valida en FACe
Facturae_f_3363 (3).xsig => Firmado con la librería y FACe no valida la firma.

Un slaudo y mMuchas gracias.

@Jasmsan
Copy link
Author

Jasmsan commented Nov 21, 2024

Hola chicos,
He encontrado algo de información y he podido generar y firmar la factura con la librería y validarla correctamente con FACe.
Os comento que ha pasado:
Es básicamente el mismo problema que se discutió en el post #147 .
Si se está usando una versión de PHP con OpenSSL 3 (lo podéis ver con php --info) pues hay que hacer unos cambios en el fichero de configuración de OpenSSL openssl.cnf para activar el modo legacy para trabajar con algunos certificados (en formato .p12) que usan cifrado antiguo.

La configuración que se debe realizar en el fichero openssl.cnf es la siguiente (en mi caso sólo tuve que descomentar una línea y agregar otras):

openssl_conf = openssl_init

[openss_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1

En éste link tenéis más información https://www.php.net/manual/en/function.openssl-pkcs12-read.php#128941
Creo que éste fix puede serte de ayuda @aolmosg

Procedo a cerrar el issue!

Saludos.

@Jasmsan Jasmsan closed this as completed Nov 21, 2024
@aolmosg
Copy link

aolmosg commented Nov 22, 2024

Buenas @Jasmsan ,

El problema con el OpenSSL 3 lo tuve, pero lo que sucedía con el legacy desactivado es que la función

openssl_pkcs12_read($certificateStore, $parsed, $passphrase)

No era capaz de desencriptar el certificado y saltaba un error. (Mi certificado es un .pfx certificado por ANF AC)

Estuve cambiando la configuración del legacy del OpenSSL, para activar el legacy precisamente con las opciones que indicas, ya que tenemos acceso al servidor como root. Me hice un archivo de test con la función loadPkcs12($storeOrCertificate, $passphrase) modificada con print_r() para ver simplemente si el servidor era capaz de decodificar el certificado y extraer el contenido de las claves. Con el legacy desactivado saltaba un error, con el legacy activado decodificaba todo.

Es decir el OpenSSL solo interfería en la decodificación del certificado, y al no poder decodificarlo no se podía firmar, pero una vez activado el legacy, ya se decodifica y se firma, pero FACe dice que la firma no es válida.

la versión que tengo corriendo de openssl con php 5.6:
OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 3.0.2 15 Mar 2022
OpenSSL Header Version => OpenSSL 3.0.2 15 Mar 2022
Openssl default config => /usr/lib/ssl/openssl.cnf

Creo que lo del legacy era un problema adicional, cuando me pasó lo que sucedía era que el archivo .xsig se generaba sin la firma al no poder decodificar el certificado, y claro al no tener firma no validaba. Pero activando lo del legacy ya se firma, lo que no sé porque no valida. Son problemas diferentes parece ser.

Si edito ambos ficheros .xsig, el firmado con autofirma y el firmado con la librería, la diferencia que veo es el nodo de la firma, pero no soy capaz de saber por dónde van los tiros. Veo que cuando se inserta el certificado desde la librería está en formato "pretty" y en autofirma parece todo seguido sin \n. También veo que parece que utiliza otro método, en autofirma el nodo ds:Signature tiene => xmlns:ds="http://www.w3.org/2000/09/xmldsig#" y con la librería xmlns:xades="http://uri.etsi.org/01903/v1.3.2#". El signatureMethod también es diferente en autofirma <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> y con la librería <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"></ds:SignatureMethod>

Adjunto captura (tabulado para que se pueda ver) a la izquierda autofirma y a la derecha la librería.
captura

Supongo que esto será normal hasta cierto punto si utilizan métodos diferentes de firmado pero realmente no sé por donde puede estar el fallo.

Adicionalmente si abro en autofirma el fichero firmado con la librería dice que "los datos contenidos o referenciados en la firma no se corresponden con los datos firmados"

Un saludo y muchas gracias.

@Jasmsan
Copy link
Author

Jasmsan commented Nov 22, 2024

Hola @aolmosg,
Acabo de revisar un fichero que generé y firmé con la librería, luego de hacer los cambios en la configuración de SSL que indiqué antes y ésto es lo que me encontré (con respecto a los puntos que señalas, ds:Signature y ds:SignatureMethod):

En el ds:Signature me lo ha generado con lo siguiente:
<ds:Signature xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">

Y en el ds:SignatureMethod lo siguiente:
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512">

O sea, creo que son las mismas que tienes tú y la factura que estoy mirando está validada por FACe.

Creo que por allí no van los tiros.

Saludos.

@josemmo
Copy link
Owner

josemmo commented Nov 23, 2024

Hola @aolmosg,

Necesitas añadir todos los certificados de la cadena de certificación para que la firma de la factura pueda validarse correctamente (consulta este enlace de la documentación para más información).

En la factura que firmas con Facturae-PHP, solo aparece un nodo de <ds:X509Certificate /> cuando debería aparecer tres. Esto seguramente se deba a que el fichero "certs\FNMT_PER_JUR_NOSMIME.p12" solo tiene un certificado. Tienes que volver a exportarlo correctamente, con la cadena de certificados completa.

@aolmosg
Copy link

aolmosg commented Nov 25, 2024

Hola @josemmo, creo que no es el caso, en la factura firmada con Facturae-PHP me aparecen los 3 nodos de <ds:X509Certificate>

captura1
captura1_1

Seguiré mirando a ver si lo saco.

Saludos.

@josemmo
Copy link
Owner

josemmo commented Nov 25, 2024

Hola @aolmosg,

Creo que estáis hablando de fallos distintos. En el caso de @Jasmsan (que es quien ha abierto el issue), estoy seguro de que no está incluyendo toda la cadena de certificados.

En tu caso, el hash del nodo <ds:Reference Id="Reference-ID-286441" /> no se está calculando correctamente. Pasa el código fuente que utilices para generar la factura y/o una factura sin firmar intacta (tal cual sale de Facturae-PHP) para poder diagnosticarlo.

@josemmo josemmo reopened this Nov 25, 2024
@aolmosg
Copy link

aolmosg commented Nov 25, 2024

Hola @josemmo ,

Te adjunto el código fuente que uso para generar la factura, verás que hay datos que vienen de variables:

`// Creamos la factura
$fac = new Facturae();

// Asignamos el número a la factura
// Nótese que Facturae debe recibir el lote y el número separados
$fac->setNumber($objFactura->nom_serie, $objFactura->numero);

// Asignamos fecha de la factura
$fac->setIssueDate($objFactura->fecha);

// Incluimos los datos del vendedor
$fac->setSeller(new FacturaeParty([
    "taxNumber" => $objEmpresa->nif,
    "name"      => $objEmpresa->nombre,
    "address"   => $objEmpresa->direccion1,
    "postCode"  => $objEmpresa->cp,
    "town"      => $objEmpresa->nom_localidad,
    "province"  => $objEmpresa->nom_provincia
]));

// Incluimos los datos del comprador,
$fac->setBuyer(new FacturaeParty([
    "isLegalEntity" => true,       // Importante!
    "taxNumber"     => $nif,
    "name"          => truncateText($nombre,40, '', true, false ),
    "address"       => $direccion,
    "postCode"      => $cp,
    "town"          => $nom_localidad,
    "province"      => $nom_provincia,
    "centres"   => [
        new josemmo\Facturae\FacturaeCentre([
            "role"     => josemmo\Facturae\FacturaeCentre::ROLE_GESTOR,
            "code"     => trim($organo_gestor),
            "name"     => truncateText($nombre,40, '', true, false ),
            "address"  => $direccion,
            "postCode" => $cp,
            "town"          => $nom_localidad,
            "province"      => $nom_provincia,
            "description"  => "Órgano gestor"
        ]),
        new josemmo\Facturae\FacturaeCentre([
            "role"     => josemmo\Facturae\FacturaeCentre::ROLE_TRAMITADOR,
            "code"     => trim($unidad_tramitadora),
            "name"     => truncateText($nombre,40, '', true, false ),
            "address"  => $direccion,
            "postCode" => $cp,
            "town"          => $nom_localidad,
            "province"      => $nom_provincia,
            "description"  => "Unidad tramitadora"
        ]),
        new josemmo\Facturae\FacturaeCentre([
            "role"     => josemmo\Facturae\FacturaeCentre::ROLE_CONTABLE,
            "code"     => trim($oficina_contable),
            "name"     => truncateText($nombre,40, '', true, false ),
            "address"  => $direccion,
            "postCode" => $cp,
            "town"          => $nom_localidad,
            "province"      => $nom_provincia,
            "description"  => "Oficina contable"
        ])
    ]
]));

// Añadimos los productos a incluir en la factura
$objDtl=new FactoryEN("facturas_ventas_dtl", "codigo ASC", $idioma);
$objDtl_nav=$objDtl->get_all("factura={$objFactura->codigo}", null, null);
//print_r($objDtl_nav);
if(!empty($objDtl_nav))
{
    foreach($objDtl_nav as $k => $v)
    {
        $referencia=extraeCampoBD("articulos", $v->articulo, "referencia");

        $objTiva=new FactoryEN("tipos_iva", "codigo ASC", $idioma);
        $objTiva->getById($v->tipo_iva, null);

        $importe_tipo_iva=$objTiva->importe;
        $factor=($importe_tipo_iva/100)+1;
        $precio_unit_iva_incl=$v->precio*$factor;

        $descuento=null;
        if(!empty($v->descuento))
        {
            $descuento=array(
                ["reason"=>"Descuento del {$v->descuento}%", "rate"=>$v->descuento]
            );
        }

        if($aplicar_porcentaje_retencion)
        {
            $taxes= array(
                Facturae::TAX_IVA  => $importe_tipo_iva,
                Facturae::TAX_IRPF => $porcentaje_retencion
            );
        }
        else
        {
            $taxes= array(
                Facturae::TAX_IVA  => $importe_tipo_iva
            );
        }

        $charges=null;
        if(!empty($objTiva->recargo_equivalencia) && $aplicar_recargo_equivalencia)
        {
            $charges=array(
                ["reason"=>"Recargo de equivalencia {$objTiva->recargo_equivalencia}%", "rate"=>$objTiva->recargo_equivalencia, "hasTaxes"=>false]
            );
        }

        $fac->addItem(new josemmo\Facturae\FacturaeItem([
            "name" => strip_tags($v->nom_articulo),
            "articleCode" => $referencia,
            "quantity" => $v->cantidad, // Esto es opcional, es el valor por defecto si se omite
            "unitPrice" => $precio_unit_iva_incl,
            "discounts" => $descuento,
            "charges" => $charges,
            "taxes" => $taxes
        ]));

        unset($objTiva);
    }
}

// Establecemos un método de pago 
$fac->addPayment(new josemmo\Facturae\FacturaePayment([
  "method" => josemmo\Facturae\FacturaePayment::TYPE_TRANSFER,
  "dueDate" => $objFactura->fecha_pago,
  "iban"   => $objEmpresa->iban,
  "bic"    => $objEmpresa->bic
]));

// Ya solo queda firmar la factura ...

if($fac->sign('/var/www/vhosts/torregrosadesatascos.com/subdomains/app/httpdocs/galeria/empresas/' . $certificado_facturae, null, $clave_facturae))
{

  // ... y exportarlo a un archivo
    $nom_file=archivo_amigable($objFactura->nom_serie . '_' . $objFactura->numero) . '.xsig';
    $ruta_completa=__DIR__ . '/tests/output/Facturae_' . $nom_file;
    $fac->export($ruta_completa);
  
    echo '/Facturae-PHP-master/tests/output/Facturae_' . $nom_file;
}`

Adjunto también una factura exportada con Facturae-PHP sin firmar.

Facturae_f_3363 (1).zip

Saludos.

@aolmosg
Copy link

aolmosg commented Dec 5, 2024

Hola @josemmo , ¿pudiste ver algo con la factura sin firmar?

Un saludo y gracias.

josemmo added a commit that referenced this issue Dec 7, 2024
- Actualizada clase FacturaeSigner
- Actualizados tests unitarios

> Relacionado con #175
@josemmo
Copy link
Owner

josemmo commented Dec 7, 2024

Hola @aolmosg,

Parece que el problema estaba relacionado con los saltos de línea. Tienes varios retornos de carro (\r) en tu documento, lo cual es un poco raro pero creo que no va en contra de ninguna especificación.

He añadido un fix a la rama develop. ¿Puedes descargarte la última versión y comprobar si está solucionado?

composer require josemmo/facturae-php:dev-develop

@josemmo josemmo added the bug label Dec 7, 2024
@aolmosg
Copy link

aolmosg commented Dec 9, 2024

Hola @josemmo ,

¡Pues ahora si funciona! me valida tanto el formato como la firma en la web de FACe.

Veo que le has quitado los \r en la función de firma

Muchísimas gracias!.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants