NFSe- SP : Mensagem XML de Pedido do serviço sem conteúdo

1,107 views
Skip to first unread message

Carlos Silveira

unread,
Feb 24, 2016, 5:01:27 PM2/24/16
to Python Brasil
Olá, alguém teve este problema ?

Testei a assinatura do arquivo , tudo certo.

Fiz a validação do schema, tdo certo.


DEBUG:suds.transport.http:received:
CODE: 200
HEADERS: {'content-length': '842', 'x-powered-by': 'ASP.NET', 'x-aspnet-version': '2.0.50727', 'server': 'Microsoft-IIS/8.5', 'connection': 'close', 'cache-control': 'private, max-age=0', 'date': 'Wed, 24 Feb 2016 21:45:30 GMT', 'content-type': 'application/soap+xml; charset=utf-8'}
MESSAGE:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><ConsultaCNPJResponse xmlns="http://www.prefeitura.sp.gov.br/nfe"><RetornoXML>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;RetornoConsultaCNPJ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.prefeitura.sp.gov.br/nfe"&gt;&lt;Cabecalho Versao="1" xmlns=""&gt;&lt;Sucesso&gt;false&lt;/Sucesso&gt;&lt;/Cabecalho&gt;&lt;Erro xmlns=""&gt;&lt;Codigo&gt;1102&lt;/Codigo&gt;&lt;Descricao&gt;Mensagem XML de Pedido do serviço sem conteúdo.&lt;/Descricao&gt;&lt;/Erro&gt;&lt;/RetornoConsultaCNPJ&gt;</RetornoXML></ConsultaCNPJResponse></soap:Body></soap:Envelope>
DEBUG:suds.client:HTTP succeeded:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><ConsultaCNPJResponse xmlns="http://www.prefeitura.sp.gov.br/nfe"><RetornoXML>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;RetornoConsultaCNPJ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.prefeitura.sp.gov.br/nfe"&gt;&lt;Cabecalho Versao="1" xmlns=""&gt;&lt;Sucesso&gt;false&lt;/Sucesso&gt;&lt;/Cabecalho&gt;&lt;Erro xmlns=""&gt;&lt;Codigo&gt;1102&lt;/Codigo&gt;&lt;Descricao&gt;Mensagem XML de Pedido do serviço sem conteúdo.&lt;/Descricao&gt;&lt;/Erro&gt;&lt;/RetornoConsultaCNPJ&gt;</RetornoXML></ConsultaCNPJResponse></soap:Body></soap:Envelope>

Partes do log:

DEBUG:suds.client:sending to (https://nfe.prefeitura.sp.gov.br/ws/lotenfe.asmx)
message:
<suds.sax.document.Document instance at 0x7f947d7a8050>
DEBUG:suds.client:headers = {'SOAPAction': '"http://www.prefeitura.sp.gov.br/nfe/ws/consultaCNPJ"', 'Content-Type': 'text/xml; charset=utf-8'}
DEBUG:suds.transport.http:sending:
URL: https://nfe.prefeitura.sp.gov.br/ws/lotenfe.asmx
HEADERS: {'SOAPAction': '"http://www.prefeitura.sp.gov.br/nfe/ws/consultaCNPJ"', 'Content-Type': 'text/xml; charset=utf-8', 'Content-type': 'text/xml; charset=utf-8', 'Soapaction': '"http://www.prefeitura.sp.gov.br/nfe/ws/consultaCNPJ"'}
MESSAGE:
<?xml version="1.0" encoding="UTF-8"?><soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap12:Body><ConsultaCNPJRequest xmlns="http://www.prefeitura.sp.gov.br/nfe">&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;p1:PedidoConsultaCNPJ xmlns:p1=&quot;http://www.prefeitura.sp.gov.br/nfe&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;&lt;Cabecalho Versao=&quot;1&quot;&gt;&lt;CPFCNPJRemetente&gt; &lt;CNPJ&gt;08123456000111&lt;/CNPJ&gt;&lt;/CPFCNPJRemetente&gt;&lt;/Cabecalho&gt;&lt;CNPJContribuinte&gt;
       &lt;CNPJ&gt;08123456000170&lt;/CNPJ&gt;
.....
cRvL0wvcA+I=&lt;/X509Certificate&gt;
&lt;/X509Data&gt;
&lt;/KeyInfo&gt;
&lt;/Signature&gt;&lt;/p1:PedidoConsultaCNPJ&gt;
</ConsultaCNPJRequest></soap12:Body></soap12:Envelope>

Linux - Junior Polegato

unread,
Feb 25, 2016, 8:18:18 AM2/25/16
to python...@googlegroups.com
Em 24-02-2016 19:01, Carlos Silveira escreveu:
> Olá, alguém teve este problema ?
> Testei a assinatura do arquivo , tudo certo.
> Fiz a validação do schema, tdo certo.
> [...]

Olá!

Reparei que o seu XML enviado está cheio de espaços extras e
quebras de linhas, tente então assinar e enviar este sem essas quebras
de linhas e espaços desnecessários, isto é, na forma canônica do XML.

--

[]'s

Junior Polegato

Carlos Silveira

unread,
Feb 25, 2016, 8:44:30 AM2/25/16
to Python Brasil
Obrigado pela resposta.

Pode me dar uma dica de como posso fazer isso ?

Linux - Junior Polegato

unread,
Feb 25, 2016, 9:23:45 AM2/25/16
to python...@googlegroups.com
Em 25-02-2016 10:44, Carlos Silveira escreveu:
Obrigado pela resposta.
Pode me dar uma dica de como posso fazer isso ?

Em quinta-feira, 25 de fevereiro de 2016 10:18:18 UTC-3, Junior Polegato - Linux escreveu:
Em 24-02-2016 19:01, Carlos Silveira escreveu:
> Olá, alguém teve este problema ?
> Testei a assinatura do arquivo , tudo certo.
> Fiz a validação do schema, tdo certo.
> [...]

         Reparei que o seu XML enviado está cheio de espaços extras e
quebras de linhas, tente então assinar e enviar este sem essas quebras
de linhas e espaços desnecessários, isto é, na forma canônica do XML.

Olá!

        Não sei exatamente como está trabalhando com o XML, mas eu usando SUDs, ele quebra e endenta, então refiz as funções que serializam o XML para enviar, veja em [1]

[1] https://github.com/JuniorPolegato/pole/blob/master/fontes/pole/PoleNFe.py#L273

--

[]'s

Junior Polegato

Linux - Junior Polegato

unread,
Feb 25, 2016, 9:32:29 AM2/25/16
to python...@googlegroups.com
Em 25-02-2016 11:23, Linux - Junior Polegato escreveu:
        Não sei exatamente como está trabalhando com o XML, mas eu usando SUDs, ele quebra e endenta, então refiz as funções que serializam o XML para enviar, veja em [1]
[1] https://github.com/JuniorPolegato/pole/blob/master/fontes/pole/PoleNFe.py#L273

Em tempo, talvez fazer apenas isso no início deve funcionar:

from suds.sax.element import Element as E
E.str = E.plain

--

[]'s

Junior Polegato

Carlos Silveira

unread,
Feb 25, 2016, 11:44:47 AM2/25/16
to Python Brasil
Removi , abaixo o xml , o retorno e o erro :

<?xml version="1.0" encoding="UTF-8"?><soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap12:Body><ConsultaCNPJRequest xmlns="http://www.prefeitura.sp.gov.br/nfe"><p1:PedidoConsultaCNPJ xmlns:p1="http://www.prefeitura.sp.gov.br/nfe"><Cabecalho Versao="1"><CPFCNPJRemetente><CNPJ>08123456000111</CNPJ></CPFCNPJRemetente></Cabecalho><CNPJContribuinte><CNPJ>05123456000109</CNPJ></CNPJContribuinte><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>zUvIpXSH6HXhULghnD5M6txDzBk=</DigestValue></Reference></SignedInfo><SignatureValue>AxfiBgTa3ptKiJPz3uxlA3I20jdkVM/RykzWC7Y7JUJCAIs2X1OluFH3FuNgA0z200H6GZ3QsLL4yPoxuV24JTlhUcby4isftQp6uorpsxtXEAqju/EGu9mS2eFNaNrvKtVvB89fkaS11ICMyMRRdJRKZbGajmHXSfu82Lqi9ll0uL14srGyvEo6pb2GxQLjDainjoA6XSiWTxesg6fMurs9UZzvOhIaz0kBDKUSTcoXVu6LQf/ogGVq9lDUjq8yI+blaSDsOYI9N4oiHhzyX6afyzHs1Bf6D2/9g4lE/f8X2fJCTI1cvXrDw5s/x2jqXApefLkcNCfzOBgMlYf72w==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></p1:PedidoConsultaCNPJ></ConsultaCNPJRequest></soap12:Body></soap12:Envelope>

DEBUG:suds.transport.http:received:
CODE: 200
HEADERS: {'content-length': '842', 'x-powered-by': 'ASP.NET', 'x-aspnet-version': '2.0.50727', 'server': 'Microsoft-IIS/8.5', 'connection': 'close', 'cache-control': 'private, max-age=0', 'date': 'Thu, 25 Feb 2016 16:38:32 GMT', 'content-type': 'application/soap+xml; charset=utf-8'}




<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><ConsultaCNPJResponse xmlns="http://www.prefeitura.sp.gov.br/nfe"><RetornoXML>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;RetornoConsultaCNPJ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.prefeitura.sp.gov.br/nfe"&gt;&lt;Cabecalho Versao="1" xmlns=""&gt;&lt;Sucesso&gt;false&lt;/Sucesso&gt;&lt;/Cabecalho&gt;&lt;Erro xmlns=""&gt;&lt;Codigo&gt;1102&lt;/Codigo&gt;&lt;Descricao&gt;Mensagem XML de Pedido do serviço sem conteúdo.&lt;/Descricao&gt;&lt;/Erro&gt;&lt;/RetornoConsultaCNPJ&gt;</RetornoXML></ConsultaCNPJResponse></soap:Body></soap:Envelope>
ERROR:suds.client:<suds.sax.document.Document instance at 0x7f14e76a7200>
Traceback (most recent call last):
  File "https_consultaCnpj.py", line 424, in <module>
    print c.service.ConsultaCNPJ(__inject={'msg':message})
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 521, in __call__
    return client.invoke(args, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 761, in invoke
    return self.send(_parse(msg))
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 621, in send
    original_soapenv=original_soapenv)
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 685, in process_reply
    self.method, replyroot)
  File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py", line 134, in get_reply
    soapenv.promotePrefixes()
AttributeError: 'NoneType' object has no attribute 'promotePrefixes'
Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x7f14efe47668> ignored

Carlos Silveira

unread,
Feb 25, 2016, 1:15:14 PM2/25/16
to Python Brasil
Estou executando isto, pra chegar neste resultado :

 consulta_cnpj.py

# -*- encoding: utf-8 -*-

import re
import urllib2, httplib, socket
import os.path
import logging
import libxml2
import xmlsec
import suds.bindings
import xml.etree.ElementTree as ET
from suds.sax.text import Raw
from suds.client import Client
from uuid import uuid4
from lxml import etree
from suds.transport.http import HttpTransport, Reply, TransportError
from suds.plugin import MessagePlugin
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

class base_nfse(object):

    def __init__(self, arquivo, senha):
        self.arquivo = arquivo
        self.senha = senha

    def _checar_certificado(self):
        if not os.path.isfile(self.arquivo):
            raise Exception('Caminho do certificado nao existe.')

    def _inicializar_cripto(self):
        libxml2.initParser()
        libxml2.substituteEntitiesDefault(1)

        xmlsec.init()
        xmlsec.cryptoAppInit(None)
        xmlsec.cryptoInit()

    def finalizar_cripto(self):
        xmlsec.cryptoShutdown()
        xmlsec.cryptoAppShutdown()
        xmlsec.shutdown()

        libxml2.cleanupParser()


    def _save_pfx_certificate(self):
        pfx_tmp = '/tmp/' + uuid4().hex
        arq_temp = open(pfx_tmp, 'w')
        arq_temp.write(base64.b64decode(self.certificate))
        arq_temp.close()
        return pfx_tmp

    def converte_pfx_pem(self, pfx_stream, senha):
        try:
            certificado = crypto.load_pkcs12(pfx_stream, senha)
            privada = crypto.dump_privatekey(crypto.FILETYPE_PEM,
                certificado.get_privatekey())
            certificado = crypto.dump_certificate(crypto.FILETYPE_PEM,
                certificado.get_certificate())
        except Exception as e:
            if len(e.message) == 1 and len(e.message[0]) == 3 and \
                e.message[0][2] == 'mac verify failure':
                raise Exception('Senha inválida')
        raise
        return certificado, privada

    def render(self, base_path, template_path, **kwargs):
        #import pudb; pu.db
        env = Environment(loader=FileSystemLoader(os.path.join(base_path, 'templates')))
        env.filters["normalize"] = filters.normalize_str
        env.filters["format_percent"] = filters.format_percent
        env.filters["format_datetime"] = filters.format_datetime
        env.filters["format_date"] = filters.format_date

        template = env.get_template(template_path)

        # TODO Remover espaços e possíveis tags vazias
        xml = template.render(**kwargs)
        parser = etree.XMLParser(remove_blank_text=True, remove_comments=True)
        elem = etree.fromstring(xml, parser=parser)
        return etree.tostring(elem)

    def assina_xml(self, xml, reference, arquivo, chave):
        self._checar_certificado()
        self._inicializar_cripto()
        try:
            doc_xml = libxml2.parseMemory(
                xml.encode('utf-8'), len(xml.encode('utf-8')))

            signNode = xmlsec.TmplSignature(doc_xml, xmlsec.transformInclC14NId(),
                                            xmlsec.transformRsaSha1Id(), None)
           
            doc_xml.getRootElement().addChild(signNode)
           
            refNode = signNode.addReference(xmlsec.transformSha1Id(),
                                            None, reference, None)
           
            refNode.addTransform(xmlsec.transformEnvelopedId())
            refNode.addTransform(xmlsec.transformInclC14NId())
            keyInfoNode = signNode.ensureKeyInfo()
            keyInfoNode.addX509Data()

            dsig_ctx = xmlsec.DSigCtx()
            chave = xmlsec.cryptoAppKeyLoad(filename=str(arquivo),
                                            format=xmlsec.KeyDataFormatPkcs12,
                                            pwd=str(chave),
                                            pwdCallback=None,
                                            pwdCallbackCtx=None)

            dsig_ctx.signKey = chave
            dsig_ctx.sign(signNode)

            status = dsig_ctx.status
            dsig_ctx.destroy()

            if status != xmlsec.DSigStatusSucceeded:
                raise RuntimeError(
                    'Erro ao realizar a assinatura do arquivo; status: "' +
                    str(status) +
                    '"')
            NAMESPACE_SIG = 'http://www.w3.org/2000/09/xmldsig#'
            xpath = doc_xml.xpathNewContext()
            xpath.xpathRegisterNs('sig', NAMESPACE_SIG)
            certificados = xpath.xpathEval(
                '//sig:X509Data/sig:X509Certificate')
            for i in range(len(certificados) - 1):
                certificados[i].unlinkNode()
                certificados[i].freeNode()

            xml = doc_xml.serialize()
            return xml
        finally:
            doc_xml.freeDoc()
            #self._finalizar_cripto() # erro : urllib2.URLError: <urlopen error _ssl.c:320: Invalid SSL protocol variant specified.>

    def valida_schema(self, xml, arquivo_xsd):
        '''Função que valida um XML usando lxml do Python via arquivo XSD'''
        # Carrega o esquema XML do arquivo XSD
        xsd = etree.XMLSchema(file = arquivo_xsd)
        # Converte o XML passado em XML do lxml
        xml = etree.fromstring(str(xml))
        # Verifica a validade do xml
        erros = []
        if not xsd(xml):
            # Caso tenha erros, cria uma lista de erros
            for erro in xsd.error_log:
                erros.append({
                    'message' : erro.message,
                    'domain' : erro.domain,
                    'type' : erro.type,
                    'level' : erro.level,
                    'line' : erro.line,
                    'column' : erro.column,
                    'filename' : erro.filename,
                    'domain_name': erro.domain_name,
                    'type_name' : erro.type_name,
                    'level_name' : erro.level_name
                })
                print "erro %s, linha %s" % (erro.message, erro.line)
        # Retorna os erros, sendo uma lista vazia caso não haja erros
        return erros
- mostrar texto das mensagens anteriores -
class EnvelopeFixer(MessagePlugin):

    def sending(self, context):
        # removendo prefixo
        context.envelope = re.sub( 'ns[0-9]:', '', context.envelope )
        context.envelope = re.sub( '<SOAP-ENV:Header/>', '', str(context.envelope) )
        context.envelope = re.sub( '<VersaoSchema>', '', str(context.envelope) )
        context.envelope = re.sub( '</VersaoSchema>', '', str(context.envelope) )
        context.envelope = re.sub( '<?xml version="1.0"?>', '', str(context.envelope) )
        #context.envelope = re.sub( '</ConsultaCNPJRequest>', '', str(context.envelope) )
        return context.envelope

    def marshalled(self, context):
        #print context.envelope.str()
        #import pudb;pu.db
        envelope = context.envelope   
        envelope.name = 'Envelope'
        envelope.setPrefix('soap12')
        envelope.nsprefixes = {
           'xsi' : 'http://www.w3.org/2001/XMLSchema-instance',
           'soap12': 'http://www.w3.org/2003/05/soap-envelope',
           'xsd' : 'http://www.w3.org/2001/XMLSchema'
          
        }
        env1 = envelope.getRoot()
       
        consulta = envelope.getChildren()[1][0]                                                                            
        consulta.set("xmlns", "http://www.prefeitura.sp.gov.br/nfe")
        body_ele = envelope.getChildren()[1]
        body_ele.setPrefix("soap12")
        context.envelope = re.sub( 'ns[0-9]:', '', str(context.envelope) )
        context.envelope = re.sub( '<SOAP-ENV:Header/>', '', str(context.envelope) )
        context.envelope = re.sub( '<VersaoSchema>', '', str(context.envelope) )
        context.envelope = re.sub( '</VersaoSchema>', '', str(context.envelope) )
        return Raw(context)

# These lines enable debug logging; remove them once everything works.
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)

certificado = '/home/tas/cer/certificado_cer.pfx'
chave = '2015certificado'
host = 'nfe.prefeitura.sp.gov.br'
uri = '/ws/lotenfe.asmx?wsdl'

cert_temp = open(certificado, 'r').read()

pfx_tmp = '/tmp/' + uuid4().hex
arq_temp = open(pfx_tmp, 'w')
arq_temp.write(cert_temp)
arq_temp.close()

suds.bindings.binding.envns = ('SOAP-ENV',
    'http://www.w3.org/2003/05/soap-envelope')

base = base_nfse(pfx_tmp, chave)

t = HTTPSClientCertTransport('/home/tas/cer/key2.pem',
                             '/home/tas/cer/cert.pem')

envelope = EnvelopeFixer()    transport = t, plugins=[envelope])

#, plugins=[envelope]
#headers=headers,
# remove o cabecalho do SOAP   
#, nosend=True

#c.options.prettyxml = True  

#   
   
#print c

#xml = open('/home/tas/consulta_cnpj.xml','r')
#xml_send = xml.read()
                 
xml_send = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><p1:PedidoConsultaCNPJ xmlns:p1=\"http://www.prefeitura.sp.gov.br/nfe\"><Cabecalho Versao=\"1\"><CPFCNPJRemetente><CNPJ>08123456000111</CNPJ></CPFCNPJRemetente></Cabecalho><CNPJContribuinte><CNPJ>64123456000114</CNPJ></CNPJContribuinte></p1:PedidoConsultaCNPJ>"
 
xml_send = Raw(xml_send)                                     
                                           
reference = ""
xml_signed = base.assina_xml(xml_send, reference, pfx_tmp, str(chave))

arq_temp = open('/home/tas/xml_assinado.xml', 'w')
arq_temp.write(xml_signed)
arq_temp.close()

"""
message = \

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"\
"<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"\
"<soap12:Body>" + xml_send + \
"</soap12:Body>"\
"</soap12:Envelope>"   
"""

#TODO - arrumar para pasta do sistema
#valida_schema = base.valida_schema(xml_signed, '/home/tas/doc/fiscal/NFSe_SP/schemas/nfse/PedidoEnvioLoteRPS_v01.xsd')

valida_schema = base.valida_schema(xml_signed, '/home/tas/doc/fiscal/NFSe_SP/schemas/nfse/PedidoConsultaCNPJ_v01.xsd')

if len(valida_schema):
    erros = "Erro(s) no XML: \n"
    for erro in valida_schema:
        erros += erro['type_name'] + ': ' + erro['message'] + '\n'
    raise ValueError(erros)

#xml_signed = xml_signed.replace(
#                    '<?xml version="1.0" encoding="UTF-8"?>',
#                    '')

print xml_signed
xml_pronto = xml_signed
 
arq_temp = open('/home/tas/xml_soap.xml', 'w')
arq_temp.write(xml_pronto)
arq_temp.close()

#import pudb;pu.db

#arq_temp = open('/home/tas/xml_soap.xml', 'r')
#xml_pronto = arq_temp.read()
#xml_p = ET.ElementTree(xml_pronto)
#xml_str = ET.tostring(xml_pronto, encoding='utf8', method='xml')

try:
    x = c.service.ConsultaCNPJ(xml_pronto)
finally:
    base.finalizar_cripto()
   
"""
arq_temp = open('/home/tas/retorno.xml', 'w')
arq_temp.write(x)
arq_temp.close()
"""

#print x

Linux - Junior Polegato

unread,
Feb 25, 2016, 2:18:22 PM2/25/16
to python...@googlegroups.com
Em 25-02-2016 13:44, Carlos Silveira escreveu:
Removi , abaixo o xml , o retorno e o erro :
[...]

Olá!

        Olhando seu envelope SOAP 1.2 e o exigido em [1], vejo que no seu está faltando o seguinte:

                <VersaoSchema>int</VersaoSchema>
                <MensagemXML>string</MensagemXML>

        Então creio que o sistema que recebe o envelope e deve procurar seu XML dentro da tag "MensagemXML" e não encontra essa tag, por isso o erro de "Mensagem XML de Pedido do serviço sem conteúdo".

        Não tenho como analisar seu código agora, mas veja se consegue incluir essas tags no seu envelope SOAP 1.2.


[1] https://nfe.prefeitura.sp.gov.br/ws/lotenfe.asmx?op=ConsultaCNPJ

--

[]'s

Junior Polegato

Carlos Silveira

unread,
Feb 26, 2016, 9:12:42 AM2/26/16
to Python Brasil
Acredito que seja isso mesmo, vou tentar inserir isso, vc tem ideia de como fazer via MessagePlugin ?

Carlos Silveira

unread,
Feb 26, 2016, 11:35:37 AM2/26/16
to Python Brasil
Junior Polegato
   
   Muito obrigado, vc me ajudou muito, era este o problema mesmo, resolvi assim:


class EnvelopeFixer(MessagePlugin):

    def sending(self, context):
        # removendo prefixo
        context.envelope = re.sub( 'ns[0-9]:', '', context.envelope )
        context.envelope = re.sub( '<SOAP-ENV:Header/>', '', str(context.envelope) )
        context.envelope = re.sub( '</VersaoSchema>', '</MensagemXML>', str(context.envelope) )
        context.envelope = re.sub( '<VersaoSchema>', '<VersaoSchema>1</VersaoSchema><MensagemXML>', str(context.envelope) )

        return context.envelope

    def marshalled(self, context):
        #print context.envelope.str()      
        envelope = context.envelope   
        envelope.name = 'Envelope'
        envelope.setPrefix('soap12')
        envelope.nsprefixes = {
           'xsi' : 'http://www.w3.org/2001/XMLSchema-instance',
           'soap12': 'http://www.w3.org/2003/05/soap-envelope',
           'xsd' : 'http://www.w3.org/2001/XMLSchema'
          
        }
        body_ele = envelope.getChildren()[1]
        body_ele.setPrefix("soap12")
        consulta = envelope.getChildren()[1][0]
        consulta.set("xmlns", "http://www.prefeitura.sp.gov.br/nfe")
        return Raw(context)

Carlos Silveira

unread,
Feb 26, 2016, 12:20:47 PM2/26/16
to Python Brasil
Reply all
Reply to author
Forward
0 new messages