CreatePDF

naqzher
naqzher

Tengo un problema al querer crear el pdf post "actualizacion" donde se me pide el access_token obligatorio, ahora lo coloque y no me da problemas por ese tema, lo obtuve en https://app.afipsdk.com, y todo bien, me genera la factura en modo desarrollo, pero no me genera el pdf.

Este es mi error: local.ERROR: El token proporcionado es invalido. {"exception":"[object] (Exception(code: 0): El token proporcionado es invalido. at /var/www/html/app/vendor/afipsdk/afip.php/src/Class/ElectronicBilling.php:63) [stacktrace] #0 /var/www/html/app/app/Adapters/AFIPAdapter.php(57): ElectronicBilling->CreatePDF()

Mi consulta es:

  • Si anda bien para la creacion de la factura, xq me falla para este metodo?
  • Esto tambien me va fallar en prod?

Tome de ejemplo de la documentacion, aunque ya andaba antes del access token obligatorio, ahora no me anda. Gracias de antemano // Descargamos el HTML de ejemplo (ver mas arriba) // y lo guardamos como bill.html $html = file_get_contents('./bill.html');

// Nombre para el archivo (sin .pdf) $name = 'PDF de prueba';

// Opciones para el archivo $options = array( "width" => 8, // Ancho de pagina en pulgadas. Usar 3.1 para ticket "marginLeft" => 0.4, // Margen izquierdo en pulgadas. Usar 0.1 para ticket "marginRight" => 0.4, // Margen derecho en pulgadas. Usar 0.1 para ticket "marginTop" => 0.4, // Margen superior en pulgadas. Usar 0.1 para ticket "marginBottom" => 0.4 // Margen inferior en pulgadas. Usar 0.1 para ticket );

// Creamos el PDF $res = $afip->ElectronicBilling->CreatePDF(array( "html" => $html, "file_name" => $name, "options" => $options ));

// Mostramos la url del archivo creado var_dump($res['file']);

Ivan
Ivan

Como lo estas colocando? Si dice que es invalido es porque no esta siendo puesto correctamente, fijate de estar poniendolo bien cuando generas el PDF tambien

naqzher
naqzher

Hola, como estas? Probe en produccion, obviamente con los datos de prod, el unico cambio en el entorno de desarrollo en el cuit que me sugieren para hacer pruebas y los cert y key de desarrollo. Resumiendo:

  • En prod anda la creacion del pdf
  • En dev anda la creacion de la factura
  • En dev la creacion del pdf no anda

El metodo es funcional, lo unico diferente en desa son el cert,la key y el cuit. Ambos entornos comparten el access token que ahora es obligatorio.

Si necesitan algun dato mas o algo mas detallado, quedo al pendiente. Saludos!

Ivan
Ivan

Ahora necesitas si o si el access_token para hacer el pdf, por lo cual ya no existe un "pdf en dev" por eso no entiendo de que modo estas intentando "crearlo en dev"

naqzher
naqzher

que me refiero pdf en dev

  • cuit que sugieren, segun la ia de documentacion
  • cert de desarrollo
  • key de desarrollo
  • access_token de https://app.afipsdk.com
  • production en false en prod:
  • cuit real
  • cert de prod
  • key de prod
  • access_token de https://app.afipsdk.com
  • production en true

mismos metodos, ambos facturan, pero solo en dev no crea el pdf, el metodo CreatePDF me dice que el token es invalido, cuando uso el mismo en ambos ambientes y vuelvo a remarcar que la factura si la crea.

Ivan
Ivan

Ma parece raro, la request es exactamente la misma, para el pdf en dev o prod. La unica razon para que diga que el token es invalido es que como access_token se este enviando un datol invalido (no el access_token)

naqzher
naqzher

mi codigo: <?php

namespace App\Adapters;

use Afip; use Exception;

class AFIPAdapter { protected $afip;

public function __construct()
{
    try {
        $certPath   = storage_path('app/certificates/'.config('afip.certificate_name').'.crt');
        $keyPath    = storage_path('app/certificates/'.config('afip.certificate_name').'.key');
        $cuit       = config('voucher.buisness_cuit');

        $this->afip = new Afip([
            'CUIT'          => $cuit,
            'cert'          => file_get_contents($certPath),
            'key'           => file_get_contents($keyPath),
            'production'    => config('afip.production'),
            'access_token'  => config('afip.access_token'),
        ]);
    } catch (Exception $e) {
        \Log::error("Error al inicializar el adaptador de AFIP: " . $e->getMessage());
        throw new Exception("Error al inicializar el adaptador de AFIP.");
    }
}
public function createPDF(string $html, int $voucherNumber)
{
    $options = [
        "width" => 8,
        "marginLeft" => 0.4,
        "marginRight" => 0.4,
        "marginTop" => 0.4,
        "marginBottom" => 0.4
    ];

    return $this->afip->ElectronicBilling->CreatePDF([
        "html" => $html,
        "file_name" => 'Factura_' . $voucherNumber,
        "options" => $options
    ]);
}

solo te muestro como lo instancio y el metodo del create pdf, vuelvo aclarar que en produccion por temor que no andara tambien, hice una prueba y anduvo todo correctamente. a menos que el acces_token no deba ser igual que el que uso en prod, perdon las molestias. salugos y gracias!

Ivan
Ivan

Despues de obtener error ejecuta:

echo $afip->options['access_token'];

Para ver si efectivamente tiene el access_token

naqzher
naqzher

public function createPDF(string $html, int $voucherNumber) { // Obtener access token ANTES $accessTokenBefore = $this->afip->options['access_token']; Log::info("Access token antes de CreatePDF: " . $accessTokenBefore);

    $options = [
        "width" => 8,
        "marginLeft" => 0.4,
        "marginRight" => 0.4,
        "marginTop" => 0.4,
        "marginBottom" => 0.4
    ];

    $result = $this->afip->ElectronicBilling->CreatePDF([
        "html" => $html,
        "file_name" => 'Factura_' . $voucherNumber,
        "options" => $options
    ]);

    // Obtener access token DESPUÉS
    $accessTokenAfter = $this->afip->options['access_token'];
    Log::info("Access token después de CreatePDF: " . $accessTokenAfter);

    return $result;
}

me mostro las 2 veces y anduvo, sinceramente no se que pudo haber pasado, pero estaria andando correctamente en ambos entornos. mil gracias y disculpa las molestias!