Eu dei uma idéia de como assinar usando a sefazclass.
Primeiro é assinar a nota, e depois o lote.
Na assinatura da nota, é direto, normal.
Dentro de ze_sefazassina:
Código: Selecionar todos
STATIC FUNCTION AssinaAjustaInformacao( cTxtXml, cXmlTagInicial, cXmlTagFinal, cRetorno, lComURI )
LOCAL aDelimitadores, nPos, nPosIni, nPosFim, cURI
aDelimitadores := { ;
{ "<enviMDFe", "</MDFe></enviMDFe>" }, ;
{ "<eventoMDFe", "</eventoMDFe>" }, ;
{ "<eventoCTe", "</eventoCTe>" }, ;
{ "<infMDFe", "</MDFe>" }, ;
{ "<infCte", "</CTe>" }, ;
{ "<infNFe", "</NFe>" }, ;
{ "<infDPEC", "</envDPEC>" }, ;
{ "<infInut", "<inutNFe>" }, ;
{ "<infCanc", "</cancNFe>" }, ;
{ "<infInut", "</inutNFe>" }, ;
{ "<infInut", "</inutCTe>" }, ;
{ "<infEvento", "</evento>" }, ;
{ "<evtInfoEmpregador", "</eSocial>" }, ;
{ "<PedidoEnvioLoteRPS", "</RPS>" }, ;
{ "<PedidoEnvioRPS", "</RPS>" }, ;
{ "<infPedidoCancelamento", "</Pedido>" }, ; // NFSE ABRASF Cancelamento
{ "<LoteRps", "</EnviarLoteRpsEnvio>" }, ; // NFSE ABRASF Lote
{ "<infRps", "</Rps>" } } // NFSE ABRASF RPS
Acima é referência do que deve existir no XML.
Código: Selecionar todos
FUNCTION CapicomAssinaXml( cTxtXml, cCertCN, lRemoveAnterior, cPassword, lComURI )
Não tem muito o que mexer, talvez confunda quem não está acostumado com XML.
cTxtXml -> o arquivo XML
cCertCN -> o nome do certificado
lRemoveAnterior - Se remove assinatura(s) anterior(es)
cPassword -> senha do certificado
lComURI -> se o bloco de assinatura vai indicar a URI, que é o nome do bloco a ser assinado
Na assinatura normal, o lRemoveAnterior é verdadeiro, no caso da prefeitura é a nota individual
Na assinatura de lote, o lRemoveAnterior é falso, pra não remover a assinatura da(s) nota(s)
Acho que no lote esse lComURI é falso, talvez possa confirmar em alguma nota exemplo.
Código: Selecionar todos
STATIC FUNCTION AssinaBlocoAssinatura( cURI, lComURI )
LOCAL cSignatureNode := ""
IF lComURI
cURI := "#" + cURI
ENDIF
A diferença entre com e sem URI é a acima, dá pra confirmar olhando um lote assinado, ou, na tentativa/erro, ao assinar o lote.
olhando novamente a função:
Código: Selecionar todos
FUNCTION CapicomAssinaXml( cTxtXml, cCertCN, lRemoveAnterior, cPassword, lComURI )
Não lembro mais, mas numa primeira tentativa, a mais provável
Código: Selecionar todos
cXmlNota := "xxxxxx"
cXmlAssinado := ze_assinaXml( cXmlNota, "nomecertificado", .T.,"senha se precisar" )
cXmlLote := "xxxx" + cXmlAssinado + "xxxx"
cXmlTransmite := ze_AssinaXml( cXmlNota, "nomecertificado", .F., "senha se precisar", .F. )
Como deve estar olhando o manual, pra gerar o XML, deve ter o esquema do lote no manual pra ajustar a linha que cria cXmlLote.