Existe uma forma simples de automatizar a emissão de MDF-e em seu software desenvolvido em PHP utilizando o Componente da TecnoSpeed.
Para essa demonstração foi utilizado o XAMPP. Neste caso, para liberar o uso da classe COM, é necessário conter no arquivo de configuração, a seguinte extension:
[PHP_COM_DOTNET]
extension=php_com_dotnet.dll
No exemplo veremos uma página simples com HTML e PHP, onde, para comunicar entre os fontes PHP, foi utilizado requisições com Ajax.
Vamos lá...
Após ter instalado o Componente MDF-e, basta instanciar a classe do Componente no PHP, conforme exemplo:
<?php
$spdMDFe = new COM("MDFeX.spdMDFeX");
$spdMDFeDataSets = new COM ("spdMdfeDatasetX.spdMdfeDatasetX"); //Instancia .ocx spdMdfeDatasetX.
?>
Agora, após criar o objeto do Componente, é necessário configurar a Software House emissora, inserindo o CNPJ de contrato com a TecnoSpeed via parâmetro 'cnpjsoftwarehouse' (o segundo parâmetro 'tokensoftwarehouse' nesse momento pode ser passado em branco, pois, será implementado posteriormente):
$spdMDFe->ConfigurarSoftwareHouse('cnpjsoftwarehouse','tokensoftwarehouse');
Essas configurações podem ser realizadas pelo arquivo 'mdfeConfig.ini' ou diretamente sendo passados via fonte. Via arquivo .ini basta utilizar o seguinte método:
$spdMDFe -> LoadConfig ('C:\CaminhoArquivo\mdfeConfig.ini');
$spdMDFe->NomeCertificado = "";
Para a arquitetura de uma aplicação Web, é recomendado usar o caminho e
senha do certificado, pois assim basta que passe o arquivo .pfx e a senha.
$spdMDFe->CaminhoCertificado = "C:/CaminhodoCertificado\certificado.pfx";
$spdMDFe->SenhaCertificado = "senha123"
$spdMDFe->UF = "PR";
$spdMDFe->CNPJ = "29062609000177";
$spdMDFe->ArquivoServidoresHom = $DirArq."/nfeServidoresHom.ini";
$spdMDFe->ArquivoServidoresProd = $DirArq."/nfeServidoresProd.ini";
$spdMDFe->DiretorioEsquemas = $DirArq."/Esquemas";
$spdMDFe->DiretorioTemplates = $DirArq."/Templates";
$spdMDFe->DiretorioLog = $DirArq."/Log";
$spdMDFe->VersaoManual = "3.0";
$spdMDFe->ConexaoSegura = 1;
$spdMDFe->TimeOut = 60000;
$spdMDFe->Ambiente = 2;
$spdMDFe->MaxSizeLoteEnvio = 500;
$spdMDFe->DiretorioXmlDestinatario = $DirArq."\\XMLDestinatario";
$spdMDFe->DiretorioLogErro = $DirArq."\\LogErro";
$spdMDFe->DiretorioTemporario = "C:\\Windows\\Temp";
$spdMDFe->ModoOperacao = moNormal; \\moNormal, moContingencia
$spdMDFe->CaracteresRemoverAcentos="áéíóúàèìòùâêîôûäëïöüãõñçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÄËÏÖÜÃÕÑǺª";
Métodos utilizados no exemplo
Consulta de Status: Método utilizado para realizar a consulta de Status da UF configurada na propriedade $spdMDFe ->UF. Tem como retorno um XML com a resposta do Web Service da UF.
<?php include("instanciaComponenteMDFe.php");
try{
echo $spdMDFe -> StatusDoServicoMDFe();
}
catch(Exception $e)
{
echo $e;
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Gerar XML: Método do componente MDF-e para gerar o XML através da implementação do DataSets.
<?php include("instanciaComponenteMDFe.php");
$xml="";
try{
$spdMDFeDataSets -> MappingFileName = "C:\\Program Files\\TecnoSpeed\\MDFe\\Arquivos\\Esquemas\\3.00a\\Mapping.txt";
$spdMDFeDataSets -> CreateDatasets;
$spdMDFeDataSets -> ConfigSection = "XMLENVIO";
$spdMDFeDataSets -> IncludePart ('enviMDFe');
$spdMDFeDataSets -> Versao = "3.00";
$spdMDFeDataSets -> IdLote = "1";
$spdMDFeDataSets -> Include;
$spdMDFeDataSets->SetCampo("versao_2","3.00");
$spdMDFeDataSets->SetCampo("cUF_5","41");
$spdMDFeDataSets->SetCampo("tpAmb_6", "2");
$spdMDFeDataSets->SetCampo("tpEmit_7", "2");
$spdMDFeDataSets->SetCampo("mod_8", "58");
$spdMDFeDataSets->SetCampo("serie_9", "122");
$spdMDFeDataSets->SetCampo("nMDF_10", "123");
$spdMDFeDataSets->SetCampo("cMDF_11", "00000001");
$spdMDFeDataSets->SetCampo("cDV_12", "1");
$spdMDFeDataSets->SetCampo("modal_13", "1");
$spdMDFeDataSets->SetCampo("dhEmi_14",".$dhemissao");
$spdMDFeDataSets->SetCampo("tpEmis_15", "1");
$spdMDFeDataSets->SetCampo("procEmi_16", "0");
$spdMDFeDataSets->SetCampo("verProc_17", "1.0");
$spdMDFeDataSets->SetCampo("UFIni_18", "PR");
$spdMDFeDataSets->SetCampo("UFFim_19", "PR");
$spdMDFeDataSets->SetCampo("CNPJ_26", "08187168000160");
$spdMDFeDataSets->SetCampo("IE_27", "9044016688");
$spdMDFeDataSets->SetCampo("xNome_28", "Tecnospeed TI");
$spdMDFeDataSets->SetCampo("xFant_29", "Tecnospeed TI");
$spdMDFeDataSets->SetCampo("xLgr_31", "RUA CENTRAL");
$spdMDFeDataSets->SetCampo("nro_32", "123");
$spdMDFeDataSets->SetCampo("xCpl_33", "SALA 300");
$spdMDFeDataSets->SetCampo("xBairro_34", "CENTRO");
$spdMDFeDataSets->SetCampo("cMun_35", "4115200");
$spdMDFeDataSets->SetCampo("xMun_36", "MARINGA");
$spdMDFeDataSets->SetCampo("CEP_37", "87020050");
$spdMDFeDataSets->SetCampo("UF_38", "PR");
$spdMDFeDataSets->SetCampo("fone_39", "4499999999");
$spdMDFeDataSets->SetCampo("email_40", "endereco@provedor.com.br");
$spdMDFeDataSets->SetCampo("versaoModal_42", "3.00");
// $spdMDFeDataSets->SetCampo("qCTe_69", "2");
// $spdMDFeDataSets->SetCampo("qNFe_71", "");
$spdMDFeDataSets->SetCampo("vCarga_73", "3500.00");
$spdMDFeDataSets->SetCampo("cUnid_74", "02");
$spdMDFeDataSets->SetCampo("qCarga_75", "2.8000");
$spdMDFeDataSets->SetCampo("infAdFisco_79", "");
$spdMDFeDataSets->SetCampo("infCpl_80", "Empresa optante pelo Simples Nacional.; Caminhao VW.");
$spdMDFeDataSets->SavePart("enviMDFe");
$spdMDFeDataSets->IncludePart("infMunCarrega");
$spdMDFeDataSets->SetCampo("cMunCarrega_21", "4115200");
$spdMDFeDataSets->SetCampo("xMunCarrega_22", "MARINGA");
$spdMDFeDataSets->SavePart("infMunCarrega");
$spdMDFeDataSets->IncludePart("infMunCarrega");
$spdMDFeDataSets->SetCampo("cMunCarrega_21", "4106902 ");
$spdMDFeDataSets->SetCampo("xMunCarrega_22", "Curitiba");
$spdMDFeDataSets->SavePart("infMunCarrega");
$spdMDFeDataSets->IncludePart("infMunDescarga");
$spdMDFeDataSets->SetCampo("cMunDescarga_46", "1303908");
$spdMDFeDataSets->SetCampo("xMunDescarga_47", "SAO PAULO");
$spdMDFeDataSets->SavePart("infMunDescarga");
$spdMDFeDataSets->IncludePart("lacres");
$spdMDFeDataSets->SetCampo("nLacre_77", "123");
$spdMDFeDataSets->SavePart("lacres");
$spdMDFeDataSets->IncludePart("seg");
$spdMDFeDataSets->SetCampo("respSeg_153", "1");
$spdMDFeDataSets->SetCampo("xSeg_156", "PORTO SEGURO - CIA DE SEGUROS");
$spdMDFeDataSets->SetCampo("CNPJ_157", "61198164000160");
$spdMDFeDataSets->SetCampo("nApol_158", "06540713572");
$spdMDFeDataSets->SavePart("seg");
$spdMDFeDataSets->IncludePart("NAVER");
$spdMDFeDataSets->SetCampo("nAver_159", "73652309182");
$spdMDFeDataSets->SavePart("NAVER");
$spdMDFeDataSets.IncludePart("rodo");
//veictracao
$spdMDFeDataSets->SetCampo("cInt_rodo_5", "001");
$spdMDFeDataSets->SetCampo("placa_rodo_6", "ABC1234");
$spdMDFeDataSets->SetCampo("tara_rodo_7", "5000");
$spdMDFeDataSets->SetCampo("capKG_rodo_8", "4500");
$spdMDFeDataSets->SetCampo("capM3_rodo_9", "400");
$spdMDFeDataSets->SetCampo("RENAVAM_10", "123456789");
$spdMDFeDataSets->SetCampo("tpRod_rodo_34", "01");
$spdMDFeDataSets->SetCampo("tpCar_rodo_35", "02");
$spdMDFeDataSets->SetCampo("UF_rodo_36", "PR");
//Condutor
$spdMDFeDataSets->IncludePart("CONDUTOR");
$spdMDFeDataSets->SetCampo("xNome_rodo_13", "JOAO");
$spdMDFeDataSets->SetCampo("CPF_rodo_14", "06593697966");
$spdMDFeDataSets->SavePart("CONDUTOR");
//veicReboque
$spdMDFeDataSets->IncludePart("VEICREBOQUE");
$spdMDFeDataSets->SetCampo("cInt_rodo_16", "002");
$spdMDFeDataSets->SetCampo("placa_rodo_17", "XYZ4567");
$spdMDFeDataSets->SetCampo("tara_rodo_18", "4000");
$spdMDFeDataSets->SetCampo("capKG_rodo_19", "3000");
$spdMDFeDataSets->SetCampo("capM3_rodo_20", "300");
$spdMDFeDataSets->SetCampo("RENAVAM_21", "123456789");
$spdMDFeDataSets->SetCampo("tpCar_rodo_43", "02");
$spdMDFeDataSets->SetCampo("UF_rodo_44", "PR");
$spdMDFeDataSets->SavePart("VEICREBOQUE");
$spdMDFeDataSets->SavePart("rodo");
$spdMDFeDataSets->IncludePart("infNFe");
$spdMDFeDataSets->SetCampo("chNFe_58", "41230709237081000112550010000092121000092139");
$spdMDFeDataSets->SavePart("infNFe");
$xml = $spdMDFeDataSets->LoteMDFe;
}
catch(Exception $e)
{
echo $e;
}
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Assinar MDF-e: Método que tem como parâmetro o XML gerado pelo Data Set que retorna o XML assinado da NF-e para ser enviado.
Importante! Após o uso deste método, o XML não pode ser mais alterado.
<?php include("instanciaComponenteMDFe.php");
try{
$spdMDFe -> AssinarMDFe($xml_gerado);
}
catch(Exception $e) {
{
echo $e;
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Enviar MDF-e (Modo Síncrono): Método que realiza o envio e já retorna o resultado da autorização do MDF-e. (Alguns Web Services apresentam instabilidade no envio síncrono, dessa forma o mais aconselhado é usar o envio Assíncrono que veremos à seguir).
<?php include("instanciaComponenteMDFe.php");
try{
$spdMDFe -> EnviarMDFeSincrono($xml_assinado);
}
catch (Exception $e)
{
echo $e;
}
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Exemplo de retorno sincrono:
<retMDFe versao="3.00" xmlns="http://www.portalfiscal.inf.br/mdfe"><tpAmb>2</tpAmb><cUF>41</cUF><verAplic>RS20230314142148</verAplic><cStat>100</cStat><xMotivo>Autorizado o uso do MDF-e</xMotivo></retMDFe>
Enviar MDF-e (Modo Assíncrono): Método que tem como parâmetro o numero lote, o XML Assinado e se o lote é compactado ou não. Tem como retorno o status do processamento do lote e o número do recibo.
<?php include("instanciaComponenteMDFe.php");
try{
$spdMDFe -> EnviarMDFe("1",$xml_assinado);
}
catch (Exception $e)
{
echo $e;
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Consultar recibo do MDF-e: Método que tem como parâmetro a o recibo do MDF-e retornando o status do processamento.
<?php include("instanciaComponenteMDFe.php");
try{
$spdMDFe -> ConsultarReciboMDFe($recibo);
}
catch (Exception $e)
{
echo $e;
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Exemplo de retorno consulta recibo :
<retConsReciMDFe versao="3.00" xmlns="http://www.portalfiscal.inf.br/mdfe"><tpAmb>2</tpAmb><verAplic>RS20230517152856</verAplic><nRec>419000011824505</nRec><cStat>104</cStat><xMotivo>Arquivo processado</xMotivo><cUF>41</cUF><protMDFe versao="3.00"><infProt Id="MDFe280720231536138310"><tpAmb>2</tpAmb><verAplic>RS20230517152856</verAplic><chMDFe>41230708187168000160581220000001231000000017</chMDFe><dhRecbto>2023-07-28T15:36:13-03:00</dhRecbto><cStat>100</cStat><xMotivo>Autorizado o uso do MDF-e</xMotivo></infProt></protMDFe></retConsReciMDFe>
Exporta PDF MDF-e: Método que recebe como parâmetro XML Assinado ou XML Destinatário e numero de lote, além de outros parâmetros opcionais para converter o XML em PDF.
<?php include("instanciaComponenteMDFe.php");
try{
$xml_destinatario = $_REQUEST['xml'];
$spdMDFe -> ExportarMDFe($xml_destinatario,"",1,"");
}
catch(Exception $e)
{
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Cancelar MDF-e: Método que recebe parâmetros relacionados ao MDF-e autorizado e envia sua requisição de cancelamento, esse método possui retorno síncrono.
<?php include("instanciaComponenteMDFe.php");
try{
$xml = $spdMDFe ->CancelarMDFe("00000000000000000000000000000000000000000000","000000000000000","justificando o cancelamento doe MDFe","2023-00-00T00:00:00-00:00","1","-03:00");
}
catch (Exception $e)
{
echo $e;
}
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Exemplo de retorno do cancelamento:
<retEventoMDFe xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00"><infEvento><tpAmb>2</tpAmb><verAplic>RS20230314142038</verAplic><cOrgao>29</cOrgao><cStat>632</cStat><xMotivo>Rejeição: O autor do evento diverge do emissor do MDF-e</xMotivo></infEvento></retEventoMDFe>
Encerrar MDF-e: Método responsável por realizar o encerramento de um MDF-e já em situação de autorizado.
<?php include("instanciaComponenteMDFe.php");
try{
$spdMDFe -> EncerrarMDFe("00000000000000000000000000000000000000000000","000000000000000","2023-00-00T00:00:00-03:00","1","2020-00-00","41","000000","-03:00");
}
catch (Exception $e)
{
echo $e;
}
?>
unset($spdMDFe);\\Destroi a instancia da ocx MDFeX.dll
unset($spdMDFe);\\Destroi a instancia da ocx spdMdfeDatasetX.dll
?>
Exemplo retorno do encerramento:
<retEventoMDFe xmlns="http://www.portalfiscal.inf.br/mdfe" versao="3.00"><infEvento><tpAmb>2</tpAmb><verAplic>RS20230314142038</verAplic><cOrgao>41</cOrgao><cStat>213</cStat><xMotivo>Rejeição: CNPJ-Base do Emitente difere do CNPJ-Base do Certificado Digital</xMotivo></infEvento></retEventoMDFe>
Comentários
0 comentário
Por favor, entre para comentar.