Skip to content

Workflow completo

Este ejemplo junta las cuatro piezas del paquete: clave de acceso, XML, firma y envio.

php
<?php

use MTZ\Toolkit\AccessKeyGenerator\AccessKeyGenerator;
use MTZ\Toolkit\AccessKeyGenerator\Data\AccessKeyData;
use MTZ\Toolkit\AccessKeyGenerator\Enums\DocumentType;
use MTZ\Toolkit\AccessKeyGenerator\Enums\Environment as AccessKeyEnvironment;
use MTZ\Toolkit\Sender\Config\SenderConfig;
use MTZ\Toolkit\Sender\Enums\Environment as SenderEnvironment;
use MTZ\Toolkit\Sender\Sender;
use MTZ\Toolkit\Signer\Signer;
use MTZ\Toolkit\XMLMaker\Data\XmlGenerationData;
use MTZ\Toolkit\XMLMaker\Enums\XmlDocumentType;
use MTZ\Toolkit\XMLMaker\Enums\XmlEnvironment;
use MTZ\Toolkit\XMLMaker\XMLMaker;

$accessKey = (new AccessKeyGenerator())->generate(
    AccessKeyData::make(
        emissionDate: '2026-05-13',
        documentType: DocumentType::Invoice,
        ruc: '1790012345001',
        environment: AccessKeyEnvironment::Testing,
        sequential: 25,
        numericCode: '12345678',
        establishmentCode: '001',
        emissionPointCode: '001',
    ),
);

$generatedXml = (new XMLMaker())->generate(
    XmlGenerationData::make(
        documentType: XmlDocumentType::Invoice,
        environment: XmlEnvironment::Testing,
        accessKey: $accessKey,
        data: $invoicePayload,
    ),
);

$signedXml = (new Signer(
    certificatePath: '/secure/path/certificate.p12',
    certificatePassword: getenv('SRI_CERTIFICATE_PASSWORD') ?: '',
))
    ->loadXml($generatedXml->toString())
    ->sign();

$sender = new Sender(
    config: new SenderConfig(
        environment: SenderEnvironment::Testing,
        maxAttempts: 5,
        retryDelay: 1,
        sendDelay: 3,
    ),
);

$result = $sender->send($accessKey, $signedXml);

if (! $result->success) {
    throw new RuntimeException($result->error ?? 'No se pudo autorizar el comprobante.');
}

$authorizedXml = $result->authorizationResult?->authorizedDocument?->xml;

Usa el payload de Ejemplo de factura como $invoicePayload.

Manejo de errores

php
try {
    $result = $sender->send($accessKey, $signedXml);
} catch (Throwable $exception) {
    // Errores de validacion local, XML, certificado o argumentos invalidos.
    throw $exception;
}

if (! $result->success) {
    // Errores reportados por recepcion/autorizacion SRI o fallos SOAP controlados.
    $message = $result->error;
}

Persistencia recomendada

Guarda al menos:

  • Clave de acceso.
  • XML generado antes de firma.
  • XML firmado.
  • Estado de recepcion.
  • Estado de autorizacion.
  • XML autorizado devuelto por el SRI, si existe.
  • Fecha de autorizacion.

Evita persistir passwords de certificados o trazas SOAP completas.

Publicado bajo licencia MIT.