Correios Automático

Primeiros passos

Tudo o que um plugin precisa para conversar com o Correios Automático: detectar o plugin, registrar os ganchos no momento certo e seguir as convenções de nomes e de pedidos.

Correios Automático 1.14.0PRO 1.6.4REST infixs-correios-automatico/v1WP 6.0+ · PHP 7.4+ · HPOSGuia de instalaçãoPlugin no WordPress.orgCorreios Automático PRO
Primeiros passos

Detectar o plugin e a versão

O plugin grátis define a constante INFIXS_CORREIOS_AUTOMATICO_PLUGIN_VERSION (na 1.14.0, '1.14.0') ao ser carregado, e o PRO define INFIXS_CORREIOS_AUTOMATICO_PRO_PLUGIN_VERSION ('1.6.2'). A função infixs_correios_automatico() devolve o contêiner de serviços do grátis. Teste as constantes no plugins_loaded com prioridade 20: o PRO inicia nesse gancho com prioridade 11, então nesse ponto os dois já estão prontos.

add_action( 'plugins_loaded', 'meu_plugin_integrar_correios', 20 );

function meu_plugin_integrar_correios() {
	if ( ! defined( 'INFIXS_CORREIOS_AUTOMATICO_PLUGIN_VERSION' ) || ! function_exists( 'wc_get_order' ) ) {
		return; // Correios Automático ou WooCommerce inativo: nada a registrar.
	}

	if ( version_compare( INFIXS_CORREIOS_AUTOMATICO_PLUGIN_VERSION, '1.11.0', '<' ) ) {
		return; // A NF-e do pedido na pré-postagem chegou na 1.11.0.
	}

	$tem_pro = defined( 'INFIXS_CORREIOS_AUTOMATICO_PRO_PLUGIN_VERSION' );

	add_filter( 'infixs_correios_automatico_order_invoice', 'meu_plugin_nfe_do_pedido', 10, 3 );

	if ( $tem_pro ) {
		add_filter( 'infixs_correios_automatico_auto_prepost_wait_invoice', 'meu_plugin_esperar_nfe', 10, 3 );
	}
}

Para saber se um recurso existe, independentemente do número da versão, teste a classe ou o método que o oferece:

RecursoComo detectarDesde
NF-e do pedido na pré-postagemclass_exists( '\Infixs\CorreiosAutomatico\Services\OrderInvoiceResolver' )Grátis 1.11.0
Status da NF-e na lista de pedidosversion_compare( INFIXS_CORREIOS_AUTOMATICO_PLUGIN_VERSION, '1.12.0', '>=' )Grátis 1.12.0
DANFE simplificada na etiquetamethod_exists( '\Infixs\CorreiosAutomatico\Services\OrderDanfeResolver', 'resolve' ) e a constante OrderDanfeResolver::SCHEMA (hoje 1)Grátis 1.12.0
Página que imprime só a DANFEmethod_exists( '\Infixs\CorreiosAutomatico\Core\Admin\PrintUrl', 'orders' )Grátis 1.12.0
Documento fiscal da logística reversa e pendências próprias na listaversion_compare( INFIXS_CORREIOS_AUTOMATICO_PLUGIN_VERSION, '1.14.0', '>=' )Grátis 1.14.0
Pré-postagem automática que espera a NF-eclass_exists( '\Infixs\CorreiosAutomaticoPro\Services\AutoPrepostInvoice' )PRO 1.3.0
Armazém Correios LOG+\Infixs\CorreiosAutomaticoPro\Integrations\LogPlus\LogPlusIntegration::isSupported() (PRO 1.6.0+ com o grátis 1.14.0+)PRO 1.6.0
Mensagem própria para o XML recusado no LOG+version_compare( INFIXS_CORREIOS_AUTOMATICO_PRO_PLUGIN_VERSION, '1.6.2', '>=' )PRO 1.6.2
Aviso de nota pronta que adianta o XML do LOG+method_exists( '\Infixs\CorreiosAutomaticoPro\Integrations\LogPlus\Invoice\LogPlusInvoiceXml', 'onInvoiceReady' )PRO 1.6.2

Requisitos declarados: grátis 1.14.0 com WordPress 6.0+, PHP 7.4+ e WooCommerce 7.7+; PRO 1.6.2 com WooCommerce 8.0+ e o grátis 1.14.0. Os dois declaram compatibilidade com o HPOS (tabelas de pedidos do WooCommerce).

Quando registrar os ganchos

  • O grátis liga os serviços enquanto o arquivo dele é incluído e dispara infixs_correios_automatico_plugin_loaded nesse momento, antes do plugins_loaded. Como o WordPress carrega os plugins em ordem alfabética, use o plugins_loaded como ponto de entrada: ele sempre chega depois.
  • O PRO inicia no plugins_loaded com prioridade 11 e dispara infixs_correios_automatico_pro_plugin_loaded logo no começo, antes de conferir o grátis. Com o grátis ausente ou anterior à 1.8.4, ele para ali, sem registrar nada; por isso, para saber se um recurso do PRO está ligado, teste a classe ou o isSupported() dele (tabela acima). Com o grátis compatível, o PRO registra os ouvintes de nota pronta e de falha em toda requisição (front, admin, REST e cron).
  • Registre os filtros de NF-e no plugins_loaded (prioridade 20) ou no init. O painel confere has_filter( 'infixs_correios_automatico_order_danfe' ) para mostrar as opções da DANFE, então registre esse filtro só quando o seu plugin tiver os dados da nota.

Convenções

ItemConvenção
GanchosComeçam com infixs_correios_automatico_. Os exclusivos do PRO geralmente seguem com pro_ (ex.: infixs_correios_automatico_pro_logplus_invoice_xml).
Rotas RESTNamespace infixs-correios-automatico/v1. As rotas do painel do PRO entram nesse namespace pelo gancho infixs_correios_automatico_register_routes. O namespace próprio do PRO, infixs-correios-automatico-pro/v1, guarda só a consulta interna da licença e fica fora desta referência.
MetadadosPedido: _infixs_correios_automatico_*; Correios LOG+ (PRO): _infixs_logplus_*.
Pedidos e HPOSLeia e grave metadados pelo objeto do pedido: $order->get_meta(), $order->update_meta_data() e $order->save(). Assim a integração funciona com posts e com as tabelas HPOS.
Volumesshipping_item_id é o id da linha de frete (WC_Order_Item_Shipping) de cada volume. 0 quer dizer o pedido inteiro.
Marketplacevendor_id é o vendedor que posta a remessa. 0 quer dizer a própria loja.
ValoresAs respostas do painel trazem dinheiro em centavos; na DANFE, total também é em centavos.
Chave de acessoSempre string com 44 dígitos (um número inteiro não comporta 44 dígitos).

Estabilidade

  • Ações, filtros e os metadados da NF-e são a interface pensada para integrações no mesmo WordPress. Os ganchos de NF-e trazem @since no docblock, e é por eles que integrações como SquidCore e Bling se conectam ao Correios Automático.
  • As rotas REST do namespace infixs-correios-automatico/v1 (as do grátis e as que o PRO acrescenta nele) atendem o painel do plugin e integrações de fora do WordPress. Todas pedem um usuário com a capacidade manage_woocommerce, salvo as exceções públicas listadas em API REST. O namespace próprio do PRO, infixs-correios-automatico-pro/v1, é interno e fica fora desta referência.
  • Licença do PRO: desde a 1.6.4, as automações, os filtros e as rotas do PRO só agem com a licença ativa, conferida no servidor da Infixs (\Infixs\CorreiosAutomaticoPro\Container::licenseService()->hasLicense()). Sem ela, os filtros do PRO devolvem o valor recebido, as automações não rodam e as rotas do PRO recusam o pedido com um erro de licença.
  • Ganchos marcados interno fazem a ponte entre o grátis e o PRO ou servem ao desenvolvimento do próprio plugin. Eles aparecem nesta página para referência e podem mudar entre versões.

Classes e serviços públicos

O contêiner \Infixs\CorreiosAutomatico\Container expõe os serviços do grátis por métodos estáticos. Os mais úteis para integrações:

Serviço ou classeO que ofereceDesde
Container::orderInvoiceResolver()->resolve( $order, $context )src/Container.php:325A NF-e que o plugin enxerga para o pedido (invoice_number, invoice_key, model, source, source_label) ou null. isWaiting( $order ) diz se a automática do PRO espera a nota.1.11.0
Container::orderDanfeResolver()->resolve( $order, $context )src/Container.php:335{ invoice, danfe, status } com status ready, pending, unavailable, invalid ou none.1.12.0
Container::orderInvoiceStatus()src/Container.php:345O status da NF-e mostrado no painel (resolve( $order, $context )).1.12.0
Container::trackingService()src/Container.php:255add( $order_id, $code, $send_email = false, $data = [] ) grava um código de rastreio; getShipmentCodes( $order_id ) lista só os objetos de ida (code, shipping_item_id, carrier); getReverseCodes( $order_id ) lista os de devolução.1.0.0 · getShipmentCodes 1.11.0
Container::shipmentContextResolver()->resolveShipmentContexts( $order_id, $context )src/Container.php:285Um contexto (shipping_item_id, vendor_id) por remessa: volume a volume ou vendedor a vendedor.1.11.0
Container::contractMode()->prepostError( $reverse = false )src/Container.php:151 · src/Prepaid/ContractMode.php:162WP_Error quando a loja ainda não pode pré-postar, null quando pode: auth_not_active (400, Contrato Próprio desligado), prepaid_not_connected (400, conta do Contrato pré-pago desconectada) ou prepaid_reconnect (401, conexão expirada ou revogada). Com $reverse = true no Contrato pré-pago, devolve sempre prepaid_reverse_not_supported (422), mesmo com a conta conectada. mode() devolve own ou prepaid.1.14.0
Container::prepostService()src/Container.php:265createPrepost(), createReversePrepost(), previewReverseFiscalDocument(), getReversePreposts( $order ) e getOrderPrepostErrors( $order ). Veja Pré-postar pelo seu código.1.0.0
Container::notificationService()->notify( $type, $level, $title, $message, $context, $dedupe_key )src/Container.php:389Cria um aviso na central de notificações do painel.1.8.0
\Infixs\CorreiosAutomatico\Utils\AccessKeysrc/Utils/AccessKey.php:67Métodos estáticos para a chave de 44 dígitos: normalize(), model(), isInvoice() (55), isDce() (99), number(), series(), issuerDocument(), checkDigit() e hasValidCheckDigit().1.11.0 · DV e emitente 1.12.0
\Infixs\CorreiosAutomatico\Core\Admin\PrintUrl::orders( $ids, $view )src/Core/Admin/PrintUrl.php:51URL da página de impressão no admin; PrintUrl::VIEW_DANFE imprime só a DANFE.1.12.0
DeliveryServiceCode::isReverseService( $service_code )src/Services/Correios/Enums/DeliveryServiceCode.php:499Diz se o código de serviço é de logística reversa.1.11.0
DceRejection::isIcmsTaxpayer( $motivo )src/Services/Correios/DceRejection.php:30Reconhece o cancelamento da DC-e por “Contribuinte de ICMS” (rejeição 812), sinal de que a remessa precisa da NF-e.1.14.0
MarketplaceRegistry::register( MarketplaceAdapter $adapter )src/Marketplace/MarketplaceRegistry.php:44Registra um adaptador de marketplace (estenda MarketplaceAdapter).1.10.0
OrderQuery::ORDER_ID_TOKEN e OrderQuery::usesOrdersTable()src/Utils/OrderQuery.php:44Marcador {order_id} e detecção do HPOS para as pendências próprias da lista.1.11.0 · pendências 1.14.0

DeliveryServiceCode fica em \Infixs\CorreiosAutomatico\Services\Correios\Enums, DceRejection em \Infixs\CorreiosAutomatico\Services\Correios, MarketplaceRegistry em \Infixs\CorreiosAutomatico\Marketplace e OrderQuery em \Infixs\CorreiosAutomatico\Utils.