a TÃtulo de colaboração, abaixo a consulta de NFe destinadas, acho que pode ajudar alguem, ja que tive que pesquisar mto para localizar os links.
ohbNFe:= hbnfe()
ohbNFe:versaoDados:='1.01'
cXMLDadosMsg := '<consNFeDest xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">'+;
'<tpAmb>'+ alltrim(oApp:Ambiente)+'</tpAmb><xServ>CONSULTAR NFE DEST</xServ>'+;
'<CNPJ>'+ alltrim( _empre:cnpj)+'</CNPJ>'+;
'<indNFe>'+ if( cRadnfe= 1,'0', if( cRadnfe= 2,'1','2'))+'</indNFe>'+;
'<indEmi>'+ if( cRademi= 1,'0','1')+'</indEmi>'+;
'<ultNSU>'+ if( cRadnsu= 2,'0', alltrim(str(oMaxNsu:mxnsu)) )+'</ultNSU></consNFeDest>'
* consulta nota fiscal destinada
*********************************
METHOD hbNFeDestinadas(cXMLDadosMsg ) CLASS hbNFe
LOCAL cCN, cUrlWS, cXML, oServerWS, oDOMDoc, cXMLResp, cMsgErro, nI,;
aRetorno := hash(), nI2, aRetornoRet, oRetornoNFe, oError, oCurl, aHeader, retHTTP
LOCAL cSOAPAction := 'http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsultaDest/nfeConsultaNFDest'
IF ::cUFWS = Nil
::cUFWS := ::cUFWS
ENDIF
IF ::versaoDados = Nil
::versaoDados:= ::versaoDados
ENDIF
cXML := '<?xml version="1.0" encoding="utf-8"?>'
cXML := cXML + '<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">'
cXML := cXML + '<soap12:Header>'
cXML := cXML + '<nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsultaDest">'
cXML := cXML + '<cUF>'+::cUF+'</cUF>'
cXML := cXML + '<versaoDados>'+::versaoDados+'</versaoDados>'
cXML := cXML + '</nfeCabecMsg>'
cXML := cXML + '</soap12:Header>'
cXML := cXML + '<soap12:Body>'
cXML := cXML + '<nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsultaDest">'
cXML := cXML + alltrim(cXMLDadosMsg)
cXML := cXML + '</nfeDadosMsg>'
cXML := cXML + '</soap12:Body>'
cXML := cXML +'</soap12:Envelope>'
cCN:= ::pegaCNCertificado(::cSerialCert)
if empty(cCN)
aRetorno['OK'] := .F.
aRetorno['MsgErro']:= 'Certificado Digital não localizado.'
RETURN(aRetorno)
endif
cUrlWS := ::getURLWS(_DESTINADAS)
IF ::nSOAP = HBNFE_CURL // não entra aqui
aHeader = { 'Content-Type: application/soap+xml;charset=utf-8;action="'+cSoapAction+'"',;
'SOAPAction: "nfeConsultaNFDest"',;
'Content-length: '+ALLTRIM(STR(len(cXML))) }
#ifndef __XHARBOUR__
curl_global_init()
oCurl = curl_easy_init()
curl_easy_setopt(oCurl, HB_CURLOPT_URL, cUrlWS)
curl_easy_setopt(oCurl, HB_CURLOPT_PORT , 443)
curl_easy_setopt(oCurl, HB_CURLOPT_VERBOSE, .F.) // 1
curl_easy_setopt(oCurl, HB_CURLOPT_HEADER, 1) //retorna o cabeçalho de resposta
curl_easy_setopt(oCurl, HB_CURLOPT_SSLVERSION, 3)
curl_easy_setopt(oCurl, HB_CURLOPT_SSL_VERIFYHOST, 0)
curl_easy_setopt(oCurl, HB_CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt(oCurl, HB_CURLOPT_SSLCERT, ::cCertFilePub)
curl_easy_setopt(oCurl, HB_CURLOPT_KEYPASSWD,::cCertPass)
curl_easy_setopt(oCurl, HB_CURLOPT_SSLKEY, ::CertFilePriv)
curl_easy_setopt(oCurl, HB_CURLOPT_POST, 1)
curl_easy_setopt(oCurl, HB_CURLOPT_POSTFIELDS, cXML)
curl_easy_setopt(oCurl, HB_CURLOPT_WRITEFUNCTION, 1)
curl_easy_setopt(oCurl, HB_CURLOPT_DL_BUFF_SETUP )
curl_easy_setopt(oCurl, HB_CURLOPT_HTTPHEADER, aHeader )
curl_easy_perform(oCurl)
retHTTP := curl_easy_getinfo(oCurl,HB_CURLINFO_RESPONSE_CODE) //informações da conexão
cXMLResp := ''
IF retHTTP = 200 // OK
curl_easy_setopt( ocurl, HB_CURLOPT_DL_BUFF_GET, @cXMLResp )
cXMLResp := SUBS(cXMLResp,AT('<?xml',cXMLResp))
ENDIF
curl_easy_cleanup(oCurl)
curl_global_cleanup()
#endif
ELSE // MSXML // a consulta entra aqui
#ifdef __XHARBOUR__
oServerWS := xhb_CreateObject( "MSXML2.ServerXMLHTTP.5.0" )
#else
oServerWS := win_oleCreateObject( "MSXML2.ServerXMLHTTP.5.0")
#endif
oServerWS:setOption( 3, "CURRENT_USER\MY\"+cCN )
oServerWS:open("POST", cUrlWS, .F.)
oServerWS:setRequestHeader("SOAPAction", cSOAPAction )
oServerWS:setRequestHeader("Content-Type", "application/soap+xml; charset=utf-8")
#ifdef __XHARBOUR__
oDOMDoc := xhb_CreateObject( "MSXML2.DOMDocument.5.0" )
#else
oDOMDoc := win_oleCreateObject( "MSXML2.DOMDocument.5.0")
#endif
oDOMDoc:async = .F.
oDOMDoc:validateOnParse = .T.
oDOMDoc:resolveExternals := .F.
oDOMDoc:preserveWhiteSpace = .T.
oDOMDoc:LoadXML(cXML)
IF oDOMDoc:parseError:errorCode <> 0 // XML não carregado
cMsgErro := "Não foi possÃvel carregar o documento pois ele não corresponde ao seu Schema"+HB_OsNewLine() + ;
" Linha: " + STR(oDOMDoc:parseError:line)+HB_OsNewLine() + ;
" Caractere na linha: " + STR(oDOMDoc:parseError:linepos)+HB_OsNewLine() + ;
" Causa do erro: " + oDOMDoc:parseError:reason+HB_OsNewLine() + ;
" Code: "+STR(oDOMDoc:parseError:errorCode)
aRetorno['OK'] := .F.
aRetorno['MsgErro'] := cMSgErro
RETURN(aRetorno)
ENDIF
TRY
oServerWS:send(oDOMDoc:xml)
CATCH oError
cMsgErro := "Falha: "+'Não foi possÃvel conectar-se ao servidor do SEFAZ, Servidor inativou ou inoperante.' +HB_OsNewLine()+ ;
"Error: " + Transform(oError:GenCode, nil) + ";" +HB_OsNewLine()+ ;
"SubC: " + Transform(oError:SubCode, nil) + ";" +HB_OsNewLine()+ ;
"OSCode: " + Transform(oError:OsCode, nil) + ";" +HB_OsNewLine()+ ;
"SubSystem: " + Transform(oError:SubSystem, nil) + ";" +HB_OsNewLine()+ ;
"Mensangem: " + oError:Description
aRetorno['OK'] := .F.
aRetorno['MsgErro'] := cMSgErro
RETURN(aRetorno)
END
DO WHILE oServerWS:readyState <> 4
millisec(500)
ENDDO
cXMLResp := HB_ANSITOOEM(oServerWS:responseText)
ENDIF
cXMLResp := pegaTag(cXMLResp, "retConsNFeDest")
MemoWrit("RetornoEnvio.xml" , cXMLResp ) // ISTO deixar até funcionar
aRetorno['OK'] := .T.
aRetorno['cStat'] := pegaTag(cXMLResp, "cStat")
aRetorno['dhResp'] := pegaTag(cXMLResp, "dhResp")
aRetorno['xMotivo']:= pegaTag(cXMLResp, "xMotivo")
aRetorno['indCont']:= pegaTag(cXMLResp, "indCont")
aRetorno['ultNSU'] := pegaTag(cXMLResp, "ultNSU")
aRetorno['RetNFeDest']:= PrsAnsiToOem(cXMLResp)
::lAutorizada:= ( aRetorno['cStat'] $ "138" )
RETURN(aRetorno)
Qdo fizer as outras (download da NFe e manifestação) posto aqui, se alguem ainda não postou.
abraços