将ASP.NET应用程序连接到QuickBooks Online Edition

时间:2009-07-07 15:30:42

标签: asp.net quickbooks quickbooks-online

我正在尝试创建一个连接到QuickBooks Online Edition的ASP.NET页面,读取几个值,并显示结果。到目前为止,我已经下载了QuickBooks SDK,但是我无法找到关于如何创建asp.net页面以连接到QuickBooks Online的简单分步示例。 QuickBooks SDK文档和SDK本身非常令人困惑和压倒性。任何人都知道一个简单的一步一步的教程,从哪里开始...或者可能是第一件事要做的提示。

4 个答案:

答案 0 :(得分:4)

Yishai的回答是部分正确,但不完全正确。

可以让您的ASP .NET应用程序登录并发出请求,而无需将用户发送到页面中的QuickBooks Online登录确保在将应用程序连接到QuickBooks Online Edition时正确设置安全首选项

在应用程序注册过程/连接过程中,它会询问您是否要通过以下提示打开或关闭登录安全性。如果您希望能够访问QuickBooks Online Edition数据而不,则必须告诉它您希望关闭登录安全性,以强制用户每次登录。提示符如下:

“你想打开登录安全性吗?”

您必须选择: “不。任何可以登录[应用程序名称]的人都可以使用连接”。

除此之外,Yishai对这个过程是正确的。简而言之,要重新进行迭代:

  • 注册QBOE帐户
  • 使用Intuit的AppReg服务注册您的集成应用程序
  • 访问特定链接以将AppReg应用程序绑定到您的QBOE帐户(请确保在询问时关闭登录安全性!)
  • 向Intuit的服务器发出HTTPS POST请求以使用Intuit将为您提供的连接票证进行登录
  • 发出HTTPS POST请求,将qbXML请求发送到Intuit的服务器,您可以使用它们在QuickBooks Online Edition中添加,修改,删除和查询记录。

我的QuickBooks development and integration wiki上有一些其他文档和一些示例请求,特别是QuickBooks Online Edition integration页面。

我已经构建了一个解决方案来完成你在PHP中所要求的,它可以在QuickBooks Online Edition中添加,修改和查询数据,而无需用户每次登录,它就像一个冠军。它在PHP购物车(VirtueMart)和QuickBooks Online Edition之间推送和提取订单数据。 PHP代码可在此处获得: QuickBooks PHP Framework

作为旁注,除非您非常熟悉生成SSL证书并通过HTTPS POST发送它们,否则使用DESKTOP通信模型而不是HOSTED模型可以省去很多麻烦。只需确保安全加密连接票证即可。

此外,Yishai的建议是:“一个是以编程方式点击他们的登录页面并提交凭证,就像你是一个用户一样。我确信它不是”支持“但它可能会起作用。”专门针对反对安全/开发人员指南Intuit和SDK提出。如果他们抓住你这样做,他们将禁止你的应用程序连接到QuickBooks。

答案 1 :(得分:4)

以下是我为实现这一目标而采取的所有步骤。特别感谢Keith Palmer提供了他的评论,答案和his website,这些确实帮助我实现了这一目标。

  1. http://appreg.quickbooks.com注册您的应用。这将为您提供您的App ID和应用程序名称。我使用了这些设置:

    • 目标应用:QBOE
    • 环境:生产
    • 应用程序类型:桌面

      • (使用桌面使得事情变得更容易,不需要证书)
    • 验证密钥将发送到您需要在此向导第2页上输入的电子邮件地址。

  2. 设置QBOE连接。在步骤1中完成注册应用程序后,您将拥有一个应用程序ID。在下面的网址中使用此ID设置您的QBOE连接:
    • https://login.quickbooks.com/j/qbn/sdkapp/confirm?serviceid=2004&appid=APP_ID
    • 注意:请务必将上述网址中的APP_ID替换为您在注册申请时创建的应用程序ID。
    • 向导将指导您完成以下步骤:
      1. 指定连接的名称。
      2. 授予访问权限 - 我提供了所有会计权利,因为这是最简单的。
      3. 指定登录安全性 - 我关闭了登录安全性。这很重要,因为它使得将xml更容易提交到QBOE,因为您不需要为每个用户获取会话票证。
      4. 然后,您将获得一个连接密钥。
  3. 此时您现在拥有 3条重要信息,以便访问您的QuickBooks在线版(QBOE)帐户。
    • 申请名称
    • 申请ID
    • 连接密钥
  4. 将XML发布到QBOE ,将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
            {
            }
        }
    
  5. 需要注意的事项:

    • 正如Keith Palmer指出的那样,qbxml版本需要为6.0(尽管IDN Unified On-Screen Reference显示为7.0)
    • 我需要包含onError =“continueOnError”属性。
    • 需要设置WebRequestObject.ContentLength属性。
    • 内容类型必须为“application / x-qbxml”
    • 最后我收到了很多“远程服务器返回错误:(400)错误请求。”除了最终没有帮助的异常,我最终能够将它们追溯到xml的错误。因此,如果您遇到此异常,请将xml视为问题的根源。

答案 2 :(得分:0)

QBSDK文档的第7章概述了你要做的事情(至少在我拥有的SDK的7.0版本中)。您必须打开测试帐户并获得连接其服务器的权限。

设置帐户后,基本身份验证过程包括将用户重定向到QuickBooks Online站点以进行登录,一旦用户完成此操作,QuickBooks将使用带有故障单的HTTPS帖子回拨您的应用程序,基本上是一个会话句柄,您可以将其用于您的请求,以便系统知道您已通过身份验证。当您得到该响应时,您将解析它并根据您返回的内容向系统发送您自己的登录请求。

然后(如果我正确理解了文档)你基本上是在使用QuickBooks请求进行xml文件的Https POSTS,并且你得到了你必须解析的XML响应以获得你想要的数据。

我希望能让你开始。

SDK的其余部分是文档(您需要知道如何形成请求并解析您的响应),其他一切都与如何与桌面产品通信有关。从其他文档中你唯一需要的是如何进行错误处理,这对于将数据发布到QuickBooks来说非常重要。如果您只是阅读,那么无关紧要(无论您的请求是否成功,您都不必担心是否需要重试或者是否会导致数据重复)。

编辑:鉴于您的具体用例,我看到两个选项。 (你并不疯狂,只是不是典型的QuickBooks Online场景)。

一种是以编程方式点击其登录页面并提交凭据,就像您是用户一样。我确信它不是“支持”但它可能会有用。

另一种方法是缓存结果(你可能应该这样做),并有一个管理界面,有人在线登录QuickBooks并每天早上或晚上更新结果或任何有意义的结果。

在大多数小型企业中,他们会选择第一种选择,但第二种选择会更加一致,稳健,并且如果您遇到问题,实际上会得到Intuit的支持。

答案 3 :(得分:-2)

这看起来非常接近您的需求:www.QuickbooksConnector.com

无法下载。