Quickbooks v3查询url返回错误

时间:2013-11-12 16:37:53

标签: quickbooks intuit-partner-platform quickbooks-online

首先 - 我的问题:

访问Quickbooks API时,v3(就像本周末由Intuit一直强迫我)我正在尝试访问日记条目(但以下问题仍存在于任何其他查询中)并且我正在尝试使用规定的查询?查询= SELECT * FROM JournalEntry(什么?)。

https://qb.sbfinance.intuit.com/v3/company/<id>/query?query=SELECT * FROM JournalEntry

我得到结果:

{"Fault":{"Error":[{"Message":"message=Exception authenticating OAuth; errorCode=003200; statusCode=401","code":"3200"}],"type":"AUTHENTICATION"},"requestId":"6f5e5f14af7d4867ad0d8f639ade7d04","time":"2013-11-12T16:10:44.724Z"}

其中,是的,告诉我身份验证时出错。但是,当我访问不包含这种荒谬的查询语法的URL时,一切正常:

https://qb.sbfinance.intuit.com/v3/company/<id>/journalentry/<id>

我在访问v2 API时遇到了类似的错误,这对我来说格式不好,但我看不出我的查询有什么问题。

因为我生成身份验证令牌等的代码对于这两种类型的请求都是相同的,所以我怀疑问题是我如何进行身份验证。类似地,“异常”告诉我,API没有识别出来的问题。可能是错误的URL格式。

我尝试用“+”和“%20”替换查询网址空间,这会返回相同的错误。

我正在使用python和rauth。代码适用于v2(但是在周末没有警告就弃用了,现在不再记录了。)

作为奖励,并且因为显然这是Intuit与客户沟通的主要模式:我很震惊,Intuit不再在他们的网站上提供私人支持票,并且他们依赖像SO这样的社区环境来提供支持。他们能做的最少的就是提供自己的支持。特别是如果我们付费使用API​​。这绝对是令人震惊的。

最重要的是,API返回不一致的响应(相同的请求将返回错误或有效结果,具体取决于......根本没有变化)。我通过他们的支持票据报告的错误,他们已经适当地忽略了。

哦,文档说要使用

https://quickbooks.api.intuit.com/v3/v3/company/companyID/query?query=selectStmt

,而API Explorer使用:

https://qb.sbfinance.intuit.com/v3/company/<id>/query?query=SELECT * FROM JournalEntry

任何人都知道我应该使用哪一个?

修改

对于失败的响应,我的请求标头是:

{
    'Content-Length': u'62',
    'Accept-Encoding': 'gzip,
    deflate,
    compress',
    'accept': 'application/json',
    'User-Agent': 'python-requests/1.2.3CPython/2.7.5Darwin/13.0.0',
    'Content-Type': 'application/x-www-form-urlencoded',
    'authorization': 'OAuthrealm="<companyId>",
    oauth_nonce="3ad98c5f71bc9f102cc31ac9815cb6d08994454e",
    oauth_timestamp="1384280420",
    oauth_consumer_key="<consumerKey>",
    oauth_signature_method="HMAC-SHA1",
    oauth_version="1.0",
    oauth_token="<oauthToken>",
    oauth_signature="<oauthSignature"'
}

我的网址是:

https://quickbooks.api.intuit.com/v3/company/<id>/query?query=SELECT+*+FROM+JournalEntry&

我的回复标题是:

{'content-length': '227', 'server': 'Apache/2.2.22 (Unix)', 'connection': 'close', 'date': 'Tue, 12 Nov 2013 18:20:20 GMT', 'content-type': 'application/json;charset=ISO-8859-1', 'www-authenticate': 'OAuth oauth_problem="signature_invalid"'}

我的签名哈希函数是正确的。它是Rauth使用的标准函数,适用于更多标准API调用(其中没有空格或SQL选择查询)。

4 个答案:

答案 0 :(得分:1)

事实证明,实际问题是Quickbooks文档在撰写本文时是错误的(2013/11/14)。

文档说查询URL需要GET请求,但实际情况并非如此。这在将SELECT语句作为POST请求正文的一部分提交时有效。

请点击此处了解详情:https://intuitpartnerplatform.lc.intuit.com/questions/786661-python-script-to-integrate-with-quickbook

答案 1 :(得分:1)

  1. 将网址传递给您的HTTP电话,不用编码:

    网址= https://quickbooks.api.intuit.com/v3/company/123456789/query?query=“从客户中选择*”

  2. 但是要构建签名,将参数与URL分开,然后单独编码,你应该得到:

    "GET" + "&" + URLEncode(https://quickbooks.api.intuit.com/v3/company/123456789/query) + "&" + URLEncode(query=Select%20%2A%20from%20Customer),其中选择%20%2A%20来自%20Customer是Select * from Customer

  3. 的编码

    请注意,在生成签名时,SQL会第二次编码

    Et瞧!我花了一个星期的时间,我知道我在说什么。

    (符号来自VBA语言,因此请根据需要进行替换)

答案 2 :(得分:0)

我曾使用Java devkit尝试过这个API调用。

JournalEntry je = GenerateQuery.createQueryEntity(JournalEntry.class);
String jeQuery = select($(je)).generate();
System.out.println("Query - " + jeQuery);
QueryResult JournalEntryRes = service.executeQuery(jeQuery);

Request URI : https://quickbooks.api.intuit.com/v3/company/688779980/query?query=SELECT+*+FROM+JournalEntry&

响应XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2013-11-12T09:50:39.836-08:00">
    <QueryResponse startPosition="1" maxResults="1" totalCount="1">
        <JournalEntry domain="QBO" sparse="false">
            <Id>22734</Id>
            <SyncToken>0</SyncToken>
            <MetaData>
                <CreateTime>2013-10-15T08:42:12-07:00</CreateTime>
                <LastUpdatedTime>2013-10-15T08:42:12-07:00</LastUpdatedTime>
            </MetaData>
            <TxnDate>2013-10-15</TxnDate>
            <Line>
                <Id>0</Id>
                <Amount>100.00</Amount>
                <DetailType>JournalEntryLineDetail</DetailType>
                <JournalEntryLineDetail>
                    <PostingType>Debit</PostingType>
                    <AccountRef name="Advertising">9</AccountRef>
                </JournalEntryLineDetail>
            </Line>
            <Line>
                <Id>1</Id>
                <Amount>100.00</Amount>
                <DetailType>JournalEntryLineDetail</DetailType>
                <JournalEntryLineDetail>
                    <PostingType>Credit</PostingType>
                    <AccountRef name="Advertising">9</AccountRef>
                </JournalEntryLineDetail>
            </Line>
            <Adjustment>false</Adjustment>
        </JournalEntry>
    </QueryResponse>
</IntuitResponse>

您也可以尝试从V3 QBO ApiExplorer进行此调用。

查询 - SELECT * FROM JournalEntry

由于

答案 3 :(得分:-1)

您需要对查询进行编码,但不需要对整个网址进行编码

https://quickbooks.api.intuit.com/v3/company/123456789/query?query=“&amp; URLEncode(”从客户中选择*“)

见这里解释的样本:

https://developer.intuit.com/docs/0100_quickbooks_online/0300_references/0000_programming_guide/0050_data_queries