2017-09-24 26 views
0

QuickBooks Web连接器将QuickBooks found an error when parsing the provided XML text stream.消息发送到我的receiveResponseXML方法,即使我的xml在qb中检出* XML验证器。我在下面的QBTalker类中包含了authenticate和sendRequestXML方法(其他所需的方法也在类中; QB Web Connector在发送hresult值0x80040400和消息值QuickBooks found an error when parsing the provided XML text stream.到receiveResponseXML之前与clientVersion进行通信,验证,sendRequestXML) :QuickBooks Web连接器:“QuickBooks在解析提供的XML文本流时发现错误”,但qb * XML Validator说xml有效

class QBTalker(ServiceBase): 
    qbxml_version = '' 
    request_seq_no = 0 
    ticket_id = '' 
    @srpc(String, String, _returns=Iterable(String)) 
    def authenticate(user, pswd): 
     #ticket_id = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(50)) 
     QBTalker.ticket_id = 'COMPANY NAME IN QUICKBOOKS' 
     for each in [QBTalker.ticket_id, '', '', '']: 
      yield each 
    @srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String) 
    def sendRequestXML(id, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers): 
     '''if id != QBTalker.ticket_id: 
      return -1 
     else: 
''' 
     qbxml_version = str(qbXMLMajorVers) + '.' + str(qbXMLMinorVers) 
     QBTalker.request_seq_no += 1 
     xml = '''<?xml version="1.0" encoding="utf-8"?> 
<?qbxml version="13.0"?> 
<QBXML> 
    <QBXMLMsgsRq onError="stopOnError"> 
     <CustomerQueryRq requestID="2"> 
      <FullName>COMPANY NAME IN QUICKBOOKS</FullName> 
     </CustomerQueryRq> 
    </QBXMLMsgsRq> 
</QBXML> 
''' 
     QBTalker.request_seq_no = 99 
     root = lxml.etree.fromstring(xml) 
     return lxml.etree.tostring(root) 
    @srpc(String, String, String, String, _returns=Integer8) 
    def receiveResponseXML(ticket, response, hresult, message): 
     response = response 
     hresult = hresult 
     message = message 
     return 100 
    @srpc(String, String, String, _returns=String) 
    def connectionError(ticket, hresult, message): 
     print("QuickBooks Web Connector says a connection error has occurred.") 
     print("hresult is " + hresult) 
     print("message is " + message) 
    @srpc(String, _returns=String) 
    def getLastError(ticket): 
     print("QuickBooks Web Connector is asking for the last error on ticket id " + ticket if ticket else "None") 
     return ticket 
    @srpc(String, _returns=String) 
    def closeConnection(ticket): 
     print("QuickBooks Web Connector is closing the connection for ticket id " + ticket if ticket else "None") 
     return ticket 
if __name__=='__main__': 
    logging.basicConfig(level=logging.DEBUG) 
    logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG) 
app = Application([QBTalker], tns='http://developer.intuit.com/', 
     in_protocol=Soap11(validator='lxml'), 
     out_protocol=Soap11(encoding='UTF-8', xml_declaration=True), 
    ) 
wsgi_app = WsgiApplication(app) 
server = make_server('localhost', 7789, wsgi_app) 
server.serve_forever() 

UPDATE: 好吧,我得到了“QuickBooks的解析提供的XML文本流时发现了一个错误”错误通过添加以下import语句

from spyne.model.primitive import AnyXml 

,改变装饰走开线我上面的高清sendRequestXML线从

@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String) 

@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml) 

我想这可能MIME类型从text/html的为text/xml改变,但我不知道。我也改变

def authenticate(user, pswd): 

def authenticate(strUserName, strPassword): 

def sendRequestXML(id, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers): 

def sendRequestXML(ticket, strHCPResponse, strCompanyFileName, qbXMLCountry, qbXMLMajorVers, qbXMLMinorVers): 

我现在明白的函数参数的名称是特定的。

但是,我仍然没有得到任何从我的查询返回。任何人都可以指出我应该改变什么?我在上面代码中的QUICKBOOKS中的公司名称的!CUST iif文件中使用的名称字段的值相同。预先感谢您的帮助。

回答

0

虽然改变

@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=String) 

@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml) 

固定的XML错误我得到,我仍然没有收到任何反馈给我的查询。从那时起,我安装了RawCap.exe并查看了我的Web服务和QuickBooks Web Connector之间的通信,并将它与创建客户时QuickBooks Php DevKit和Web Connector之间的通信进行了比较。我注意到我的web服务正在剥离数据包中的<?qbxml version="13.0" ?>标签。因此,我改变

@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=AnyXml) 

@srpc(String, String, String, String, UnsignedInteger, UnsignedInteger, _returns=Unicode) 

,我改变了

root = lxml.etree.fromstring(xml) 
return lxml.etree.tostring(root) 

#root = lxml.etree.fromstring(xml) 
#return lxml.etree.tostring(root) 
return xml 

app = Application([QBTalker], tns='http://developer.intuit.com/', 
     in_protocol=Soap11(validator='soft'), 
     out_protocol=Soap11(), 
    ) 

app = Application([QBTalker], tns='http://developer.intuit.com/', 
     in_protocol=Soap11(validator='soft'), 
     out_protocol=Soap11(encoding='UTF-8', xml_declaration=True), 
    ) 

,并开始工作。键似乎一直在删除lxml.etree解析并将修饰器函数中的返回类型从AnyXml(更改为String或Unicode),尽管我最初更改为使用lxml.etree解析的原因是因为我得到原始错误当返回的Unicode ...