PHP code example of invoka / sdk

1. Go to this page and download the library: Download invoka/sdk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

invoka / sdk example snippets


$invoka = new Invoka\Sdk\Invoka('API_…');           // ambiente 1 (pruebas) por defecto

$r = $invoka->facturas->emitir([...]);
$final = $invoka->comprobantes->esperar($r->claveAcceso());
if ($final->autorizado()) {
    $invoka->comprobantes->pdf($r->claveAcceso())->guardar('/var/facturas');
}

use Invoka\Sdk\Invoka;

$invoka = new Invoka(getenv('INVOKA_API_KEY'), [
    // Datos fijos de su empresa: se completan en cada comprobante (lo que mande en el comprobante manda).
    'emisor' => [
        'ruc' => '0991234567001',
        'razon_social' => 'MI EMPRESA S.A.',     // obligatoria en la factura
        'nombre_comercial' => 'MI EMPRESA',
        'direccion_matriz' => 'Av. Principal 123, Guayaquil',
        'direccion_establecimiento' => 'Av. Principal 123, Guayaquil',
        'obligado_contabilidad' => 'NO',
        'codigo_establecimiento' => '001',
        'codigo_puntoemision' => '001',
    ],
]);

$saldo = $invoka->creditos->saldo();   // también comprueba que la API key vale
echo $saldo['creditos_disponibles'];

$factura = [
    'emisor' => ['secuencial' => '125'],
    'comprador' => [
        'tipo_identificacion' => '05',          // 04 RUC · 05 cédula · 06 pasaporte · 07 consumidor final
        'identificacion' => '0912345678',
        'razon_social' => 'JUAN PÉREZ',
        'direccion' => 'Guayaquil',
        'correo' => '[email protected]',
    ],
    'items' => [[
        'codigo_principal' => 'P001',
        'descripcion' => 'Servicio de desarrollo',
        'cantidad' => 1,
        'precio_unitario' => 100,
        'descuento' => 0,
        'tipoproducto' => 2,                    // 1 bien · 2 servicio
        'tipo_iva' => 4,                        // tabla 17 del SRI: 0 → 0 %, 4 → 15 %, 5 → 5 %, 6 no objeto, 7 exento
    ]],
    'pagos' => [['tipo' => 20, 'total' => 115]],
    'informacion_adicional' => [['nombre' => 'Pedido', 'detalle' => 'WEB-1001']], // máx. 14 campos
];

$clave = $invoka->facturas->claveAcceso($factura);   // la clave que tendrá, ANTES de emitir
$r = $invoka->facturas->emitir($factura);
// $r['claveacceso'], $r['id_comprobante'], $r['estado'] === 'En procesamiento'

$invoka->retenciones->emitir([             // 2.0 (ATS): lleva `sustento`
    'emisor' => ['secuencial' => '1'],
    'proveedor' => ['tipo_identificacion' => '04', 'identificacion' => '0992345678001',
                    'razon_social' => 'PROVEEDOR S.A.', 'direccion' => 'Guayaquil'],
    'sustento' => [
        'codigo_sustento_tributario' => '01',
        'codigo_documento_sustento' => '01',
        'numero_documento_sustento' => '001001000000123',
        'numero_autorizacion' => '…',
        'fecha_documento_sustento' => '2026/10/01',
        'gastos' => [['descripcion' => 'Servicios', 'subtotal_iva' => 100, 'subtotal_siniva' => 0,
                      'subtotal_ivacero' => 0, 'tipo_iva' => 4]],
    ],
    'retenciones' => [
        ['codigoimpuesto' => 1, 'codigo_retencion' => '303', 'base_imponible' => 100, 'porcentaje_retencion' => 10],
        ['codigoimpuesto' => 2, 'codigo_retencion' => '10', 'base_imponible' => 15, 'porcentaje_retencion' => 30],
    ],
]);

use Invoka\Sdk\ClaveAcceso;

ClaveAcceso::calcular('01', '0991234567001', 1, '001', '001', 125);   // hoy
ClaveAcceso::esValida($clave);                                        // módulo 11
ClaveAcceso::descomponer($clave);   // fecha, tipo, ruc, ambiente, establecimiento, numero…

$c = $invoka->comprobantes->consultar($clave);
$c->autorizado();          // true si el SRI lo autorizó
$c->requiereCorreccion();  // true si terminó con error: corrija y emita de nuevo
$c['estado_texto'];        // "Autorizado", "Devuelto por el SRI…", "Firma electronica invalida o caducada"…
$c['errores'];             // detalle del SRI cuando no se autorizó
$c['xml'], $c['pdf'];      // URLs temporales (24 h) cuando está autorizado

$final = $invoka->comprobantes->esperar($clave, tiempoMaximo: 120, intervalo: 5);

$pdf = $invoka->comprobantes->pdf($clave);    // Invoka\Sdk\Archivo
$pdf->guardar('/var/facturas');               // usa $pdf->nombre si es un directorio
return response($pdf->contenido, 200, ['Content-Type' => $pdf->tipo]);

$xml = $invoka->comprobantes->xml($clave);    // XML autorizado

$invoka->comprobantes->reprocesar($clave);    // tras corregir algo en el SRI (establecimiento, firma…)

$invoka->sri->ruc('0991234567001');               // data: razón social, estado, actividad…
$invoka->sri->cedula('0912345678');               // Registro Civil
$invoka->sri->consultar('0912345678');            // detecta cédula (10) o RUC (13)
$invoka->sri->establecimientos('0991234567001');  // establecimientos, total_establecimientos
$invoka->sri->razonSocial('FARMACIAS', limite: 10);

$s = $invoka->creditos->saldo();
$s['creditos_disponibles'];   // de la CUENTA, compartidos por todas sus empresas
$s['estado_saldo'];           // suficiente · bajo (≤ 10) · agotado
$s->get('cartera_consultas.total_consultas_disponibles');

$invoka->creditos->historial(['limit' => 50, 'page' => 1, 'tipo' => 'consumo', 'ambiente' => 2, 'ruc' => '…']);
foreach ($invoka->creditos->todoElHistorial(['tipo' => 'recarga']) as $movimiento) { … }

$invoka->empresa->crear(['ruc' => '0991234567001', 'razon_social' => 'MI EMPRESA S.A.', 'regimen_rimpe' => true]);
$invoka->empresa->editar(['ruc' => '0991234567001', 'contribuyente_especial' => '5368']);
$invoka->empresa->subirFirma('0991234567001', '/ruta/firma.p12', 'clave-del-p12');  // ruta o contenido
$invoka->empresa->subirLogo('0991234567001', '/ruta/logo.png');                     // PNG/JPG, máx. 2 MB

$w = $invoka->webhook->guardar('https://su-dominio.com/invoka/webhook');
$secret = $w['secret'];                 // ÚNICA vez que llega completo: guárdelo
$invoka->webhook->ver();                // configuración + últimas 10 entregas (secret enmascarado ••••••••XXXX)
$invoka->webhook->probar();             // manda un aviso «webhook.prueba»
$invoka->webhook->eliminar();

use Invoka\Sdk\Webhook;
use Invoka\Sdk\Excepciones\FirmaWebhookInvalida;

Route::post('/invoka/webhook', function (Request $request) {
    try {
        $aviso = Webhook::verificar($request->getContent(), $request->headers->all(), config('services.invoka.webhook_secret'));
    } catch (FirmaWebhookInvalida) {
        abort(400);
    }
    // $aviso['evento'], $aviso['datos']['claveacceso'], $aviso['datos']['autorizado']…
    return response()->noContent();
});

$aviso = Webhook::verificar(file_get_contents('php://input'), $_SERVER, getenv('INVOKA_WEBHOOK_SECRET'));

$v = $invoka->invokaId->crear(['tipo' => 'completa', 'cedula_esperada' => '0912345678']);
// envíe a la persona a $v['url_verificacion']; luego:
$invoka->invokaId->consultar($v['id']);
$invoka->invokaId->listar();
$invoka->invokaId->verificarDirecto(['selfie' => $base64, 'cedula_frontal' => $base64]);

try {
    $invoka->facturas->emitir($factura);
} catch (Validacion $e) {
    foreach ($e->getErrores() as $motivo) { echo $motivo, PHP_EOL; }   // en español, listos para mostrar
} catch (ComprobanteDuplicado $e) {
    $invoka->comprobantes->consultar($e->getClaveAcceso());
} catch (SaldoInsuficiente $e) {
    // recargue créditos en el panel
} catch (InvokaException $e) {
    error_log($e->getCodigo() . ' ' . $e->getMessage() . ' ' . $e->getCuerpo());
}

new Invoka('API_…', [
    'ambiente' => 1,              // 1 pruebas (por defecto) · 2 PRODUCCIÓN (consume créditos)
    'emisor' => [...],            // datos del emisor que se completan en cada comprobante
    'base_url' => 'https://invoka.com.ec/api',   // vale también solo el dominio
    'timeout' => 60,              // segundos por petición
    'timeout_conexion' => 10,
    'reintentos' => 3,
    'espera_base' => 1,           // segundos
    'espera_maxima' => 30,
    'user_agent' => 'mi-app/2.0', // se antepone al del SDK
    'cabeceras' => [],            // cabeceras extra
    'http_client' => $guzzle,     // o 'handler' => HandlerStack: proxy, logs, pruebas
]);