|
|
@ -8,6 +8,7 @@ from pynfe.utils.webservices import NFCE |
|
|
import base64 |
|
|
import base64 |
|
|
import hashlib |
|
|
import hashlib |
|
|
from datetime import datetime |
|
|
from datetime import datetime |
|
|
|
|
|
import re |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Serializacao(object): |
|
|
class Serializacao(object): |
|
|
@ -673,7 +674,7 @@ class SerializacaoXML(Serializacao): |
|
|
|
|
|
|
|
|
class SerializacaoQrcode(object): |
|
|
class SerializacaoQrcode(object): |
|
|
""" Classe que gera e serializa o qrcode de NFC-e no xml """ |
|
|
""" 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 """ |
|
|
""" Classe para gerar url do qrcode da NFC-e """ |
|
|
# Procura atributos no xml |
|
|
# Procura atributos no xml |
|
|
ns = {'ns':NAMESPACE_NFE} |
|
|
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] |
|
|
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() |
|
|
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: |
|
|
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_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. |
|
|
# 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”. |
|
|
# 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 |
|
|
# 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('<','<').replace('>','>').replace('amp;','') |
|
|
.replace('\n','').replace('<','<').replace('>','>').replace('amp;','') |
|
|
nfe = etree.fromstring(tnfe) |
|
|
nfe = etree.fromstring(tnfe) |
|
|
# retorna nfe com o qrcode incluido NT2015/002 e qrcode |
|
|
# retorna nfe com o qrcode incluido NT2015/002 e qrcode |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if return_qr: |
|
|
if return_qr: |
|
|
return nfe, qrcode.strip() |
|
|
return nfe, qrcode.strip() |
|
|
# retorna apenas nfe com o qrcode incluido NT2015/002 |
|
|
# retorna apenas nfe com o qrcode incluido NT2015/002 |
|
|
|