Primeiro XML e exemplos completos
Este fluxo faz somente geração local com documento sintético de HOMOLOGAÇÃO. Não exige A1 para gerar XML e não contacta a SEFAZ. Execute após instalar o pacote e verificar o runtime.
Arquivos executáveis
Copie a pasta examples desta documentação para seu projeto consumidor e mantenha o vendor/autoload.php na raiz do projeto. Alternativamente, a variável ACBR_PHP_AUTOLOAD pode apontar ao autoload absoluto já instalado.
export ACBR_RUNTIME_DIR=/opt/minha-aplicacao/acbr-runtime-0.2.1
php examples/gerar-xml.php
php examples/help.php 'Ide.tpNF'
php examples/help.php 'TTipoNFe'
php examples/help.php 'Det[].Prod.vProd'
php examples/modelos.php
php examples/operacoes-mock.php
php examples/recuperar-xml-mock.php
php examples/recuperacao-mock.phpO exemplo de geração usa documento-sintetico.json, derivado da fixture de testes versionada. Seu CNPJ/CPF, nomes, endereço e produto são dados de teste, sem valor fiscal, e não devem ser transmitidos. O exemplo não imprime XML em logs; mostra somente estado e tamanho. O XML retorna por acesso explícito a FiscalResult::xml().
Fluxo mínimo equivalente
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use Acbr\AcbrException;
use Acbr\Configuration;
use Acbr\Document;
use Acbr\Emitter;
use Acbr\Model\ValidationException;
$json = file_get_contents(__DIR__ . '/examples/documento-sintetico.json');
if ($json === false) {
throw new RuntimeException('Fixture sintética não encontrada.');
}
$documento = Document::fromJson($json);
$emissor = new Emitter(
new Configuration('11222333000181', 'CE', modelo: 55, ambiente: 2),
timeoutMs: 10000,
);
try {
$resultado = $emissor->gerarXml($documento);
if (!$resultado->sucesso()) {
echo json_encode($resultado, JSON_THROW_ON_ERROR), PHP_EOL;
} else {
$xml = $resultado->xml(); // dado explícito: trate como sensível
echo 'XML sintético gerado; bytes: ', strlen($xml ?? ''), PHP_EOL;
}
} catch (ValidationException $erro) {
echo json_encode($erro, JSON_THROW_ON_ERROR), PHP_EOL;
} catch (AcbrException $erro) {
echo json_encode($erro, JSON_THROW_ON_ERROR), PHP_EOL;
} finally {
$emissor->fechar();
}Document::fromJson() já valida a estrutura e pode lançar antes da criação do emissor; em uma aplicação, inclua a construção do documento no tratamento de entrada apropriado. O exemplo executável agrupa as etapas e devolve exit code não zero em falha.
O que o sucesso comprova
XML_GERADO, sucesso() === true e statusEnvio() === 'nao_enviado' confirmam uma operação local, não autorização fiscal. O XML gerado ainda não tem necessariamente assinatura. validar($xml) aciona validação nativa/schema, que pode recusar um XML sem assinatura; isso é esperado quando o schema exige XMLDSig.
O fluxo offline completo é gerar → assinar com A1 sintético → validar. Consulte assinar-offline.php e configuração A1. O certificado sintético pode provar o funcionamento criptográfico local, mas não confiança ICP-Brasil, revogação ou validade fiscal.
Outros exemplos
| Arquivo | Objetivo | Precisa do worker? | Rede fiscal? |
|---|---|---|---|
| bootstrap.php | Carregamento e saída segura dos exemplos | Não | Não |
| gerar-xml.php | Documento, geração nativa e resultado | Sim | Não |
| help.php | Ajuda de campos e tipos, JSON offline | Não | Não |
| modelos.php | Imutabilidade e modelos gerados | Não | Não |
| assinar-offline.php | Gerar, assinar e validar A1 sintético | Sim | Não |
| operacoes-mock.php | Oito métodos com Engine de teste | Não | Não |
| recuperar-xml-mock.php | recuperarXml e retorno original simulados | Não | Não |
| recuperacao-mock.php | Timeout incerto e consulta pela aplicação | Não | Não |
| async-offline.php | Fila CLI com geração e validação locais | Sim | Não |
Os mocks exercitam assinaturas e tratamento de resultados; não atestam comportamento da SEFAZ. Não troque o motor simulado por um motor real para executar os mesmos dados fictícios em operações de rede.