mfe.png

1. Introdução

O MFE Bematech foi desenvolvido para atender a legislação fiscal do Ceará, utilizando o CF-e como documento legal. Nesse manual iremos abordar como integrar sua aplicação, de acordo com a especificação da SEFAZ do Ceará. Para comerçar, você deve ter o driver do MFE e o Integrador da SEFAZ. É através dele que é realizado o gerenciamento do equipamento, utilizando troca de arquivos ou pelo middleware de integração. Para obter o Integrador e as documentações da SEFAZ, acesse o link:

Neste link você encontrará o manual de utilização do Integrador, detalhando a sua instalação e configuração. Assim não abordaremos os detalhes da ferramenta, para focarmos mais na integração da aplicação. Para exemplificar a integração, utilizaremos um exemplo em Delphi XE.

tela.JPG

Realizado as etapas:

  1. Instalação do driver;

  2. Instalação e configuração do Integrador;

  3. MFE comunicando com a SEFAZ;

Já teremos o ambiente necessário para iniciarmos a integração.

Segundo o manual do Integrador na página 8, temos:

A comunicação com o integrador pode ser feita de duas formas:

  1. Troca de arquivos XML: Esta é a forma preferida de comunicação. Os serviços de integração com o Validador Fiscal de meios de pagamentos somente estarão disponíveis nesta forma de comunicação.

  2. Instânciamento de DLL/SO: Esta forma de comunicação é apresentada para compatibilidade das soluções atuais de AC/PDV com a forma de comunicação por chamada de funções no padrão Windows (DLL) ou Linux (SO).

— Manual de Utilização do Integrador - SEFAZ-CE

O formato que iremos abordar aqui será o de troca de arquivos XML.

2. Iniciando a Integração

2.1. Instalando o Driver Monitor

Instalando o driver, ele apresentará um ícone no canto inferior direito da tela, próximo ao relógio do Windows:

icon monitor mfe.jpg
Figura 1 - MFE Disponível
icon monitor mfe ind.jpg
Figura 2 - MFE Indisponível

Se estiver comunicando corretamente com o MFE, ele apresentará o ícone em branco e a tela com a mensagem Disponível:

monitor mfe disp.jpg
monitor mfe disp info.jpg

Feito isso ele estará pronto para uso.

2.2. Configurando o Integrador

Após instalado o Integrador ele apresentará esta tela:

integrador main.jpg

clique em CONFIGURAÇÕES para inserir as informações de acordo com os dados abaixo:

Dados Estabelecimento

CNPJ

30.146.465/0001-16

Inscrição Estadual

065911

integrador servidor.jpg

O Integrador deve sempre ser executado como administrador!

Dados Software House

CNPJ

98155757000159

Chave

G9yjAkxJ0I2E2idsWBAJ5peQEBZqtHytRUC +FLaSfd3+66QNxIBIDwQiRzUGPaU6fvErVDS fMUf8WpkwnPz36fCQnyLypqe/5mbox9pt3RC bbXcYqnR/4poYGr9M9Kymj4/PyX9GeiXwbgz OOHNIU5M/aAs0rulXz948bZla0eXABgEcp6m DkTzweLPZTbmOhX+eA==

integrador mfe 2.jpg

Nessa interface também é possível obter os arquivos XML de todos os comandos:

integrador mfe xml.jpg

Após instalado, o Integrador cria a seguinte estrutura de diretórios:

filesystem tree viewer new.png

Os diretórios de trabalho que iremos utilizar são a Input e a Output.

2.3. Pasta Input

É nesse diretório que serão inseridos os arquivos XML de envio para o MFE. A aplicação monta o arquivo com os dados e insere neste diretório.

2.4. Pasta Output

O Integrador utiliza o diretório Output para gravar o arquivo de retorno. Como ele é gerado com um nome aleatório, não é possível recuperá-lo por esse atributo. Visto que sua aplicação apagou qualquer arquivo do diretório Output, para recuperar o arquivo recém criado basta fazer uma varredura pela extensão XML.

Exemplo de um botão para consultar o MFE:

2.5. Principais Funções no Exemplo

2.5.1. Botão ConsultaSAT

Componentes Utilizados
Componente Nome

Form

FormExemploMFEDelphiXE

Button

ConsultaSAT

Edit

EditSessao

Edit

EditId

Memo

MemoXML*

*O componente Memo terá a propriedade visible como *false*, pois será usado somente para receber o XML e não aparecerá na tela.

Botão ConsultarSAT
procedure TFormExemploMFEDelphiXE.ConsultarSATClick(Sender: TObject);
var
mensagem : string;
begin
//Apaga conteúdo da pasta OUTPUT (1)
I := FindFirst('C:\Integrador\Output\*.*', faAnyFile, SR);
while I = 0 do
begin
  DeleteFile('C:\Integrador\Output\' + SR.Name);
  I := FindNext(SR);
end;
//---
EditSessao.Text := IntToStr(NumSessao); (2)
EditId.Text := IntToStr(NumIdentificador); (3)

  xmlIntegrador  := '<?xml version="1.0"  encoding="utf-8" ?>'+
                  '<Integrador>'+
                  '<Identificador>'+
                  '<Valor>'+EditId.Text+'</Valor>'+
                  '</Identificador>'+
                  '<Componente Nome="MF-e">'+
                  '<Metodo Nome="ConsultarMFe">'+
                  '<Parametros>'+
                  '<Parametro>'+
                  '<Nome>numeroSessao</Nome>'+
                  '<Valor>'+EditSessao.Text+'</Valor>'+
                  '</Parametro>'+
                  '</Parametros>'+
                  '</Metodo>'+
                  '</Componente>'+
                  '</Integrador>';
  arquivo := 'C:/Integrador/Input/consultarsat.xml'; (4)

//Se o arquivo consultarsat.xml já existir no C:/Integrador/Input/ ele é apagado (5)
if not FileExists(arquivo) then
  DeleteFile(arquivo);

AssignFile(f,arquivo);
Rewrite(f);
Writeln(f,xmlIntegrador);
CloseFile(f);

Sleep(3000); (6)
//Pega o retorno da venda na pasta OUTPUT (7)
try
begin
  if (FindFirst('C:\Integrador\Output\*.xml', faAnyFile, searchResult)) = 0 then
  repeat
    MemoXML.Clear;
    MemoXML.Lines.LoadFromFile('C:\Integrador\Output\'+searchResult.Name);

    //insere o arquivo de retorno em uma string
    retorno := MemoXML.Text;
    //Separa o retorno pelo delimitador pipe ("|") conforme descrito acima
    strSeparada := SplitString(retorno, '|');

    ShowMessage('Código de status:  '+strSeparada[1]+Char(10)+Char(13)+
                'Mensagem: '+strSeparada[2]);
  until FindNext(searchResult) <> 0; (8)
  FindClose(searchResult);
end;
except
  ShowMessage('Erro ao obter o retorno, verifique o arquivo da pasta C:/Integrador/Output'); (9)
end;
end;
Componentes Utilizados
1 Apagar a pasta Output: No caso de troca de arquivos, é boa prática sempre apagar o conteúdo do diretório que recebe o retorno, evitando assim que a aplicação capture um dado incorreto.
2 EditSessao: componente Edit para receber o número da sessão, item obrigatório no arquivo.
3 EditId: componente Edit para receber o código identificador, item obrigatório no arquivo.
4 String arquivo: neste exemplo o arquivo xml está inserido diretamente na string arquivo, concatenando o número de sessão e identificador nos respectivos campos.
5 Arquivo consultarsat.xml: Será criado um arquivo XML com o nome consultarsat.xml que será gravado dentro do diretório Input. Nesse ponto é verificado se já existe um arquivo com este nome na pasta, caso tenha será apagado para dar lugar ao que será gerado.
6 Sleep: Inserido um comando sleep de 3 segundos, para garantir que o retorno já estará disponível.
7 Retorno no Output: Aqui é realizado uma tratativa para obter-se o retorno que está na pasta Output.
8 Mensagem de retorno: Após obter-se o arquivo de retorno, uma mensagem (do tipo ShowMessage) aparecerá com o ocódigo de status e a mensagem.
9 Except: Na tratativa de exceção mostra-se uma mensagem apontando o problema ao obter o retorno.

2.5.2. Botão EnviarDadosVenda

Componentes Utilizados
Componente Nome

Form

FormExemploMFEDelphiXE

Button

EnviarDadosVenda

Edit

EditSessao

Edit

EditId

Memo

MemoXML*

ValueListEditor

ValueListEditor

*O componente Memo terá a propriedade visible como *false*, pois será usado somente para receber o XML e não aparecerá na tela.

//ENVIAR DADOS VENDA===========================================

procedure TFormExemploMFEDelphiXE.EnviarDadosVendaClick(Sender: TObject);
begin
//Apaga conteúdo da pasta OUTPUT
I := FindFirst('C:\Integrador\Output\*.*', faAnyFile, SR);
while I = 0 do
begin
  DeleteFile('C:\Integrador\Output\' + SR.Name);
  I := FindNext(SR);
end;
//---

EditSessao.Text := IntToStr(NumSessao);
EditId.Text := IntToStr(NumIdentificador);

envia := '<?xml version="1.0" encoding="utf-8" ?>'+
		'<Integrador>'+
		  '<Identificador>'+
			'<Valor>'+EditId.Text+'</Valor>'+
		  '</Identificador>'+
		  '<Componente Nome="MF-e">'+
			'<Metodo Nome="EnviarDadosVenda">'+
			  '<Parametros>'+
				'<Parametro>'+
				  '<Nome>numeroSessao</Nome>'+
				  '<Valor>'+EditSessao.Text+'</Valor>'+
				'</Parametro>'+
				'<Parametro>'+
				  '<Nome>codigoDeAtivacao</Nome>'+
				  '<Valor>'+EditCodAtivacao.Text+'</Valor>'+
				'</Parametro>'+
				'<Parametro>'+
				  '<Nome>dadosVenda</Nome>'+
				  '<Valor><![CDATA['+Memo1.Text+']]></Valor>'+
				'</Parametro>'+
				'<Parametro>'+
				  '<Nome>nrDocumento</Nome>'+
				  '<Valor>01</Valor>'+
				'</Parametro>'+
			  '</Parametros>'+
			'</Metodo>'+
		  '</Componente>'+
		'</Integrador>';

arquivo := 'C:/Integrador/Input/enviardadosvenda.xml';

if not FileExists(arquivo) then
  DeleteFile(arquivo);

AssignFile(f,arquivo);
Rewrite(f);
Writeln(f,envia);
CloseFile(f);
//Cria uma pasta no C: com o nome XML-MFE\xml-de-envio para guardar o arquivo
//EnviarDadosVenda.xml que foi enviado
dir := 'C:\XML-MFE\xml-de-envio';
if not DirectoryExists(dir) then
  ForceDirectories(dir);
  arquivo := 'C:\XML-MFE\xml-de-envio\enviardadosvenda.xml';

  if not FileExists(arquivo) then
    DeleteFile(arquivo);

  AssignFile(f,arquivo);
  Rewrite(f);
  Writeln(f,envia);
  CloseFile(f);
  ShowMessage('Arquivo XML de Venda enviado com sucesso, aguarde o retorno...');
  //Após enviado o xml da venda, aguardar 3 segundos para capturar o retorno da pasta Output
  Sleep(3000);

//Pega o retorno da venda na pasta OUTPUT
try
begin
  if (FindFirst('C:\Integrador\Output\*.xml', faAnyFile, searchResult)) = 0 then
  repeat
    MemoXML.Clear;
    MemoXML.Lines.LoadFromFile('C:\Integrador\Output\'+searchResult.Name);

    //insere o arquivo de retorno em uma string
    retorno := MemoXML.Text;

    //Separa o retorno pelo delimitador pipe ("|") conforme descrito acima
    strSeparada := SplitString(retorno, '|');

    //Se o retorno não for de sucesso (EEEEE diferente de 0600) mostra o retorno
    if strSeparada[1] <> '06000' then
    begin
      ShowMessage('Erro na venda: ' + strSeparada[1]);
    end else
    //Caso a venda for realizada com sucesso, proceda:
    begin
        //Mostra a chave de acesso no campo Edit
        Edit3.Text := strSeparada[8];

        //Salva o CF-e de retorno em Base64 em uma string
        arqBase64 := strSeparada[6];

        // Caso queira apresentar em uma mensagem na tela
        {ShowMessage(strSeparada[0]+Char(10)+Char(13)+
                    strSeparada[1]+Char(10)+Char(13)+
                    strSeparada[2]+Char(10)+Char(13)+
                    strSeparada[3]+Char(10)+Char(13)+
                    strSeparada[4]+Char(10)+Char(13)+
                    strSeparada[5]+Char(10)+Char(13)+
                    strSeparada[7]+Char(10)+Char(13)+
                    strSeparada[8]+Char(10)+Char(13)+
                    strSeparada[9]+Char(10)+Char(13)+
                    strSeparada[10]+Char(10)+Char(13)+
                    strSeparada[11]);}

        //Inserindo os valores separados do retorno no ValueListEditor
        ValueListEditor.Strings.Clear;
        sessao := Copy(strSeparada[0],261,266);
        ValueListEditor.Values ['Número de Sessão']:= sessao;
        ValueListEditor.Values ['Código de retorno']:= strSeparada[1];
        ValueListEditor.Values ['Código de Cancelamento']:= strSeparada[2];
        ValueListEditor.Values ['Descrição do Erro']:= strSeparada[3];
        ValueListEditor.Values ['Cód. Referência SEFAZ']:= strSeparada[4];
        ValueListEditor.Values ['Mensagem SEFAZ']:= strSeparada[5];
        ValueListEditor.Values ['Data e Hora de Emissão']:= strSeparada[7];
        ValueListEditor.Values ['Chave de Acesso']:= strSeparada[8];
        ValueListEditor.Values ['Valor Total']:= strSeparada[9];
        ValueListEditor.Values ['CPF ou CNPJ']:= strSeparada[10];
        ValueListEditor.Values ['Assinatura QR-Code']:= strSeparada[11];

        //Decodifica o CF-e de retorno para xml e coloca em uma lista
        decBase64 := base64Decode(arqBase64);
        grava := TStringList.Create;
        grava.Add(decBase64);

        //Cria uma pasta no C:/XML-NFE com o nome cfe-retorno para guardar o CF-e de retorno
        dir := 'C:\XML-MFE\cfe-retorno';
        if not DirectoryExists(dir) then
          ForceDirectories(dir);
        grava.SaveToFile('C:\XML-MFE\cfe-retorno\'+strSeparada[8]+'.xml');
      end;
      until FindNext(searchResult) <> 0;
        FindClose(searchResult);
end;
except
  ShowMessage('Erro ao obter o retorno, verifique o arquivo da pasta C:/Integrador/Output');
end;
end;
Descrição do Retorno

O retorno é composto por um array dos valores separados por pipe representado da seguinte forma:

Retorno de Sucesso
numeroSessao|EEEEE|CCCC|mensagem|cod|mensagemSEFAZ|arquivoCFeBase64|timeStamp|chaveConsulta|valorTotalCFe|CPFCNPJValue|assinaturaQRCODE
Retorno de Erro
numeroSessao|EEEEE|CCCC|mensagem|cod|mensagemSEFAZ
Códigos de retorno com suas respectivas posições

Posição[0] - numeroSessao - Número aleatório gerado pelo aplicativo comercial para controle da comunicação.

Posição[1] - EEEEE - Código de retorno.

Posição[2] - CCCC - Código de retorno de cancelamento.

Posição[3] - mensagem - Descrições dos códigos EEEEE.

Posição[4] - cod - Código de referência de cada "mensagemSEFAZ".

Posição[5] - mensagemSEFAZ - Mensagem de texto enviada pela SEFAZ referente ao "Envio de avisos ao usuário".

Posição[6] - arquivoCFeBase64 - Arquivo em XML assinado pelo SAT em formato idêntico ao que o SAT enviará para a SEFAZ.

Posição[7] - timeStamp - Data e hora da emissão no formato: AAAAMMDDHHMMSS.

Posição[8] - chaveConsulta - Chave de acesso do CF-e-SAT.

Posição[9] - valorTotalCFe - Valor total do CF-e calculado pelo SAT.

Posição[10] - CPFCNPJValue - Número do CPF ou CNPJ do adquirente sem pontos, traços e barras.

Posição[11] - assinaturaQRCODE - Conteúdo do Campo ?assinaturaQRCODE? presente no leiaute do arquivo de venda/cancelamento.

Em caso de erro na venda (EEEEE diferente de 06000) o retorno será somente até a Posição[5]!

2.5.3. Botão CancelarUltimaVenda

Componentes Utilizados
Componente Nome

Form

FormExemploMFEDelphiXE

Button

CancelarUltimaVenda

Edit

EditSessao

Edit

EditId

Edit

EditCodAtivacao

Edit

EditChaveAcesso

Memo

MemoXML*

ValueListEditor

ValueListEditor

*O componente *Memo* terá a propriedade visible como false, pois será usado somente para receber o XML e não aparecerá na tela.

// CANCELAR ULTIMA VENDA====================================================
procedure TFormExemploMFEDelphiXE.CancelarUltimaVendaClick(Sender: TObject);
var
canc, cancInt : string;
retorno : string;
f : TextFile;
arquivo, arq: string;
i: integer;
sr: TSearchRec;
searchResult : TSearchRec;

begin

canc := '<?xml version="1.0"encoding="UTF-8"?><CFeCanc><infCFe chCanc="'+EditChaveAcesso.Text+'"><ide><CNPJ>'+EditCNPJsh.Text+'</CNPJ><signAC>SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT</signAC><numeroCaixa>123</numeroCaixa></ide><emit/><dest>'+Edit4.Text+'</dest><total/><infAdic/></infCFe></CFeCanc>';

cancInt :=  '<Integrador>'+
            '<Identificador>'+
            '<Valor>'+EditId.Text+'</Valor>'+
            '</Identificador>'+
            '<Componente Nome="MF-e">'+
            '<Metodo Nome="CancelarUltimaVenda">'+
            '<Parametros>'+
            '<Parametro>'+
            '<Nome>numeroSessao</Nome>'+
            '<Valor>'+EditSessao.Text+'</Valor>'+
            '</Parametro>'+
            '<Parametro>'+
            '<Nome>codigoDeAtivacao</Nome>'+
            '<Valor>'+EditCodAtivacao.Text+'</Valor>'+
            '</Parametro>'+
            '<Parametro>'+
            '<Nome>chave</Nome>'+
            '<Valor>'+EditChaveAcesso.Text+'</Valor>'+
            '</Parametro>'+
            '<Parametro>'+
            '<Nome>dadosCancelamento</Nome>'+
            '<Valor><![CDATA['+canc+']]></Valor>'+
            '</Parametro>'+
            '</Parametros>'+
            '</Metodo>'+
            '</Componente>'+
            '</Integrador>';

arquivo := 'C:/Integrador/Input/CancelarUltimaVenda.xml';

if not FileExists(arquivo) then
  DeleteFile(arquivo);

AssignFile(f,arquivo);
Rewrite(f);
Writeln(f,cancInt);
CloseFile(f);


//Apaga conteúdo da pasta OUTPUT
I := FindFirst('C:\Integrador\Output\*.*', faAnyFile, SR);
while I = 0 do
begin
  DeleteFile('C:\Integrador\Output\' + SR.Name);
  I := FindNext(SR);
end;
//---

//Cria uma pasta no C: com o nome XML-NFE para guardar o arquivo
//CancelarUltimaVenda.xml que foi enviado
dir := 'C:\XML-MFE\xml-de-envio';
if not DirectoryExists(dir) then
  ForceDirectories(dir);
  arquivo := 'C:\XML-MFE\xml-de-envio\CancelarUltimaVenda.xml';

  if not FileExists(arquivo) then
    DeleteFile(arquivo);

  AssignFile(f,arquivo);
  Rewrite(f);
  Writeln(f,cancInt);
  CloseFile(f);
  ShowMessage('Arquivo XML de cancelamento enviado com sucesso, aguarde o retorno...');
  //Após enviado o xml do cancelamento, aguardar 3 segundos para capturar o retorno da pasta Output
  Sleep(3000);
//Pega o retorno da venda na pasta OUTPUT
try
  begin
  if (FindFirst('C:\Integrador\Output\*.xml', faAnyFile, searchResult)) = 0 then
  repeat
  //insere o arquivo de retorno em uma string
  MemoXML.Clear;
  MemoXML.Lines.LoadFromFile('C:\Integrador\Output\'+searchResult.Name);
  retorno := MemoXML.Text;

  //Separa o retorno pelo delimitador pipe ("|") conforme descrito acima
  strSeparada := SplitString(retorno, '|');

  //Se o retorno não for de sucesso (EEEEE diferente de 07000) mostra o retorno
  if strSeparada[1] <> '07000' then
  begin
    ShowMessage('Erro no cancelamento: ' + strSeparada[1]);
  end else
  //Caso a venda for realizada com sucesso, proceda:
  begin
    //Mostra a chave de acesso no campo Edit
    EditChaveAcesso.Text := strSeparada[8];
    arqBase64 := strSeparada[6];
    ValueListEditor.Strings.Clear;
    ValueListEditor.Values ['Número de Sessão']:= strSeparada[0];
    ValueListEditor.Values ['Código de retorno']:= strSeparada[1];
    ValueListEditor.Values ['Código de Cancelamento']:= strSeparada[2];
    ValueListEditor.Values ['Descrição do Erro']:= strSeparada[3];
    ValueListEditor.Values ['Cód. Referência SEFAZ']:= strSeparada[4];
    ValueListEditor.Values ['Mensagem SEFAZ']:= strSeparada[5];
    ValueListEditor.Values ['Data e Hora de Emissão']:= strSeparada[7];
    ValueListEditor.Values ['Chave de Acesso']:= strSeparada[8];
    ValueListEditor.Values ['Valor Total']:= strSeparada[9];
    ValueListEditor.Values ['CPF ou CNPJ']:= strSeparada[10];
    ValueListEditor.Values ['Assinatura QR-Code']:= strSeparada[11];

    //Decodifica o CF-e de retorno para xml
    decBase64 := base64Decode(arqBase64);
    grava := TStringList.Create;
    grava.Add(decBase64);

    //Cria uma pasta no C:/XML-NFE com o nome cfe-retorno para guardar o CF-e de retorno
    dir := 'C:\XML-MFE\cfe-retorno';
    if not DirectoryExists(dir) then
      ForceDirectories(dir);
    grava.SaveToFile('C:\XML-MFE\cfe-retorno\'+strSeparada[8]+'canc.xml');
    end;
      until FindNext(searchResult) <> 0;
        FindClose(searchResult);
end;
except
  ShowMessage('Erro ao obter o retorno, verifique o arquivo da pasta C:/Integrador/Output');
end;
end;
Descrição do Retorno

O retorno é composto por um array dos valores separados por pipe representado da seguinte forma:

Retorno de Sucesso
numeroSessao|EEEEE|CCCC|mensagem|cod|mensagemSEFAZ|arquivoCFeBase64|timeStamp|chaveConsulta|valorTotalCFe|CPFCNPJValue|assinaturaQRCODE
Retorno de Erro
numeroSessao|EEEEE|CCCC|mensagem|cod|mensagemSEFAZ
Códigos de retorno com suas respectivas posições

Posição[0] - numeroSessao - Número aleatório gerado pelo aplicativo comercial para controle da comunicação.

Posição[1] - EEEEE - Código de retorno.

Posição[2] - CCCC - Código de retorno de cancelamento.

Posição[3] - mensagem - Descrições dos códigos EEEEE.

Posição[4] - cod - Código de referência de cada "mensagemSEFAZ".

Posição[5] - mensagemSEFAZ - Mensagem de texto enviada pela SEFAZ referente ao "Envio de avisos ao usuário".

Posição[6] - arquivoCFeBase64 - Arquivo em XML assinado pelo SAT em formato idêntico ao que o SAT enviará para a SEFAZ.

Posição[7] - timeStamp - Data e hora da emissão no formato: AAAAMMDDHHMMSS.

Posição[8] - chaveConsulta - Chave de acesso do CF-e-SAT.

Posição[9] - valorTotalCFe - Valor total do CF-e calculado pelo SAT.

Posição[10] - CPFCNPJValue - Número do CPF ou CNPJ do adquirente sem pontos, traços e barras.

Posição[11] - assinaturaQRCODE - Conteúdo do Campo ?assinaturaQRCODE? presente no leiaute do arquivo de venda/cancelamento.

3. Dados de Homologação

Para uso do MFE de homologação da Bematech, devem ser utilizados os seguintes parâmetros:

Dados Software House

CNPJ

16716114000172

Assinatura

SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT

Dados Emitente

CNPJ

08723218000186

Inscrição Estadual

562377111111

4. Código Fonte do Exemplo

O código fonte do exemplo em Delphi pode se encontrado nos links:

5. Considerações Finais

Este manual tem como objetivo auxiliar os desenvolvedores a integrar sua aplicação com o MFE da Bematech. Todo seu conteúdo foi realizado com base em testes realizados pela equipe de analistas do BSP (Bematech Software Partners), e cita somente algumas das principais funções. Qualquer objeção ao seu conteúdo ou mesmo sugestões podem ser enviadas para suporte@bematech.com.br. Agradeceremos muito seu contato!

6. Suporte

Nossos canais de suporte ao desenvolvedor

0800-644-7277 - exclusivo aos Desenvolvedores

Chat Online no Portal de Desenvolvedores - http://bematechpartners.com.br/