Eu consigo realizar a consulta sem problemas, retornando "CF-e SAT em operação". Porém quando tento enviar uma venda retorna o seguinte erro:
Analisando o log de erro do emulador aparece o seguinte:"022515|06010|1999|null||"
Abaixo segue um print da tela do emulador: Segue também o XML enviado para verificação: Segundo minhas pesquisas em fóruns de JAVA o erro "Content is not allowed in prolog" é referente ao início do arquivo XML, mas não consegui encontrar onde pode estar o erro. Já coloquei espaço antes de fechar a tag xml e retorna o mesmo erro.[Fatal Error] :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at br.com.satcfe.satbl.modelos.cfe.CFe.<init>(CFe.java:91)
at br.com.satcfe.satbl.controles.ControladorEmissao.trataMensagem(ControladorEmissao.java:52)
at br.com.satcfe.satbl.controles.ControladorComandosSAT.tratarComandoEnviarDadosVenda(ControladorComandosSAT.java:57)
at br.com.satcfe.satbl.MainSATBL.tratarComandos(MainSATBL.java:352)
at br.com.satcfe.satbl.MainSATBL.notifyIncomingData(MainSATBL.java:315)
at br.com.satcfe.satbl.conexao.MonitorComandosSAT$NotificadorComandoSAT.run(MonitorComandosSAT.java:75)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
Também já alterei a assinatura do XML para "SGR-SAT SISTEMA DE GESTAO E RETAGUARDA DO SAT", mas como isso não tem haver com a estrutura do arquivo, voltei a assinatura de teste. Essa assinatura tem 344 caracteres.
Eu não encontrei ninguém com esse problema de estrutura aqui no fórum nos teste do emulador. Estou usando Harbour no meu software AC, vou deixar abaixo uma parte da rotina que envia o comando de venda para o emulador.
Fico no aguardo de uma orientação.
Código: Selecionar todos
/*=================================================================================================================
Cfe:transmite
-------------------------------------------------------------------------------------------------------------------
Envia uma venda para o SAT emitir um cupom. Retorna se obteve sucesso.
=================================================================================================================*/
method Cfe:transmite(;
cArq,; // 1 Nome do arquivo XML
oRet ) // 2 Objeto de retorno do SAT [@]
begin sequence
if !::testa() ; break; endif
if !::envia("EnviarVenda",cArq); break; endif
recover
return .f.
always
oRet:= ::oRet
fErase(cArq)
endsequence
return .t.
/*=================================================================================================================
Cfe:testa
-------------------------------------------------------------------------------------------------------------------
Testar a comunicação do SAT
=================================================================================================================*/
method Cfe:testa()
begin sequence
if !::getSat() ; break; endif
if !::envia("ConsultarSat"); break; endif
recover
return .f.
endsequence
return .t.
/*=================================================================================================================
Cfe:getSat
-------------------------------------------------------------------------------------------------------------------
Seleciona o SAT (se necessário)
=================================================================================================================*/
method Cfe:getSat()
if ::lEmu; ::xEmpr:= "E"; endif
begin sequence
if !::oSat:vrfSat(::xEmpr); break; endif // Não existe SAT cadastrado
recover
return .f.
endsequence
if Empty(::cDirSis); ::cDskSis:= hb_CurDrive(); ::cDirSis:= ::cDskSis +":\\" +CurDir() ; endif
if Empty(::cDirSat); ; ::cDirSat:= Trim(::oSat:getDir(::xEmpr)); endif
return .t.
/*=================================================================================================================
Cfe:emula
-------------------------------------------------------------------------------------------------------------------
Emula o envio e retorno do SAT
=================================================================================================================*/
method Cfe:emula(;
cCmd,; // 1 String com o nome da função para a DLL executar
cArq,; // 2 Arquivo de envio
cChv,; // 3 Chave para cancelamento
nRnd,; // 4 Nº randômico
cCod ) // 5 Código de ativação
local cRet
DirChange(::cDirSat)
begin sequence
switch cCmd
case "ConsultarSat"; cRet:= EmuConsulta(nRnd); exit
otherwise
cArq:= ::cDirSis +"\\" +cArq
switch cCmd
case "EnviarVenda" ; cRet:= EmuVenda(nRnd,cCod,cArq) ; exit
case "CancelarVenda"; cRet:= EmuCancela(nRnd,cCod,cChv,cArq); exit
endswitch
endswitch
DiskChange(::cDskSis)
DirChange(::cDirSis)
if Empty(cRet); break; endif
recover
return .f.
endsequence
::aRet:= Str2Vet(Utf2Ans(cRet),"|")
return ::getRet()
*******************************************************************************************************************
/*=================================================================================================================
Funções em C
-------------------------------------------------------------------------------------------------------------------
Funções em C para comunicação com a DLL
=================================================================================================================*/
#pragma BEGINDUMP
#include "hbapi.h"
#include "windows.h"
#define SATAPI WINAPIV
#define EMUDLL "sat.dll"
typedef char *(SATAPI *_EMUCONSULTA) (int nRandom);
typedef char *(SATAPI *_EMUVENDA) (int nRandom,char* cCodAtiv,char* cArqXml);
typedef char *(SATAPI *_EMUCANCELA) (int nRandom,char* cCodAtiv,char* cChave,char* cArqXml);
/*=================================================================================================================
EmuConsulta
-------------------------------------------------------------------------------------------------------------------
Consulta de o SAt está em operação
=================================================================================================================*/
HB_FUNC(EMUCONSULTA) {
int nRandom = hb_parnl(1);
HINSTANCE nHdl = LoadLibrary(EMUDLL);
if (nHdl) {
_EMUCONSULTA pFunc = (_EMUCONSULTA) GetProcAddress(nHdl,"ConsultarSAT");
hb_retc(pFunc(nRandom));
FreeLibrary(nHdl);
} // if
} // func
/*=================================================================================================================
EmuVenda
-------------------------------------------------------------------------------------------------------------------
Envia o arquivo XML (Cfe) para o SAT
=================================================================================================================*/
HB_FUNC(EMUVENDA) {
int nRandom = hb_parnl(1);
char cCodAtiv[150] = {0};
char cArqXml[150] = {0};
HINSTANCE nHdl = LoadLibrary(EMUDLL);
strcpy(cCodAtiv,hb_parcx(2));
strcpy(cArqXml ,hb_parcx(3));
if (nHdl) {
_EMUVENDA pFunc = (_EMUVENDA) GetProcAddress(nHdl,"EnviarDadosVenda");
hb_retc(pFunc(nRandom,cCodAtiv,cArqXml));
FreeLibrary(nHdl);
} // if
} // func
#pragma ENDDUMP


