AfipSDK / afip.js

Libreria para usar los Web Services de AFIP con Typescript y JavaScript
https://afipsdk.com/
MIT License
162 stars 85 forks source link

Ayuda con cert y key guardados en base de datos. #71

Closed jlopezjuy closed 3 months ago

jlopezjuy commented 3 months ago

Hola Buenas a todos, me a pasado de perder los archivos cert y key y teneer que generarlos de nuevo y hacer pruebas, ya que agregaron un metodo para obtener los cert y key me parecio genial utilizar la salida y guardarlos en la base de datos y de ahi poder utilizarlo para cuando queira facturar. Actualmente e utilizado el metodo CreateCert

`async createCertAndSave(empresaDto: CompanySaveCredentialDTO): Promise { const { cuit, password, alias } = empresaDto; try { let empresa = await this.companyRepository.findOne({ where: { cuit } });

  if (!empresa) {
    throw new Error('Empresa no encontrada');
  }
  const afip = new Afip({ CUIT: cuit });
  const res = await afip.CreateCert(cuit, password, alias);

  empresa.certFile = res.cert;
  empresa.keyFile = res.key;

  empresa = await this.companyRepository.save(empresa);

  return empresa as CompanyDTO; // Convertir el resultado al tipo esperado
} catch (error) {
  // Manejo de errores, lanzar una excepción personalizada o registrar el error
  throw new Error(`Error creando y guardando el certificado: ${error.message}`);
}

}`

-----BEGIN CERTIFICATE----- MIIDSzCCAjOgAwIBAgIIBAprgax8i9kwDQYJKoZIhvcNAQENBQAwODEaMBgGA1UEAwwRQ29tcHV0 YWRvcmVzIFRlc3QxDTALBgNVBAoMBEFGSVAxCzAJBgNVBAYTAkFSMB4XDTI0MDcwNzE4MDIyNloX DTI2MDcwNzE4MDIyNlowMTEUMBIGA1UEAwwLdGVzdGluZ0p1YW4xGTAXBgNVBAUTEENVSVQgMjAz MTU5MDc4NTQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYPV5bDaRwKohWBEA9pNJw OD8fpdu4stoyu3r65z6vQXl2/DxWoWZ3 4DANBgkqhkiG9w0BAQ0FAAOCAQEAl4hFSUVXLpkNuhB6e5/jmGWu+W2npty0wPikUY5Y/jq/vAQh LFIt/zs8s/2W8t7SkZfgP9/377+OWRBxg+BGScI+BEO9KaAoKDS3Kbf7TmLqsDk0lAuBqfxSjUcG yUQd/i2aw7SdmdSy6H2ZftIN2wwnlTwornFla6TjFpgwPx2LIMvbSFRlt0h7+lV2uL5DNZKGv66d n/moG9r9h6+rx3h6yJitCpIiUA8nqS8Qsl6j/VU468nnc4zgGTz2EZo8ju6S3eMmNd276ZidLB6n RGiG2JDwJTEyCMisC/amxt7y7EfkifogWIOYRgUuqP7SI+rOib2Xonz1JmXQ8/dLpw== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA2D1eWw2kcCqIVgRAPaTScDg/H6XbuLLaMrt6+uc+r0F5dvw8 VqFmdxKVOXJZlxeNbp3KzypuyxL7GV2r+r2QNsvr9ZdprjMxWjq8w6QVEWG8U/5f iF0pIDJQl7AwSeYEFenflBskgln4dF7rkKecI6tTUAgyx8THxrJhHffsX0+N+E39 oBvr08UyvQiuHCV J+TcwsJctJt7JhOIlmKHLakvhYpaZxQvPLVtaP+PhOJaUDhR9RfgXyYKMdRw6A04 CU28MJ/72Q3DPKd91EEuedSVAfm/MuQsimSjaMnond+M+mij0xu2vYxlEZBDViG0 go+Y7mECgYEA9L7V1imE2vl9+bFkfh1BhnDRWKqVNrNJUQ/FswXUQYDYa+xUEzqS vu0qrl6stR7GtxH2f/KGsaFn3esadoAYUxY38dXSqSe5Ku+f12QM3ZZ4KU91EDmE rmNepIviimhRCLnrF9BawogHMze8veZbc8znH6NarDnZjJ7pRU60RBcCgYEA4i72 G2NCdtNCqlnr1fDD83ffVnaXuJq/+WfUHrWlGDFqI/a/oce6l3VNTBvto23bdk+B XR2pWNpddat7ctK7Xx1Ux7/NCQTGZm8aMAwjtgCvwdBSv0aRyygaGmHpyPErosBE HSiksDv7mQ6GzwtO3V6b9l1Lil5ltG7Eeb82fdkCgYEAgYW47vTcDXK523mowCFF exubfrwP6XnqVA7vxnVQRjYk0sCoIeD+pjInQ05xQgz+hwXnmQDFjZ3otQXl5E6Y EOiSRNau/Lw7/1//DGMzd9VY1CvrvOFjuVJ3VMd+5Vadg+u4YcrvLUIF5XIa3bja LyeCLTkrFDgtTIEQ3I/xUJMCgYEAvhqweaZ813iLALkhciix2bG4Amkc7mkKz6pH 7CPKBkKKLn4W5PgFSYWrGTwkCQetvIvodAYZLvgiM2OVF5YtLC1v84+u2lSsGK5q +VVKso9zKdhZpDDBG1qyTdhb8atafKlS1psxiHpx5lwCTIT5nTAGsBQMCNl8bCHp e1aOi0kCgYAfpEni1FLcXyXGq16cgSGeeknf6mjwgZTyb8Z8guKLyxK/tAcBril5 7lN2W9W3Bis4ma/rMiglu8u94fwgtOFuKm3A9rLSPbZJ0OuKYBAy4uPm9W5i6XEa Y2oVXcIHXfeacoJHk64XDSq99FZ1d8qaEYDjTe2Oii3QYtl+B9ilXA== -----END RSA PRIVATE KEY-----

Ahora cuando quiero utilizarlos para poder hacer pruebas de la siguiente forma: `let empresa = await this.companyRepository.findOne({ where: { cuit } });

if (!empresa) {
  throw new Error('Empresa no encontrada');
}
const factura: FacturaBDTO = facturaBDTO;

const fs = require('fs');

const certFilePath = await this.createTempFile('certFileConverted.cert', empresa.certFile);
const keyFilePath = await this.createTempFile('keyFileConverted.key', empresa.keyFile);

try{
  const cert = fs.readFileSync(certFilePath, { encoding: 'utf8' });
  const key = fs.readFileSync(keyFilePath, { encoding: 'utf8' });

  //const cert = empresa.certFile.toString('utf8');
  //const key = empresa.keyFile.toString('utf8');
  console.log(cert);
  console.log(key);

  const afip = new Afip({
    CUIT: cuit,
    key: key,
    cert: cert,
    production: false,
    access_token: 'LZ9yOynyGQ6EqpRPQ9nUjRAHRgG4m8CMYeuTndovXGzdxRI5Igt7EMHWNppycxhj'
  });

`

Tengo el siguiente error:

last_voucher Request failed with status code 400 [Nest] 75860 - 07/08/2024, 11:54:36 AM [ExceptionsHandler] Request failed with status code 400 +586521ms Error: Request failed with status code 400 at /Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@afipsdk/afip.js/src/Afip.js:85:20 at processTicksAndRejections (node:internal/process/task_queues:95:5) at async Axios.request (/Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@afipsdk/afip.js/node_modules/axios/lib/core/Axios.js:40:14) at async Afip.GetServiceTA (/Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@afipsdk/afip.js/src/Afip.js:139:17) at async ElectronicBilling.getWSInitialRequest (/Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@afipsdk/afip.js/src/Class/ElectronicBilling.js:367:27) at async ElectronicBilling.executeRequest (/Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@afipsdk/afip.js/src/Class/ElectronicBilling.js:345:25) at async ElectronicBilling.getLastVoucher (/Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@afipsdk/afip.js/src/Class/ElectronicBilling.js:66:11) at async FacturaService.getDatosFacturaB (/Users/mostrojuy/Proyectos/Propios/Afip Empresas/server/src/service/factura.service.ts:54:28) at async /Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@nestjs/core/router/router-execution-context.js:46:28 at async /Users/mostrojuy/Proyectos/Propios/Afip Empresas/node_modules/@nestjs/core/router/router-proxy.js:9:17

Espero puedan darme una mano.

jlopezjuy commented 3 months ago

Agregando console.logs a varios archivos pude ver lo siguiente:

data: { statusCode: 400, message: 'Debe autorizar el uso del web service. Revise el tutorial https://docs.afipsdk.com/paso-a-paso/web-services. ns1:coe.notAuthorized' }

Veo que tienen un metodo para autorizar: `const wsid = 'wsfe';

// Creamos una instancia de la libreria const afip = new Afip({ CUIT: taxId });

// Creamos la autorizacion (¡Paciencia! Esto toma unos cuantos segundos) const res = await afip.CreateWSAuth(username, password, alias, wsid); ` para este caso de facturacion electronica como seria el codigo? para pasar a proeduccion habria que repetir la autorizacion ?

jlopezjuy commented 3 months ago

Bueno alfinal era el problema de habilitar el WS. cierro issue.