我正在尝试创建一个连接到 QuickBooks Online Edition、读取几个值并显示结果的 ASP.NET 页面。到目前为止,我已经下载了 QuickBooks SDK,但我一直无法找到有关如何创建 asp.net 页面以连接到 QuickBooks Online 的简单分步示例。QuickBooks SDK 文档和 SDK 本身非常令人困惑和不知所措。任何人都知道从哪里开始的简单分步教程......或者可能是关于首先要做的事情的提示。
4 回答
Yishai 的回答部分正确,但不完全正确。
如果您确保在将应用程序连接到 QuickBooks Online Edition 时正确设置安全首选项,您可以让您的 ASP .NET 应用程序登录并发出请求,而无需将用户发送到 QuickBooks Online 登录页面。
在应用程序注册过程/连接过程中,它会询问您是否要打开或关闭登录安全性,并提示如下。如果您希望能够访问 QuickBooks Online Edition 数据而不强制用户每次都登录,您必须告诉它您要关闭登录安全性。提示类似于:
“您要打开登录安全性吗?”
您必须选择:“否。任何可以登录[应用程序名称]的人都可以使用连接”。
除此之外,Yishai 对这个过程的看法是正确的。重申一遍,简而言之:
- 注册 QBOE 账户
- 使用 Intuit 的 AppReg 服务注册您的集成应用程序
- 访问特定链接以将您的 AppReg 应用程序绑定到您的 QBOE 帐户(确保在询问您时关闭登录安全性!)
- 使用连接票向 Intuit 的服务器发出 HTTPS POST 请求以登录 Intuit 将为您提供
- 发出 HTTPS POST 请求以将 qbXML 请求发送到 Intuit 的服务器,您可以使用这些请求在 QuickBooks Online Edition 中添加、修改、删除和查询记录。
我的QuickBooks 开发和集成 wiki上有一些附加文档和一些示例请求,特别是QuickBooks Online Edition 集成页面。
我已经构建了一个解决方案,可以满足您在 PHP 中的要求,它可以在 QuickBooks Online Edition 中添加、修改和查询数据,而无需用户每次都登录,它的工作原理就像一个冠军。它在 PHP 购物车 (VirtueMart) 和 QuickBooks Online Edition 之间推送和拉取订单数据。PHP 代码可在此处获得: QuickBooks PHP 框架
附带说明,除非您非常熟悉生成 SSL 证书并通过 HTTPS POST 发送它们,否则使用 DESKTOP 通信模型而不是 HOSTED 模型将为您省去很多麻烦。只需确保对您的连接票证进行安全加密即可。
此外,Yishai 的建议是:“一个是以编程方式访问他们的登录页面并提交凭据,就像您是用户一样。我确信它不受“支持”,但它可能会起作用。专门违反了 Intuit 和 SDK 规定的安全/开发人员指南。如果他们发现您这样做,他们将禁止您的应用程序连接到 QuickBooks。
这是我为使其正常工作而采取的所有步骤。特别感谢Keith Palmer的评论、回答和他的网站,这真的帮助我完成了这项工作。
在http://appreg.quickbooks.com注册您的应用程序。这将为您提供您的应用程序 ID 和应用程序名称。我使用了这些设置:
- 目标应用:QBOE
- 环境:生产
应用类型:桌面
- (就不需要证书而言,使用 Desktop 使事情变得更容易)
验证码将发送到您需要在本向导第 2 页输入的电子邮件地址。
- 设置您的 QBOE 连接。在步骤 1 中完成注册应用程序后,您将获得一个应用程序 ID。在下面的 url 中使用此 ID 来设置您的 QBOE 连接:
- https://login.quickbooks.com/j/qbn/sdkapp/confirm?serviceid=2004&appid=
APP_ID
- 注意:确保将上述 url 中的 APP_ID 替换为您注册应用程序时创建的应用程序 ID。
- 该向导将引导您完成以下步骤:
- 为您的连接指定一个名称。
- 授予访问权限 - 我授予所有会计权限,因为这是最简单的。
- 指定登录安全 - 我关闭了登录安全。这很重要,因为它使将 xml 提交到 QBOE 变得更加容易,因为您不需要为每个用户获取会话票证。
- 然后,您将获得一个连接密钥。
- https://login.quickbooks.com/j/qbn/sdkapp/confirm?serviceid=2004&appid=
- 此时,您现在拥有3 条重要信息,以便访问您的 QuickBooks Online Edition (QBOE) 帐户。
- 应用名称
- 应用程序 ID
- 连接键
将 XML与 3 条访问信息和实际请求一起发布到 QBOE 数据库中。这是将发布到 QBOE 网关的示例 c# 代码。这将返回 QuickBooks 数据库中的所有客户。确保使用您的应用程序名称、应用程序 ID 和连接密钥更新下面的 xml。
string requestUrl = null; requestUrl = "https://apps.quickbooks.com/j/AppGateway"; HttpWebRequest WebRequestObject = null; StreamReader sr = null; HttpWebResponse WebResponseObject = null; StreamWriter swr = null; try { WebRequestObject = (HttpWebRequest)WebRequest.Create(requestUrl); WebRequestObject.Method = "POST"; WebRequestObject.ContentType = "application/x-qbxml"; WebRequestObject.AllowAutoRedirect = false; string post = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <?qbxml version=""6.0""?> <QBXML> <SignonMsgsRq> <SignonDesktopRq> <ClientDateTime>%%CLIENT_DATE_TIME%%</ClientDateTime> <ApplicationLogin>APPLICATION_LOGIN</ApplicationLogin> <ConnectionTicket>CONNECTION_TICKET</ConnectionTicket> <Language>English</Language> <AppID>APP_ID</AppID> <AppVer>1</AppVer> </SignonDesktopRq> </SignonMsgsRq> <QBXMLMsgsRq onError=""continueOnError""> <CustomerQueryRq requestID=""2"" /> </QBXMLMsgsRq> </QBXML>"; post = post.Replace("%%CLIENT_DATE_TIME%%", DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(post); post = xmlDoc.InnerXml; WebRequestObject.ContentLength = post.Length; swr = new StreamWriter(WebRequestObject.GetRequestStream()); swr.Write(post); swr.Close(); WebResponseObject = (HttpWebResponse)WebRequestObject.GetResponse(); sr = new StreamReader(WebResponseObject.GetResponseStream()); string Results = sr.ReadToEnd(); } finally { try { sr.Close(); } catch { } try { WebResponseObject.Close(); WebRequestObject.Abort(); } catch { } }
需要注意的几点:
- 正如 Keith Palmer 所指出的,qbxml 版本需要为 6.0(即使 IDN 统一屏幕参考显示为 7.0)
- 我需要包含 onError="continueOnError" 属性。
- 需要设置 WebRequestObject.ContentLength 属性。
- 内容类型需要是“application/x-qbxml”
- 最后我收到很多“远程服务器返回错误:(400)错误请求。” 完全没有帮助的异常,但最后我能够将它们追踪到 xml 有问题。因此,如果您遇到此异常,请查看您的 xml 作为问题的根源。
QBSDK 文档的第 7 章概述了您必须做的事情(至少在我拥有的 7.0 版本的 SDK 中)。您必须开设一个测试帐户并获得连接到他们服务器的权限。
设置帐户后,基本身份验证过程包括将用户重定向到 QuickBooks Online 站点以登录,一旦用户完成此操作,QuickBooks 会使用带有票证的 HTTPS 帖子回调您的应用程序,这基本上是可用于请求的会话句柄,以便系统知道您已通过身份验证。当您收到该响应时,您会对其进行解析并根据您返回的内容将您自己的登录请求发送到系统。
然后(如果我对文档的理解正确的话)你基本上是在使用 QuickBooks 请求对 xml 文件进行 Https POSTS,并且你会得到必须解析的 XML 响应以获取所需的数据。
我希望这能让你开始。
SDK 的其余部分是文档(您将需要知道如何形成您的请求并解析您的响应),其他一切都与如何与桌面产品通信有关。从文档的其余部分中,您唯一需要的是如何进行错误处理,这仅在您将数据发布到 QuickBooks 时才真正重要。如果您只是在阅读,那没关系(您的请求成功或失败,您无需担心是否需要重试或是否会导致重复数据)。
编辑:鉴于您的特定用例,我看到两个选项。(你不是疯了,只是不是典型的 QuickBooks Online 场景)。
一种是以编程方式访问他们的登录页面并像您是用户一样提交凭据。我确定它不受“支持”,但它可能会起作用。
另一种是缓存结果(无论如何你都应该这样做)并有一个管理屏幕,有人确实在线登录 QuickBooks 并每天早上或晚上或任何有意义的更新结果。
在大多数小型企业中,他们会选择第一个选项,但如果您遇到问题,第二个选项将更加一致、稳健并且实际上得到 Intuit 的支持。
这看起来非常接近您的需要:www.QuickbooksConnector.com
还没来得及下载。