【问题标题】:Update quickbooks invoice with php使用 php 更新 quickbooks 发票
【发布时间】:2014-05-20 18:21:39
【问题描述】:

我们需要使用 PHP (CakePHP 1.3) 在线更新快速手册中的单个发票。我环顾四周,唯一能找到的是“keith palmer php api”,对于我们想要完成的简单性质来说,这似乎有点过头了。

有人做到了吗?我不认为只需要对快速手册执行简单的 curl 即可更新发票吗?请指教。

【问题讨论】:

  • 那么你尝试过简单的 cURL 实现吗?你有什么具体问题?
  • 我没有尝试过 curl 实现,我很好奇是否存在,更简单的东西。
  • 你不会找到一个“简单”的实现,因为它不是一个非常简单的 API。它不像 CURL 那样简单,因为请求是 OAuth 签名的,并且您需要通过 3-legged OAuth 流程来获取访问令牌等。
  • 如果我理解正确的话。您必须在索引页面上登录 API 才能开始与 Quick Books 交谈?我只是想在 Quick Books Online 中更新发票。
  • 没有办法静默发布发票更新吗?

标签: php cakephp curl intuit-partner-platform quickbooks-online


【解决方案1】:

有人做到了吗?

是的!很多人!

我不认为只需要对快速手册执行简单的 curl 即可更新发票吗?

不幸的是,它确实需要更多的东西。

出于 3 个主要原因,它需要更多:

  1. Intuit 要求您通过 OAuth 对 QuickBooks Online 进行身份验证(只需一次)。 Curl 没有内置的 OAuth 支持,因此您需要使用某种库或代码来签署您的 OAuth 请求。 OAuth 不是一种微不足道的协议/签名机制。

  2. 要更新 QuickBooks Online 中的对象,您必须向 Intuit 发送最新的 SyncToken 值。最新的SyncToken 值只能通过 API 首先查询 QuickBooks 中的发票获取。即要进行更新,您必须首先能够查询。

  3. Intuit 要求您注册一个“应用程序”以连接到 QuickBooks Online。这提供了设置步骤并需要 OAuth 流的信息。

话虽如此,使用这个库:

真的不是很困难。

只需按照快速入门指南进行操作:

并查看进行发票更新的示例:

看起来像这样:

    $InvoiceService = new QuickBooks_IPP_Service_Invoice();

    // Get the existing invoice first (you need the latest SyncToken value)
    $invoices = $InvoiceService->query($Context, $realm, "SELECT * FROM Invoice WHERE Id = '34' ");
    $Invoice = $invoices[0];

    print_r($Invoice);

    $Invoice->setTxnDate(date('Y-m-d'));  // Update the invoice date to today's date 

    if ($resp = $InvoiceService->update($Context, $realm, $Invoice->getId(), $Invoice))
    {
        print('&nbsp; Updated!<br>');
    }

【讨论】:

  • 感谢您的详细回复。很有帮助!
  • 再次感谢您,我不了解 OAuth 流程及其工作原理。一旦我坐下来通读所有内容,我就会对所有内容有了更清晰和更好的理解。非常感谢您的帮助。
【解决方案2】:

您可以参考以下步骤使用 IPP 的官方 PHP sdk 与 QBO V3 REST API 进行通信。

要开始使用 QB API 进行开发,您需要在 Intuit 的 appcenter 中创建一个 IA 应用程序。

从上面的链接你会得到 - apptoken、consumer key 和 consumer Secret。您可以在 IPPOAuthPlayground(PFB 链接)中使用上述 3 个密钥来获取与您的 QB Online 帐户对应的访问令牌和访问密钥。

使用上述令牌,您可以针对您的 QB Online 帐户调用任何 REST 端点。

PHP 开发工具包在这里可用。

PHP 开发包用户指南

【讨论】:

  • 谢谢,这也很有帮助。
【解决方案3】:

完成!在 CakePHP 1.3 中,我们将 Keith Palmers API 放在了 webroot 目录中。一旦获得授权,我们就会在支付控制器中添加以下功能。

    function updateQBInvoice($invoiceNumber = null, $depositAmount = null) {            
        include(APP."webroot".DS."quickbooks-php".DS."docs".DS."example_app_ipp_v3".DS."config.php");
        $IPP = new QuickBooks_IPP($dsn);
        $creds = $IntuitAnywhere->load($the_username, $the_tenant);
        $IPP->authMode(QuickBooks_IPP::AUTHMODE_OAUTH, $the_username, $creds);  
        $realm = $creds['qb_realm'];

        if ($Context = $IPP->context()) {
            $IPP->version(QuickBooks_IPP_IDS::VERSION_3);
            $InvoiceService = new QuickBooks_IPP_Service_Invoice();
            $invoices = $InvoiceService->query($Context, $realm, "SELECT * FROM Invoice");

            foreach ($invoices as $Invoice) {
                $docNumber = $Invoice->getDocNumber();
                if ($docNumber == $invoiceNumber) {

                    /* Set the invoice as paid. */
                    $Invoice->setDeposit($depositAmount);

                    if ($resp = $InvoiceService->update($Context, $realm, $Invoice->getId(), $Invoice)) {
                        echo '&nbsp; Updated!<br>';
                    } else {
                        echo '&nbsp; ' . $InvoiceService->lastError() . '<br>';
                    }
                }
            }               
        } else {
            echo 'Unable to load a context...?';
        }
    }

我想有更好的方法来获取发票,但我还没有发现。我尝试将查询调整为“SELECT * FROM Invoices WHERE DocNumber=XXX”,但这不起作用。

感谢大家的帮助,谢谢!

【讨论】:

  • SELECT * FROM Invoice WHERE DocNumber = '您的文件编号'
  • 上述查询无效。它返回一个空对象/结果。我发现可行的唯一方法是检索所有发票并循环查找我想要的发票。这是一个错误吗?
  • 它对我来说很好用——我们每天确实会做几千次这样的查询。发布 $InvoiceService->lastRequest() 和 $InvoiceService->lastResponse() 的输出,也许有人可以提供帮助。
  • @KeithPalmer-consolibyte 我已经发布了响应和请求。
【解决方案4】:

@基思

请求:

   [GET https://quickbooks.api.intuit.com/v3/company/210896252/query?query=SELECT+%2A+FROM+Invoice+WHERE+DocNumber%3D2060 HTTP/1.1
    Content-Type: text/plain
    Authorization: OAuth realm="", oauth_signature_method="HMAC-SHA1", oauth_signature="xxx",  oauth_nonce="gZxqN", oauth_timestamp="1400779429", oauth_token="xxx", oauth_consumer_key="xxx", oauth_version="1.0"

    ]

回复:

[HTTP/1.1 200 OK
Date: Thu, 22 May 2014 17:23:49 GMT
intuit_tid: 6f7b9023-3c8e-401c-9028-711300475720
Content-Length: 327
Via: 1.1 ipp-gateway-.net
Content-Type: application/xml;charset=UTF-8
Content-Encoding: gzip
QBO-Version: 73.223
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private
Expires: 0

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2014-05-22T10:23:50.031-07:00"><Fault type="ValidationFault"><Error code="4000"><Message>Error parsing query</Message><Detail>QueryParserError: Encountered &quot; &lt;INTEGER&gt; &quot;2060 &quot;&quot; at line 1, column 39.
Was expecting one of:
    &quot;false&quot; ...
    &quot;true&quot; ...
    </Detail></Error></Fault></IntuitResponse>]

【讨论】:

  • 在您的浏览器中查看 > 源代码。您没有发布整个响应或请求。此外,您需要将此作为评论添加到我的答案中,而不是作为一个完整的单独答案。或者,如果您更容易使用论坛,请转到 consolibyte.com/forum
  • @KeithPalmer-consolibyte 我已经用正确的信息更新了帖子。
  • 再看我发的查询。请注意,“您的文档编号”周围有“单引号”。
  • 正确:SELECT * FROM Invoice WHERE DocNumber = '1234'
  • 不正确:SELECT * FROM Invoice WHERE DocNumber = 1234
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多