Browse Source

Merge branch 'master' of https://github.com/leotada/PyNFe

pull/1/head
Junior Tada 11 years ago
parent
commit
bfd1ac088b
  1. 14
      pynfe/processamento/assinatura.py
  2. 39
      pynfe/processamento/comunicacao.py
  3. 15
      test.py

14
pynfe/processamento/assinatura.py

@ -36,10 +36,14 @@ class AssinaturaA1(Assinatura):
signer = signxml.xmldsig(root, digest_algorithm="sha1") signer = signxml.xmldsig(root, digest_algorithm="sha1")
signer.sign(method=signxml.methods.enveloped, key=chave, cert=cert, 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', 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") #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 return result

39
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, '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, 'indSinc').text = str(1) # 0 para assincrono, 1 para sincrono
etree.SubElement(raiz, 'NFe').text = nota_fiscal # conjunto de nfe tramistidas (max 50) 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 # Monta XML para envio da requisição
xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url) 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): def cancelar(self, modelo, xml):
""" Envia um evento de cancelamento de nota fiscal """ """ 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, 'tpAmb').text = str(self._ambiente)
etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()] etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()]
etree.SubElement(raiz, 'xServ').text = 'STATUS' 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 # Monta XML para envio da requisição
if self.uf.upper() == 'PR': if self.uf.upper() == 'PR':
xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url) xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url)
else: else:
xml = self._construir_xml_soap(cabecalho=self._cabecalho_soap(), metodo='nfeRecepcao2', tag_metodo='nfeStatusServicoNF2', dados=dados) xml = self._construir_xml_soap(cabecalho=self._cabecalho_soap(), metodo='nfeRecepcao2', tag_metodo='nfeStatusServicoNF2', dados=dados)
#xml = str(xml, 'utf-8').replace('&lt;', '<').replace('&gt;', '>').replace('\'', '"').replace('\n', '')
xml = replace('&amp;','').replace('lt;','<').replace('gt;','>').replace('&','')
# Chama método que efetua a requisição POST no servidor SOAP # Chama método que efetua a requisição POST no servidor SOAP
return self._post(url, xml, self._post_header()) return self._post(url, xml, self._post_header())
@ -192,7 +188,7 @@ class ComunicacaoSefaz(Comunicacao):
etree.SubElement(met, 'nfeCabecMsg').text = cabecalho etree.SubElement(met, 'nfeCabecMsg').text = cabecalho
etree.SubElement(met, 'nfeDadosMsg').text = dados 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): def _construir_xml_status_pr(self, cabecalho, dados, url):
u"""Mota o XML para o envio via SOAP""" u"""Mota o XML para o envio via SOAP"""
@ -216,20 +212,19 @@ class ComunicacaoSefaz(Comunicacao):
def _post(self, url, xml, header): def _post(self, url, xml, header):
# Separa arquivos de certificado para chave e certificado (sozinho) # Separa arquivos de certificado para chave e certificado (sozinho)
#caminho_chave, caminho_cert = self.certificado.separar_arquivo(senha=self.certificado_senha) #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 # Abre a conexão HTTPS
cert = (caminho_cert, caminho_chave) cert = (caminho_cert, caminho_chave)
s = str(xml, 'utf-8').replace('&lt;', '<').replace('&gt;', '>').replace('\'', '"').replace('\n', '')
#headers = {'content-type': 'text/xml'} #headers = {'content-type': 'text/xml'}
try: 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

15
test.py

@ -8,6 +8,7 @@ from pynfe.entidades.cliente import Cliente
from pynfe.entidades.emitente import Emitente from pynfe.entidades.emitente import Emitente
from pynfe.entidades.notafiscal import NotaFiscal, NotaFiscalProduto from pynfe.entidades.notafiscal import NotaFiscal, NotaFiscalProduto
from pynfe.entidades.fonte_dados import _fonte_dados from pynfe.entidades.fonte_dados import _fonte_dados
from pynfe.processamento.comunicacao import ComunicacaoSefaz
from pynfe.processamento.serializacao import SerializacaoXML from pynfe.processamento.serializacao import SerializacaoXML
from pynfe.processamento.assinatura import AssinaturaA1 from pynfe.processamento.assinatura import AssinaturaA1
from pynfe.utils.flags import CODIGO_BRASIL from pynfe.utils.flags import CODIGO_BRASIL
@ -105,7 +106,15 @@ certificado = "JC.pfx"
senha = '12345678' senha = '12345678'
# assinatura # assinatura
a1 = AssinaturaA1(certificado, senha) 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('&amp;','').replace('lt;','<').replace('gt;','>').replace('&','')
print(x)
# print(type(x))
# escreve # escreve
with open('teste.xml', 'wb') as arquivo:
arquivo.write(xml)
# with open('teste.xml', 'w') as arquivo:
# arquivo.write(x)
Loading…
Cancel
Save