diff --git a/pynfe/processamento/assinatura.py b/pynfe/processamento/assinatura.py index d878eac..98c6241 100644 --- a/pynfe/processamento/assinatura.py +++ b/pynfe/processamento/assinatura.py @@ -36,10 +36,14 @@ class AssinaturaA1(Assinatura): signer = signxml.xmldsig(root, digest_algorithm="sha1") signer.sign(method=signxml.methods.enveloped, key=chave, cert=cert, algorithm="rsa-sha1", c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315', - reference_uri='') + reference_uri='#NFe42140903657739000169550020000000011000000011') + # reference_uri nao funciona #verified_data = signer.verify(require_x509=True, ca_pem_file="cert.pem") - - #root = etree.SubElement(signer.data, "{http://www.w3.org/2000/09/xmldsig#}Reference", - # URI='#NFe41150715389524000122651010000000271333611649') - result = etree.tostring(signer.data, encoding="unicode") + + ##chave_id = root.find('.//infNFe[@Id]').attrib['Id'] + #root.findall('.//{http://www.w3.org/2000/09/xmldsig#}Reference')[0] \ + # .attrib['URI'] = '#chaveteste' + + result = etree.tostring(root, encoding="unicode", pretty_print=True) + return result diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index 7b7cd3c..05b15fc 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -38,17 +38,11 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'idLote').text = str(1) # numero autoincremental gerado pelo sistema etree.SubElement(raiz, 'indSinc').text = str(1) # 0 para assincrono, 1 para sincrono etree.SubElement(raiz, 'NFe').text = nota_fiscal # conjunto de nfe tramistidas (max 50) - import ipdb - #ipdb.set_trace() - print (type(nota_fiscal)) - dados = etree.tostring(raiz, encoding="unicode") - print (dados) - print (type(dados)) - #print (dados) + dados = etree.tostring(raiz, encoding="unicode") # BUG < retorna caracteres ASCII # Monta XML para envio da requisição xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url) - return xml - #return self._post(url, xml, self._post_header()) + #return xml + return self._post(url, xml, self._post_header()) def cancelar(self, modelo, xml): """ Envia um evento de cancelamento de nota fiscal """ @@ -86,12 +80,14 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()] etree.SubElement(raiz, 'xServ').text = 'STATUS' - dados = etree.tostring(raiz, encoding="UTF-8").decode('utf-8') + dados = etree.tostring(raiz, encoding="utf-8").decode('utf-8') # Monta XML para envio da requisição if self.uf.upper() == 'PR': xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url) else: xml = self._construir_xml_soap(cabecalho=self._cabecalho_soap(), metodo='nfeRecepcao2', tag_metodo='nfeStatusServicoNF2', dados=dados) + #xml = str(xml, 'utf-8').replace('<', '<').replace('>', '>').replace('\'', '"').replace('\n', '') + xml = replace('&','').replace('lt;','<').replace('gt;','>').replace('&','') # Chama método que efetua a requisição POST no servidor SOAP return self._post(url, xml, self._post_header()) @@ -192,7 +188,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(met, 'nfeCabecMsg').text = cabecalho etree.SubElement(met, 'nfeDadosMsg').text = dados - return etree.tostring(raiz, encoding="unicode", xml_declaration=True) + return etree.tostring(raiz, encoding="utf-8", xml_declaration=True) def _construir_xml_status_pr(self, cabecalho, dados, url): u"""Mota o XML para o envio via SOAP""" @@ -216,20 +212,19 @@ class ComunicacaoSefaz(Comunicacao): def _post(self, url, xml, header): # Separa arquivos de certificado para chave e certificado (sozinho) #caminho_chave, caminho_cert = self.certificado.separar_arquivo(senha=self.certificado_senha) - caminho_chave = '/home/junior/Documentos/Certificados/key.pem' - caminho_cert = '/home/junior/Documentos/Certificados/cert.pem' + caminho_chave = 'key.pem' + caminho_cert = 'cert.pem' # Abre a conexão HTTPS cert = (caminho_cert, caminho_chave) - s = str(xml, 'utf-8').replace('<', '<').replace('>', '>').replace('\'', '"').replace('\n', '') #headers = {'content-type': 'text/xml'} try: - r = requests.post(url, s, headers=self._post_header(), cert=cert, verify=False) - print (r.content) - if r == 200: - return r.text - except Exception as e: - pass - finally: - pass + result = requests.post(url, xml, headers=self._post_header(), cert=cert, verify=False) + print (result.content) + if result == 200: + return result.text + else: + return result + except Exception: + raise diff --git a/test.py b/test.py index 6c906cd..9df18c0 100644 --- a/test.py +++ b/test.py @@ -8,6 +8,7 @@ from pynfe.entidades.cliente import Cliente from pynfe.entidades.emitente import Emitente from pynfe.entidades.notafiscal import NotaFiscal, NotaFiscalProduto from pynfe.entidades.fonte_dados import _fonte_dados +from pynfe.processamento.comunicacao import ComunicacaoSefaz from pynfe.processamento.serializacao import SerializacaoXML from pynfe.processamento.assinatura import AssinaturaA1 from pynfe.utils.flags import CODIGO_BRASIL @@ -105,7 +106,15 @@ certificado = "JC.pfx" senha = '12345678' # assinatura a1 = AssinaturaA1(certificado, senha) -xml = a1.assinar_nfe(xml) +xml = a1.assinar(xml) +#print(xml) +#print(type(xml)) +con = ComunicacaoSefaz('PR', certificado, senha, homologacao=True) +x = con.autorizacao('nfce', xml) +#x = x.replace('&','').replace('lt;','<').replace('gt;','>').replace('&','') +print(x) +# print(type(x)) + # escreve -with open('teste.xml', 'wb') as arquivo: - arquivo.write(xml) \ No newline at end of file +# with open('teste.xml', 'w') as arquivo: +# arquivo.write(x) \ No newline at end of file