Skip to content

Sender

Sender envia XML firmado a los Web Services SOAP del SRI y devuelve resultados tipados.

API principal

php
use MTZ\Toolkit\Sender\Config\SenderConfig;
use MTZ\Toolkit\Sender\Enums\Environment;
use MTZ\Toolkit\Sender\Sender;

$sender = new Sender(
    config: new SenderConfig(
        environment: Environment::Testing,
    ),
);

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

send() ejecuta dos pasos:

  1. validate($signedXml): recepcion del comprobante.
  2. authorize($accessKey): autorizacion, solo si la recepcion fue exitosa.

Ambientes

php
Environment::Testing;
Environment::Production;

Los WSDL usados por defecto son los endpoints oficiales de SRI para recepcion y autorizacion offline.

Configuracion

php
$config = new SenderConfig(
    environment: Environment::Testing,
    maxAttempts: 5,
    retryDelay: 1,
    sendDelay: 3,
    soapOptions: [
        'trace' => 0,
    ],
);
OpcionDefaultDescripcion
environmentTestingAmbiente SRI
maxAttempts5Intentos de autorizacion
retryDelay1Segundos entre intentos de autorizacion
sendDelay3Espera entre recepcion y autorizacion
soapOptions[]Opciones adicionales para SoapClient

Opciones SOAP base:

php
[
    'trace' => 1,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'user_agent' => 'MTZ/Toolkit',
    'connection_timeout' => 180,
    'exceptions' => true,
]

En produccion considera usar trace => 0 para reducir riesgo de exponer XML o respuestas SOAP en logs de depuracion.

Resultado de envio

php
if ($result->success) {
    $authorizedDocument = $result->authorizationResult?->authorizedDocument;
    $authorizedXml = $authorizedDocument?->xml;
}

if (! $result->success) {
    $error = $result->error;
}

SendResult::toArray() devuelve una estructura serializable con recepcion, autorizacion y error.

Usar pasos separados

php
$reception = $sender->validate($signedXml);

if ($reception->success) {
    $authorization = $sender->authorize($accessKey);
}

Validacion de clave

authorize() exige una clave de acceso numerica de 49 digitos. Si no cumple, lanza InvalidAccessKeyException.

Consulta de estado

queryStatus() consulta el estado actual de un comprobante en el Web Service de consulta (ConsultaComprobante), independiente del flujo de envio. Util para conciliacion y para detectar comprobantes anulados.

php
$consulta = $sender->queryStatus($accessKey);

$consulta->status;         // ConsultationStatus
$consulta->isAuthorized(); // true si esta AUTORIZADO
$consulta->isAnnulled();   // true si esta ANULADO
$consulta->documentType;   // tipoComprobante
$consulta->issuerRuc;      // rucEmisor
$consulta->authorizationDate;

Estados posibles: AUTORIZADO, NO AUTORIZADO, PENDIENTE DE ANULAR, ANULADO, y RECHAZADA cuando la clave esta fuera de rango o no existe.

Envio por lote

sendBatch() arma el XML <lote>, lo envia a recepcion y luego autoriza el lote por su clave. Limite: 50 comprobantes o 500 kB por lote.

php
$result = $sender->sendBatch($loteAccessKey, '1790012345001', [$signedXmlA, $signedXmlB]);

$result->success;                              // recibido y todos autorizados
$result->authorizationResult->authorizations; // resultado por comprobante (list<AuthorizationResult>)

La clave de lote se genera igual que la de un comprobante: usa el AccessKeyGenerator con la serie y secuencial del lote. Si el lote esta vacio o excede los limites, lanza BatchException.

Codigos de mensaje tipados

SriMessageCode convierte el identificador de cada mensaje SRI en un enum con clasificacion, para reaccionar por codigo en vez de texto.

php
foreach ($result->authorizationResult?->messages ?? [] as $message) {
    $code = $message->sriCode(); // ?SriMessageCode

    if ($code?->isProcessing()) {
        // codigo 70: esperar, no reenviar
    }

    if ($code?->isImpediment()) {
        // RUC/establecimiento clausurado, inactivo: resolver antes de reenviar
    }

    if ($code?->isRetryable()) {
        // corregir y reenviar con la misma clave
    }
}

Testing

Sender acepta SoapClientFactoryInterface y SleeperInterface, lo que permite reemplazar red y esperas en tests.

Publicado bajo licencia MIT.