-
Notifications
You must be signed in to change notification settings - Fork 106
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
eFact - A bad canonicalization algorithm was specified #152
Comments
Modificando la función request de la clase SoapClient, en concreto la variable $signedInfo de manera que se parezca más al xml del ejemplo proporcionado por ellos :
Obtengo The signature or decryption was invalid. Alguna idea de qué podría ser @josemmo? |
Hola @nk-alex, Sobre el error "An error was discovered processing the wsse:Security header (A bad canonicalization algorithm was specified)", ¿sabes qué algoritmos de canonicalización están permitidos? Puede que sea porque eFact espera que el cliente use "http://www.w3.org/2001/10/xml-exc-c14n", pero Facturae-PHP usa "http://www.w3.org/TR/2001/REC-xml-c14n-20010315". |
@josemmo Correcto, ellos en su ejemplo usan "http://www.w3.org/2001/10/xml-exc-c14n" además de He modificado la función request de la clase https://github.com/josemmo/Facturae-PHP/blob/master/src/Face/SoapClient.php para actualizar el XML generado acorde a los cambios de los que hemos hablado. También he modificado el método getDigest de XmlTools para generar el Digest utlizando sha1. También, he tenido que modificar el método getSignature indicándole que use OPENSSL_ALGO_SHA1 para que mi ds:SignatureValue tenga la misma longitud que la del ejemplo. Su ejemplo de XML de envío de facturas tiene el siguiente aspecto:
En mi caso, he conseguido que tenga el siguiente aspecto:
Mi campo BinarySecurityToken y ds:SignatureValue los he ocultado, pero tienen el mismo aspecto que el de su ejemplo. Estoy viendo que nuestros Headers son prácticamente idénticos, no acabo de entender qué puede estar fallando. Tienes alguna idea? (Apunte: Usando los métodos getDigest y getSignature con sha512, tambíen resulta en un The signature or decryption was invalid. Los he modificado por que he visto que los suyos producían DigestValue y SignatureValue de midas más cortas que las mías) |
Hola @nk-alex, Tras un rato peleándome con esto, creo que ya se por qué falla. Resulta que e-FACT solo admite canonicalización exclusiva de XML ( Por lo que sea, los desarrolladores de e-FACT han decidido hacer lo contrario que el resto de puntos de entrada de facturación y admitir solo EXC-C14N en vez de C14N, así que eso va a ser un problema. Como no podemos convencer a e-FACT para que admita ambas recomendaciones del W3C, creo que lo mejor va a ser implementar ambas en la librería y que el usuario pueda elegir cuál usar. Marco el issue como "feature", espero poder sacar tiempo cuanto antes para implementarlo, ya que entiendo que es importante. |
Hola @nk-alex, Ya tengo implementados los cambios en borrador pero no puedo escribir los test unitarios porque no puedo dar de alta el certificado de prueba en efact-pre.aoc.cat ya que la web de autenticación está caída. Voy a esperar unos días a ver si con suerte lo arreglan. |
Hola @nk-alex, He añadido unos cambios a la rama
¿Puedes probarlo y ver si ya te funciona? Tienes que crear un $developmentEndpointUrl = "https://efact-pre.aoc.cat/bustia/services/EFactWebServiceProxyService";
$productionEndpointUrl = "https://efact.aoc.cat/bustia/services/EFactWebServiceProxyService";
$face = new CustomFaceClient($developmentEndpointUrl, "sello.pfx", null, "abc123");
$face->setWebNamespace('https://webservice.efact.es/sspp'); // <--- Esta línea es nueva |
Hola @josemmo yo tenia el mismo problema y me a funcionando con los cambios que as hecho, con las pruebas que he hecho con la url development. |
Gracias @josemmo, durante la semana que viene probaré y te confirmaré también |
@josemmo Confirmo también que funciona perfectamente. Muchas gracias. |
Genial, @nk-alex! Gracias por confirmarlo. |
Buenas,
He estado leyendo en #141 y #97 que el envío a eFact también es posible usando Facturae-PHP. Como primera prueba, he intentado con el mismo código que envía correctamente a FACe, pero haciendo uso del CustomClient:
Pero a esta petición, recibo la siguiente respuesta:
faultCode: "axis2ns1:InvalidSecurity"
faultstring: "An error was discovered processing the wsse:Security header (A bad canonicalization algorithm was specified)"
Estoy haciando algo mal? Usando el formulario web de eFact, puedo entregar correctamente la factura.
The text was updated successfully, but these errors were encountered: