Emitir CFE con bluetech-sdk-php

Integracion paso a paso para autenticar, armar y emitir comprobantes CFE desde PHP con el SDK oficial.

Esta guia muestra como emitir un CFE usando bluetech-sdk-php contra POST /api/v1/comprobante/emitir.

Requisitos

  • PHP 7.4 o superior
  • Dependencias PSR (si usas Guzzle + HttpFactory, ya quedan cubiertas)
  • Credenciales de API (usuario y secret)

Instalacion:

composer require bluetech/bluetech-sdk-php guzzlehttp/guzzle guzzlehttp/psr7

Flujo recomendado

  1. Configurar baseUrl del ambiente CFE.
  2. Autenticar con loginAndSetToken.
  3. Construir EmitComprobanteRequest.
  4. Llamar comprobantes()->emitir(...).
  5. Persistir _Id, Serie, Nro y CodRespuesta para trazabilidad.

Ejemplo completo

<?php

use Bluetech\Sdk\Client;
use Bluetech\Sdk\Config;
use Bluetech\Sdk\Models\EmitComprobanteRequest;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Psr7\HttpFactory;

$httpClient = new GuzzleClient();
$httpFactory = new HttpFactory();

$config = new Config('https://cfetesting.bluetechsoftware.cloud/cfe');
$sdk = new Client($config, $httpClient, $httpFactory, $httpFactory);

// Obtiene token JWT y lo deja seteado en Config
$sdk->auth()->loginAndSetToken('usuario', 'secret');

$request = EmitComprobanteRequest::fromArray([
    'idEmpresa' => 10,
    'codComercio' => '001',
    'codTerminal' => 'T1',
    'uuid' => 'e98cb3fc-8c3f-43f3-a990-e8f6dbe2f8f4',
    'cfe' => [
        'idDoc' => [
            'tipoCfe' => 111,
            'fechaEmision' => '2026-02-12',
            'formaPago' => 1,
        ],
        // Desde 17/02/2026, emisor y totales pueden omitirse.
        'receptor' => [
            'idCliente' => 123,
        ],
        'detalles' => [
            [
                'numeroLineaDetalle' => 1,
                'indicadorFacturacion' => 3,
                'nombreItem' => 'Servicio mensual',
                'cantidad' => 1,
                'precioUnitario' => 122,
                'montoItem' => 122,
            ],
        ],
    ],
]);

$emitido = $sdk->comprobantes()->emitir($request);

echo 'CodRespuesta: ' . $emitido->CodRespuesta . PHP_EOL;
echo 'Comprobante: ' . $emitido->TipoCfe . '-' . $emitido->Serie . '-' . $emitido->Nro . PHP_EOL;
echo 'Id interno: ' . $emitido->_Id . PHP_EOL;

Campos clave del response

  • CodRespuesta: resultado de emision (ej. 00).
  • MensajeRespuesta: detalle del resultado.
  • _Id: identificador interno del comprobante emitido.
  • TipoCfe, Serie, Nro: identificacion fiscal del comprobante.
  • XmlFirmado: XML firmado retornado por la API.

Manejo de errores

El SDK lanza excepciones tipadas para respuestas no exitosas:

  • UnauthorizedException (401)
  • ForbiddenException (403)
  • NotFoundException (404)
  • ValidationException (400/422)
  • RateLimitException (429)
  • ServerException (5xx)

Referencias