SDKs
El SDK PHP de B2Brouter te permite integrar la facturación electrónica y los informes fiscales en tu aplicación PHP sin tener que gestionar solicitudes HTTP en bruto.
- Sin dependencias — PHP 7.4+ con extensiones estándar (cURL, JSON, mbstring)
- Reintentos automáticos — fallos de red gestionados con backoff exponencial
- Soporte de paginación — Iterator y Countable para conjuntos de resultados grandes
- Soporte completo de informes fiscales — Verifactu, TicketBAI, SDI, KSeF, ZATCA y más
Instalación
Sección titulada «Instalación»composer require b2brouter/b2brouter-phpInicio rápido
Sección titulada «Inicio rápido»<?php
require_once 'vendor/autoload.php';
use B2BRouter\B2BRouterClient;
$client = new B2BRouterClient('your-api-key');$accountId = 'your-account-id';
$invoice = $client->invoices->create($accountId, [ 'invoice' => [ 'number' => 'INV-2025-001', 'date' => '2025-01-15', 'due_date' => '2025-02-15', 'currency' => 'EUR', 'contact' => [ 'name' => 'Acme Corporation', 'tin_value' => 'ESB12345678', 'country' => 'ES', 'email' => 'billing@acme.com', ], 'invoice_lines_attributes' => [ [ 'description' => 'Servicios profesionales', 'quantity' => 10, 'price' => 100.00, 'taxes_attributes' => [ ['name' => 'IVA', 'category' => 'S', 'percent' => 21.0] ] ] ] ]]);
echo "Factura creada: {$invoice['id']}\n";Configuración
Sección titulada «Configuración»$client = new B2BRouterClient('your-api-key', [ // 'api_base' => 'https://api.b2brouter.net', // Sandbox y Producción (predeterminado) // 'api_base' => 'https://api-staging.b2brouter.net', // Staging 'api_version' => '2026-04-20', 'timeout' => 80, 'max_retries' => 3,]);El SDK usa https://api.b2brouter.net por defecto. Usa una clave test_ para sandbox o una clave de producción para producción. Establece api_base en https://api-staging.b2brouter.net solo si necesitas el entorno de staging.
Identificar tu aplicación
Sección titulada «Identificar tu aplicación»Los integradores y plugins pueden añadir su identidad a la cabecera User-Agent:
$client = new B2BRouterClient('your-api-key', [ 'app_info' => [ 'name' => 'MyApp', // obligatorio 'version' => '1.0.0', // opcional 'url' => 'https://myapp.com', // opcional ],]);Facturas
Sección titulada «Facturas»$invoice = $client->invoices->create($accountId, [ 'invoice' => [ 'number' => 'INV-2025-001', 'date' => '2025-01-15', 'currency' => 'EUR', 'contact' => [ 'name' => 'Nombre del cliente', 'tin_value' => 'ESB12345678', 'country' => 'ES', ], 'invoice_lines_attributes' => [ [ 'description' => 'Servicio', 'quantity' => 1, 'price' => 1000.00, 'taxes_attributes' => [ ['name' => 'IVA', 'category' => 'S', 'percent' => 21.0] ] ] ] ], 'send_after_import' => false,]);Recuperar, actualizar, eliminar
Sección titulada «Recuperar, actualizar, eliminar»$invoice = $client->invoices->retrieve($invoiceId);
$invoice = $client->invoices->update($invoiceId, [ 'invoice' => ['extra_info' => 'Condiciones de pago: 30 días neto']]);
$client->invoices->delete($invoiceId);Listar con paginación
Sección titulada «Listar con paginación»$invoices = $client->invoices->all($accountId, [ 'limit' => 25, 'offset' => 0, 'date_from' => '2025-01-01', 'date_to' => '2025-12-31',]);
foreach ($invoices as $invoice) { echo "{$invoice['number']}: €{$invoice['total']}\n";}
echo "Total: {$invoices->getTotal()}, hay más: " . ($invoices->hasMore() ? 'sí' : 'no') . "\n";Descargar
Sección titulada «Descargar»$pdf = $client->invoices->downloadPdf($invoiceId);file_put_contents('invoice.pdf', $pdf);$xml = $client->invoices->downloadAs($invoiceId, 'xml.facturae.3.2.2');$xml = $client->invoices->downloadAs($invoiceId, 'xml.ubl.invoice.bis3');Enviar y confirmar recepción
Sección titulada «Enviar y confirmar recepción»$client->invoices->send($invoiceId);
$client->invoices->acknowledge($invoiceId, ['ack' => true]);Cuentas y contactos
Sección titulada «Cuentas y contactos»$accounts = $client->accounts->all(['limit' => 25]);$account = $client->accounts->retrieve($accountId);$account = $client->accounts->create(['account' => [/* ... */]]);$account = $client->accounts->update($accountId, ['account' => [/* ... */]]);$client->accounts->delete($accountId);$client->accounts->unarchive($accountId);$contacts = $client->contacts->all($accountId, ['limit' => 25]);$contact = $client->contacts->create($accountId, ['contact' => [/* ... */]]);$contact = $client->contacts->update($contactId, ['contact' => [/* ... */]]);$client->contacts->delete($contactId);Informes fiscales
Sección titulada «Informes fiscales»Los informes fiscales se generan automáticamente cuando envías facturas, siempre que hayas configurado TaxReportSettings para la cuenta. Consulta Configuración de informes fiscales para las instrucciones de configuración.
Configurar ajustes
Sección titulada «Configurar ajustes»$client->taxReportSettings->create($accountId, [ 'tax_report_setting' => [ 'code' => 'verifactu', 'start_date' => '2025-01-01', 'auto_generate' => true, 'auto_send' => true, ]]);Recuperar y descargar
Sección titulada «Recuperar y descargar»$taxReportId = $invoice['tax_report_ids'][0];$taxReport = $client->taxReports->retrieve($taxReportId);
echo "Estado: {$taxReport['state']}\n";
if (!empty($taxReport['qr'])) { file_put_contents('qr.png', base64_decode($taxReport['qr']));}
$xml = $client->taxReports->download($taxReportId);Corrección y anulación
Sección titulada «Corrección y anulación»$client->taxReports->update($taxReportId, [ 'tax_report' => ['tax_inclusive_amount' => 133.1, /* ... */]]);$client->taxReports->delete($taxReportId);Estados
Sección titulada «Estados»| Estado | Significado |
|---|---|
processing | Encadenamiento y envío en curso |
registered | Aceptado por la autoridad fiscal |
registered_with_errors | Enviado con advertencias |
error | Envío fallido |
annulled | Cancelado |
Gestión de errores
Sección titulada «Gestión de errores»use B2BRouter\Exception\ApiErrorException;use B2BRouter\Exception\AuthenticationException;use B2BRouter\Exception\PermissionException;use B2BRouter\Exception\ResourceNotFoundException;use B2BRouter\Exception\InvalidRequestException;use B2BRouter\Exception\ApiConnectionException;
try { $invoice = $client->invoices->create($accountId, ['invoice' => [/* ... */]]);} catch (AuthenticationException $e) { // 401 — clave API no válida} catch (PermissionException $e) { // 403 — permisos insuficientes} catch (ResourceNotFoundException $e) { // 404} catch (InvalidRequestException $e) { // 400 / 422 — errores de validación $details = $e->getJsonBody();} catch (ApiConnectionException $e) { // error de red} catch (ApiErrorException $e) { // cualquier otro error de la API error_log("ID de solicitud: {$e->getRequestId()}");}Registra siempre el ID de solicitud cuando reportes problemas al soporte — identifica de forma única la solicitud fallida.