2

首先 - 我的问题:

访问 Quickbooks API 时,v3(本周末被 Intuit 强加给我)我正在尝试访问日记条目(但以下问题在任何其他查询中仍然存在)并且我正在尝试使用规定的查询? query=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”替换查询 URL 空格,这会返回相同的错误。

我正在使用 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

4 回答 4

1

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

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

有关详细信息,请参见此处:https ://intuitpartnerplatform.lc.intuit.com/questions/786661-python-script-to-integrate-with-quickbook

于 2013-11-14T16:26:15.147 回答
1
  1. 将 URL 传递给您的 HTTP 调用而不进行编码:

    URL = 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), 其中 Select%20%2A%20from%20Customer 是 Select * from Customer 的编码

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

瞧!我花了一周的时间,我知道我在说什么。

(符号来自 VBA 语言,因此请酌情替换)

于 2017-07-10T16:29:38.297 回答
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

谢谢

于 2013-11-12T17:55:46.577 回答
-1

您需要对查询进行编码,但不是对整个 url

https://quickbooks.api.intuit.com/v3/company/123456789/query?query= " & URLEncode("Select * from Customer")

请参阅此处解释的示例:

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

于 2017-06-28T13:12:18.787 回答