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 (
usuarioysecret)
Instalacion:
composer require bluetech/bluetech-sdk-php guzzlehttp/guzzle guzzlehttp/psr7
Flujo recomendado
- Configurar
baseUrldel ambiente CFE. - Autenticar con
loginAndSetToken. - Construir
EmitComprobanteRequest. - Llamar
comprobantes()->emitir(...). - Persistir
_Id,Serie,NroyCodRespuestapara 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
- Endpoint REST:
POST /api/v1/comprobante/emitir - Endpoint auth login:
POST /api/auth/login - Guia relacionada: Cómo emitir un eTicket a crédito sin receptor
- Catalogo de SDKs disponibles: /sdks