Assinatura NFSe

98 views
Skip to first unread message

Breno Ribeiro

unread,
Jan 25, 2022, 1:34:33 PM1/25/22
to PyNFe
Boa tarde,
Estou desenvolvendo um sistema para emissão de NFSe junto ao webservice da PBH, e estou tentando usar o método AssinaturaA1 para assinar o pedido. Segue o trecho em que crio e envio o xml para assinatura:

_BODY = ("<?xml version='1.0' encoding='UTF-8'?>\n"
"<GerarNfseEnvio xmlns=\'http://www.abrasf.org.br/nfse.xsd\'>\n"
" <LoteRps versao='1.00' Id='1202112232685160'>\n"
" <NumeroLote>1</NumeroLote>\n"
f" <Cnpj>{_CNPJ}</Cnpj>\n"
f" <InscricaoMunicipal>{_INSM}</InscricaoMunicipal>\n"
" <QuantidadeRps>1</QuantidadeRps>\n"
" <ListaRps>\n"
" <Rps>\n"
" <InfRps Id='2202112232685160'>\n"
" <IdentificacaoRps>\n"
" <Numero > 1 </Numero >\n"
" <Serie > 3 </Serie >\n"
" <Tipo > 1 </Tipo >\n"
" </IdentificacaoRps >\n"
" <DataEmissao > 2022-01-25T00:00:00 </DataEmissao >\n"
" <NaturezaOperacao > 1 </NaturezaOperacao >\n"
" <OptanteSimplesNacional > 1 </OptanteSimplesNacional >\n"
" <IncentivadorCultural > 2 </IncentivadorCultural>\n"
" <Status> 1 </Status>\n"
" <Servico>\n"
" <Valores>\n"
" <ValorServicos> 400.00 </ValorServicos>\n"
" <IssRetido> 2 </IssRetido>\n"
" <BaseCalculo>400.00</BaseCalculo>\n"
" <ValorLiquidoNfse>400.00</ValorLiquidoNfse>\n"
" </Valores>\n"
" <ItemListaServico>04.15</ItemListaServico>\n"
" <CodigoTributacaoMunicipio>41500188</CodigoTributacaoMunicipio>\n"
" <Discriminacao>Prestação de Serviço de Psicologia. Duas sessões ref. 01/22 para Franciele Gusmão Ferreira.</Discriminacao>\n"
" <CodigoMunicipio>3106200</CodigoMunicipio>\n"
" </Servico>\n"
" <Prestador>\n"
f" <Cnpj> {_CNPJ} </Cnpj>\n"
f" <InscricaoMunicipal> {_INSM} </InscricaoMunicipal>\n"
" </Prestador>\n"
" <Tomador>\n"
" <IdentificacaoTomador>\n"
" <CpfCnpj>\n"
" <Cpf> 12345678910 </Cpf>\n"
" </CpfCnpj>\n"
" </IdentificacaoTomador>\n"
" <RazaoSocial> Franciele</RazaoSocial>\n"
" <Endereco>\n"
" <Endereco> \. </Endereco>\n"
" <Numero> \. </Numero>\n"
" <Bairro> \. </Bairro>\n"
" <CodigoMunicipio> 3106200 </CodigoMunicipio>\n"
" <Uf> MG </Uf>\n"
" <Cep> 99999999 </Cep>\n"
" </Endereco>\n"
" </Tomador>\n"
" </InfRps>\n"
" </Rps>\n"
" </ListaRps>\n"
" </LoteRps>\n"
"</GerarNfseEnvio>\n")

nfe = ET.ElementTree(ET.fromstring(_BODY))
certificado = "up-leg-certificate.pfx"
a1 = AssinaturaA1(certificado, secret)
xml = a1.assinar(nfe)

Porém estou recebndo o erro 
  File "src\lxml\etree.pyx", line 3460, in lxml.etree.tostring
TypeError: Type 'ElementTree' cannot be serialized.

Vocês conseguiriam me ajudar a entender o que está errado no código?

Desde já agradeço.
Message has been deleted

Breno Ribeiro

unread,
Jan 26, 2022, 8:05:08 PM1/26/22
to PyNFe
Consegui descobrir o problema. Eu estava criando o elemento xml com a biblioteca xml, enquanto que a biblioteca Assinatura utiliza a lxml.
Porém agora estou com outro problema: o método está me devolvendo a nota assinada apenas no Lote, e eu preciso que seja assinado no Lote e na RPS.
Alguém tem uma ideia do motivo?

Breno Ribeiro

unread,
Jan 28, 2022, 10:16:30 AM1/28/22
to PyNFe
Nova evolução desse problema. Na verdade uma evolução, um bug no método assinar da bilbioteca PyNFe e  um problema.
Evolução: consegui assinar os dois nós, mas só foi possível em 3 passos:
1. Assinar o nó externo do elemento xml completo;
2. Assinar o nó interno, copiando o mesmo para um novo elemento xml;
3. Inserir o nó interno assinado no elemento xml completo.
Segue como ficou o código:
        # criação do elemento xml completo
xmlBODY = etree.fromstring(_BODY)
# assinatura do nó externo
xmlBODY = a1.assinar(xmlBODY)
# assinatura do nó interno. O mesmo, assinado, será copiado para o elemento xmlRPS
xmlRPS = a1.assinar(xmlBODY.xpath('//d:Rps', namespaces={'d': 'http://www.abrasf.org.br/nfse.xsd'})[0])
# inserimento do nó interno no documento completo
container = xmlBODY.xpath('//d:Rps', namespaces={'d': 'http://www.abrasf.org.br/nfse.xsd'})[0]
parent = container.getparent()
parent.replace(container, xmlRPS)

Isto me levao ao segundo ponto da discussâo: o bug encontrado.
Eu poderia assinar o nó interno, inserir o elemento interno no elemento completo e assinar o nó externo, porém quando faço isso o campo  <X509Certificate> do nó interno é carregado em duplicidade, enquanto que o externo fica sem esta tag.

Agora o problema, que é o que eu preciso de ajuda:
Seguindo o procedimento na primeira parte desse post, consigo o elemento completo devidamente assinado. Porém ao enviá-lo ao webservice do ISS Digital da Prefeitura de BH para emissão de NFSe (não NFe), eu recebo a resposta "E174 Arquivo enviado com erro na assinatura".
Já verifiquei o CNPJ do prestador (está igual ao CNPJ do certificado), já verifiquei se o arquivo XML tem algum caracter estranho, já testei nos ambientes Homologação e Produção.... nada deu resultado.

Se alguém souber de mais alguma possibilidade de motivo/solução, por favor, compartilhe comigo.

Att.,
Breno
Reply all
Reply to author
Forward
0 new messages