Browse Source

[NEW] Qrcode 2 funcionando de forma online

pull/47/head
erikseyti 7 years ago
parent
commit
e077e6d412
  1. 62
      pynfe/processamento/serializacao.py
  2. 2
      pynfe/utils/flags.py
  3. 33
      qrCode2Teste.py

62
pynfe/processamento/serializacao.py

@ -8,6 +8,7 @@ from pynfe.utils.webservices import NFCE
import base64
import hashlib
from datetime import datetime
import re
class Serializacao(object):
@ -673,7 +674,7 @@ class SerializacaoXML(Serializacao):
class SerializacaoQrcode(object):
""" Classe que gera e serializa o qrcode de NFC-e no xml """
def gerar_qrcode(self, token, csc, xml, return_qr=False):
def gerar_qrcode(self, token, csc, xml, return_qr=False,qrcode_emissao="1"):
""" Classe para gerar url do qrcode da NFC-e """
# Procura atributos no xml
ns = {'ns':NAMESPACE_NFE}
@ -699,20 +700,58 @@ class SerializacaoQrcode(object):
icms = nfe.xpath('ns:infNFe/ns:total/ns:ICMSTot/ns:vICMS/text()', namespaces=ns)[0]
digest = nfe.xpath('sig:Signature/sig:SignedInfo/sig:Reference/sig:DigestValue/text()', namespaces=sig)[0].encode()
data = base64.b16encode(data).decode()
digest = base64.b16encode(digest).decode()
if cpf is None:
url = 'chNFe={}&nVersao={}&tpAmb={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
chave, VERSAO_QRCODE, tpamb, data.lower(), total, icms, digest.lower(), token)
lista_dia = re.findall("-\d{2}", str(data))
dia = str(lista_dia[1])
dia = dia[1:]
replacements = {'0': ''}
token = re.sub('([0])', lambda m: replacements[m.group()], token)
#VERSAO_QRCODE =2
if qrcode_emissao == "1":
#versão online
url = '{}|{}|{}|{}'.format(
chave,VERSAO_QRCODE,tpamb,token
)
else:
url = 'chNFe={}&nVersao={}&tpAmb={}&cDest={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
chave, VERSAO_QRCODE, tpamb, cpf, data.lower(), total, icms, digest.lower(), token)
#versão offline
digest = digest.lower()
digest = digest.hex()
url = '{}|{}|{}|{}|{}|{}|{}'.format(
chave,VERSAO_QRCODE,tpamb,dia,total,digest,token
)
url_hash = hashlib.sha1(url.encode()+csc.encode()).digest()
url_complementar = url + csc
url_hash = hashlib.sha1(url_complementar.encode()).digest()
url_hash = base64.b16encode(url_hash).decode()
url = url + '&cHashQRCode=' + url_hash.upper()
url_formatacao = "p="
url = url_formatacao + url + "|" + url_hash
#if cpf is None:
# url = 'chNFe={}&nVersao={}&tpAmb={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
# chave, VERSAO_QRCODE, tpamb, data.lower(), total, icms, digest.lower(), token)
#else:
# url = 'chNFe={}&nVersao={}&tpAmb={}&cDest={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
# chave, VERSAO_QRCODE, tpamb, cpf, data.lower(), total, icms, digest.lower(), token)
#url_hash = hashlib.sha1(url.encode()+csc.encode()).digest()
#url_hash = base64.b16encode(url_hash).decode()
#url = url + '&cHashQRCode=' + url_hash.upper()
# url_chave - Texto com a URL de consulta por chave de acesso a ser impressa no DANFE NFC-e.
# Informar a URL da “Consulta por chave de acesso da NFC-e”.
# A mesma URL que deve estar informada no DANFE NFC-e para consulta por chave de acesso
@ -753,6 +792,9 @@ class SerializacaoQrcode(object):
.replace('\n','').replace('&lt;','<').replace('&gt;','>').replace('amp;','')
nfe = etree.fromstring(tnfe)
# retorna nfe com o qrcode incluido NT2015/002 e qrcode
if return_qr:
return nfe, qrcode.strip()
# retorna apenas nfe com o qrcode incluido NT2015/002

2
pynfe/utils/flags.py

@ -12,7 +12,7 @@ NAMESPACE_BETHA = 'http://www.betha.com.br/e-nota-contribuinte-ws'
VERSAO_PADRAO = '4.00'
VERSAO_QRCODE = '100'
VERSAO_QRCODE = '2'
TIPOS_DOCUMENTO = (
'CNPJ',

33
qrCode2Teste.py

@ -0,0 +1,33 @@
from pynfe.processamento.serializacao import SerializacaoQrcode
from pynfe.processamento.assinatura import AssinaturaA1
uf = 'pr'
homologacao = 'True'
certificado = "certificado/lam.pfx"
senha = '1234'
from lxml import etree
nfe = '<NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe versao="4.00" Id="NFe29180921011279000260650020000000531000001513"><ide><cUF>29</cUF><cNF>00000151</cNF><natOp>VENDA</natOp><mod>65</mod><serie>2</serie><nNF>53</nNF><dhEmi>2018-09-03T14:06:20-03:00</dhEmi><tpNF>1</tpNF><idDest>1</idDest><cMunFG>2918407</cMunFG><tpImp>4</tpImp><tpEmis>1</tpEmis><cDV>3</cDV><tpAmb>2</tpAmb><finNFe>1</finNFe><indFinal>1</indFinal><indPres>1</indPres><procEmi>0</procEmi><verProc>KYAN VERSAO 3.0</verProc></ide><emit><CNPJ>21011279000260</CNPJ><xNome>DONDON COM. VAREJISTA DE CALC. LTDA ME</xNome><xFant>MUNDI SHOES SHOPPING</xFant><enderEmit><xLgr>RODOVIA LOMANTO JUNIOR</xLgr><nro>S N</nro><xCpl>SHOPP.JUA GARDEN 1-B</xCpl><xBairro>JOAO XXIII</xBairro><cMun>2918407</cMun><xMun>JUAZEIRO</xMun><UF>BA</UF><CEP>48900365</CEP><cPais>1058</cPais><xPais>BRASIL</xPais><fone>7436148567</fone></enderEmit><IE>146961742</IE><CRT>1</CRT></emit><det nItem="1"><prod><cProd>001 0205 622-23</cProd><cEAN>SEM GTIN</cEAN><xProd>NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL</xProd><NCM>64041900</NCM><CEST>2803800</CEST><CFOP>5102</CFOP><uCom>PAR</uCom><qCom>1.0000</qCom><vUnCom>78.90</vUnCom><vProd>78.90</vProd><cEANTrib>SEM GTIN</cEANTrib><uTrib>PAR</uTrib><qTrib>1.0000</qTrib><vUnTrib>78.90</vUnTrib><indTot>1</indTot></prod><imposto><ICMS><ICMSSN102><orig>0</orig><CSOSN>102</CSOSN></ICMSSN102></ICMS><PIS><PISOutr><CST>99</CST><qBCProd>0.0000</qBCProd><vAliqProd>0.0000</vAliqProd><vPIS>0.00</vPIS></PISOutr></PIS><COFINS><COFINSOutr><CST>99</CST><qBCProd>0.0000</qBCProd><vAliqProd>0.0000</vAliqProd><vCOFINS>0.00</vCOFINS></COFINSOutr></COFINS></imposto></det><total><ICMSTot><vBC>0.00</vBC><vICMS>0.00</vICMS><vICMSDeson>0.00</vICMSDeson><vFCPUFDest>0.00</vFCPUFDest><vICMSUFDest>0.00</vICMSUFDest><vICMSUFRemet>0.00</vICMSUFRemet><vFCP>0.00</vFCP><vBCST>0.00</vBCST><vST>0.00</vST><vFCPST>0.00</vFCPST><vFCPSTRet>0.00</vFCPSTRet><vProd>78.90</vProd><vFrete>0.00</vFrete><vSeg>0.00</vSeg><vDesc>0.00</vDesc><vII>0.00</vII><vIPI>0.00</vIPI><vIPIDevol>0.00</vIPIDevol><vPIS>0.00</vPIS><vCOFINS>0.00</vCOFINS><vOutro>0.00</vOutro><vNF>78.90</vNF><vTotTrib>0.00</vTotTrib></ICMSTot></total><transp><modFrete>9</modFrete></transp><pag><detPag><tPag>01</tPag><vPag>78.90</vPag></detPag></pag></infNFe></NFe>'
nfe = etree.fromstring(nfe)
# # assinatura
a1 = AssinaturaA1(certificado, senha)
xml = a1.assinar(nfe)
# # token de homologacao
token = '000001'
# # # csc de homologação
csc = '5AB5F679-EA09-42CA-803B-6625B6107E2E'
# # # gera e adiciona o qrcode no xml NT2015/003
xml_com_qrcode = SerializacaoQrcode().gerar_qrcode(token, csc, xml,qrcode_emissao="1")
print(etree.tostring(xml_com_qrcode, encoding='unicode').replace('\n','').replace('&lt;','<').replace('&gt;','>').replace('amp;',''))
Loading…
Cancel
Save