使用 QuickBooks Online (QBO) Intuit 合作伙伴平台 (IPP) DevKit 查询具有未结余额的所有发票

2023-12-06

我正在尝试使用 IPP 查询所有具有未结余额的发票,但我不断收到 0 个结果。我在代码中做错了什么吗?

这是我尝试使用应用的过滤执行的 C# 代码片段

        InvoiceQuery qboInvoiceQuery = new InvoiceQuery();
        int iMaxPageNumber = QUERY_MAX_PAGE_NUMBER;   // A Constant with the Maximum Page Number allowed in a query 
        int iResultsPerPage = QUERY_MAX_NUM_PER_PAGE_INVOICE; // A Constant with the Maximum Results per page 

        // Paging Information
        qboInvoiceQuery.PageNumber = QUERY_START_PAGE_NUMBER;
        qboInvoiceQuery.ResultsPerPage = iResultsPerPage;

        #region Query Filtering
        //////////////////////////////////////////////
        //   initial filtering via Query Criteria   //
        //////////////////////////////////////////////
        // Get only Open (Unpaid) Invoices
        qboInvoiceQuery.OpenBalance = (decimal)0.00;
        qboInvoiceQuery.SpecifyOperatorOption(FilterProperty.OpenBalance, FilterOperatorType.AFTER);
        //////////////////////////////////////////////
        // END initial filtering via Query Criteria //
        //////////////////////////////////////////////
        #endregion

        // Complete the Query calls to build the list
        IEnumerable<Invoice> results = qboInvoiceQuery.ExecuteQuery<Invoice>(_ServiceContext);
        IEnumerable<Invoice> qboInvoices = results;
        int iCount = results.Count();
        while (iCount > 0 && iCount == iResultsPerPage && qboInvoiceQuery.PageNumber <= iMaxPageNumber)
        {
            qboInvoiceQuery.PageNumber++;
            results = qboInvoiceQuery.ExecuteQuery<Invoice>(_ServiceContext);
            iCount = results.Count();
            qboInvoices = qboInvoices.Concat(results);
        }

*** UPDATE ***

我已经实现了 peterl 的答案,现在有以下代码。然而,我现在遇到了一个新问题,我的代码总是返回默认的 10 张发票,并且没有考虑到我的身体。即使我将其设置为不同的页码或 ResultsPerPage 值,我也会返回第一页和 10 个结果。有任何想法吗?

    private Dictionary<string, Invoice> GetUnpaidInvoicesDictionary(IdType CustomerId, bool bById = true)
    {
        Dictionary<string, Invoice> dictionary = new Dictionary<string, Invoice>();
        int iMaxPageNumber = 100;
        int iResultsPerPage = 100;

        try
        {
            OAuthConsumerContext consumerContext = new OAuthConsumerContext
            {
                ConsumerKey = _sConsumerKey,
                SignatureMethod = SignatureMethod.HmacSha1,
                ConsumerSecret = _sConsumerSecret
            };

            string sBaseURL = "https://oauth.intuit.com/oauth/v1";
            string sUrlRequestToken = "/get_request_token";
            string sUrlAccessToken = "/get_access_token";
            OAuthSession oSession = new OAuthSession(consumerContext, 
                                                        sBaseURL + sUrlRequestToken,
                                                        sBaseURL,
                                                        sBaseURL + sUrlAccessToken);

            oSession.AccessToken = new TokenBase
            {
                Token = _sAccessToken,
                ConsumerKey = _sConsumerKey,
                TokenSecret = _sAccessTokenSecret
            };

            int iPageNumber = QUERY_START_PAGE_NUMBER;
            string sCustomerId = CustomerId.Value;
            string sBodyBase = "PageNum={0}&ResultsPerPage={1}&Filter=OpenBalance :GreaterThan: 0.00 :AND: CustomerId :EQUALS: {2}";
            string sBody = String.Format(sBodyBase, iPageNumber, iResultsPerPage, sCustomerId);

            IConsumerRequest conReq = oSession.Request();
            conReq = conReq.Post().WithRawContentType("application/x-www-form-urlencoded").WithRawContent(System.Text.Encoding.ASCII.GetBytes(sBody)); ;
            conReq = conReq.ForUrl(_DataService.ServiceContext.BaseUrl + "invoices/v2/" + _DataService.ServiceContext.RealmId);
            conReq = conReq.SignWithToken();



            // Complete the Query calls to build the list
            SearchResults searchResults = (SearchResults)_DataService.ServiceContext.Serializer.Deserialize<SearchResults>(conReq.ReadBody());
            IEnumerable<Invoice> results = ((Invoices)searchResults.CdmCollections).Invoice;
            IEnumerable<Invoice> qboInvoices = results;
            int iCount = searchResults.Count;
            while (iCount > 0 && iCount == iResultsPerPage && iPageNumber <= iMaxPageNumber)
            {
                iPageNumber++;

                sBody = String.Format(sBodyBase, iPageNumber, iResultsPerPage, sCustomerId);
                conReq = oSession.Request();
                conReq = conReq.Post().WithRawContentType("application/x-www-form-urlencoded").WithRawContent(System.Text.Encoding.ASCII.GetBytes(sBody)); ;
                conReq = conReq.ForUrl(_DataService.ServiceContext.BaseUrl + "invoices/v2/" + _DataService.ServiceContext.RealmId);
                conReq = conReq.SignWithToken();

                searchResults = (SearchResults)_DataService.ServiceContext.Serializer.Deserialize<SearchResults>(conReq.ReadBody());
                results = ((Invoices)searchResults.CdmCollections).Invoice;
                qboInvoices = qboInvoices.Concat(results);
                iCount = searchResults.Count;
            }

            if (bById)
                foreach (Invoice Inv in qboInvoices)
                    dictionary.Add(Inv.Id.Value, Inv);
            else
                foreach (Invoice Inv in qboInvoices)
                    dictionary.Add(Inv.Header.DocNumber, Inv);

            return dictionary;

        }
        catch (Exception)
        {

            return null;
        }
    }

* 更新 *

新的 api 测试器也存在类似的问题。这可能与此问题有关,他们目前正在调查该问题。

Stack Overflow:QuickBooks Online 使用过滤器查询每次都会返回 401


这是 DevKit 中的一个错误。 OpenBalance 过滤器默认为 :EQUALS: 并且不支持 :GreaterThan:。

https://ipp.developer.intuit.com/0010_Intuit_Partner_Platform/0050_Data_Services/0400_QuickBooks_Online/Invoice#Attributes_Supporting_Filtering_and_Sorting

以下是使用 DevDefined 构建 OAuth 标头的解决方法:

public List<Intuit.Ipp.Data.Qbo.Invoice> GetQboUnpaidInvoices(DataServices dataServices, int startPage, int resultsPerPage,  IdType CustomerId)
{
    StringBuilder requestXML = new StringBuilder();
    StringBuilder responseXML = new StringBuilder();

    var requestBody = String.Format("PageNum={0}&ResultsPerPage={1}&Filter=OpenBalance :GreaterThan: 0.00 :AND: CustomerId :EQUALS: {2}", startPage, resultsPerPage, CustomerId.Value);

    HttpWebRequest httpWebRequest = WebRequest.Create(dataServices.ServiceContext.BaseUrl + "invoices/v2/" + dataServices.ServiceContext.RealmId) as HttpWebRequest;
    httpWebRequest.Method = "POST";
    httpWebRequest.ContentType = "application/x-www-form-urlencoded";
    httpWebRequest.Headers.Add("Authorization", GetDevDefinedOAuthHeader(httpWebRequest, requestBody));
    requestXML.Append(requestBody);
    UTF8Encoding encoding = new UTF8Encoding();
    byte[] content = encoding.GetBytes(requestXML.ToString());
    using (var stream = httpWebRequest.GetRequestStream())
    {
        stream.Write(content, 0, content.Length);
    }
    HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
    using (Stream data = httpWebResponse.GetResponseStream())
    {
        Intuit.Ipp.Data.Qbo.SearchResults searchResults = (Intuit.Ipp.Data.Qbo.SearchResults)dataServices.ServiceContext.Serializer.Deserialize<Intuit.Ipp.Data.Qbo.SearchResults>(new StreamReader(data).ReadToEnd());
        return ((Intuit.Ipp.Data.Qbo.Invoices)searchResults.CdmCollections).Invoice.ToList();
    }

}

protected string GetDevDefinedOAuthHeader(HttpWebRequest webRequest, string requestBody)
{

    OAuthConsumerContext consumerContext = new OAuthConsumerContext
    {
        ConsumerKey = consumerKey,
        ConsumerSecret = consumerSecret,
        SignatureMethod = SignatureMethod.HmacSha1,
        UseHeaderForOAuthParameters = true

    };

    consumerContext.UseHeaderForOAuthParameters = true;

    //URIs not used - we already have Oauth tokens
    OAuthSession oSession = new OAuthSession(consumerContext, "https://www.example.com",
                            "https://www.example.com",
                            "https://www.example.com");


    oSession.AccessToken = new TokenBase
    {
        Token = accessToken,
        ConsumerKey = consumerKey,
        TokenSecret = accessTokenSecret
    };

    IConsumerRequest consumerRequest = oSession.Request();
    consumerRequest = ConsumerRequestExtensions.ForMethod(consumerRequest, webRequest.Method);
    consumerRequest = ConsumerRequestExtensions.ForUri(consumerRequest, webRequest.RequestUri);
    if (webRequest.Headers.Count > 0)
    {
        ConsumerRequestExtensions.AlterContext(consumerRequest, context => context.Headers = webRequest.Headers);
        if (webRequest.Headers[HttpRequestHeader.ContentType] == "application/x-www-form-urlencoded")
        {
            Dictionary<string, string> formParameters = new Dictionary<string, string>();
            foreach (string formParameter in requestBody.Split('&'))
            {
                formParameters.Add(formParameter.Split('=')[0], formParameter.Split('=')[1]);
            }
            consumerRequest = consumerRequest.WithFormParameters(formParameters);
        }
    }

    consumerRequest = consumerRequest.SignWithToken();
    return consumerRequest.Context.GenerateOAuthParametersForHeader();
}

http://nuget.org/packages/DevDefined.OAuth

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 QuickBooks Online (QBO) Intuit 合作伙伴平台 (IPP) DevKit 查询具有未结余额的所有发票 的相关文章

  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 如何在线程创建和退出时调用函数?

    include
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • 捕获另一个进程未处理的异常

    我想知道我是否可以捕获我开始使用 Process Start 的另一个进程抛出的未处理的异常 我知道我可以用这个捕获标准错误link http social msdn microsoft com Forums en US csharpgen
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 按值返回的函数的返回语句中的初始化

    我的问题源于深入研究std move in return语句 例如以下示例 struct A A std cout lt lt Constructed lt lt this lt lt std endl A A noexcept std c
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template

随机推荐

  • 跳跃扭曲的光标

    我正在尝试使用 Objective C 沿着任何 UI 元素外部的路径移动 Mac 光标的位置 不仅仅是在某些窗口上 而是在整个屏幕上 与鼠标悬停的位置无关 我不想直接将鼠标扭曲到某个位置 而是逐步将其移动到那里 即迭代循环 并在每次迭代中
  • gets.chomp 而不移动到新行

    我了解自动在末尾的 nputs and gets 以及如何处理这些问题 但是有没有办法在按 Enter 进行输入后保持显示点 光标位置 如果愿意的话 移动到新行gets e g print Hello my name is a gets c
  • 如何在Python中使用nosetest/unittest断言输出?

    我正在为下一个函数编写测试 def foo print hello world 所以当我想测试这个函数时 代码将是这样的 import sys from foomodule import foo def test foo foo outpu
  • Web 应用程序问题(web.config 错误) 使用 IIS7.5 和 ASP.NET v2 的 HTTP 500.19

    这让整个团队都快疯了 IIS 或我们的 Web 服务器肯定有一些简单的错误配置部分 但每次我们尝试在 IIS 7 5 上运行 ASP NET Web 应用程序时 我们都会收到以下错误 这是完整的错误 HTTP Error 500 19 In
  • .NET NetworkStream.EndWrite() 写入的字节数

    MSDN文档明确指出 获取到NetworkStream后 可以调用EndWrite方法 成功完成发送操作并返回数量 发送的字节数 强调我的 但是 它什么也不返回 void public override void EndWrite IAsy
  • PHP,一个奇怪的变量范围?

    这更多的是一个关于 为什么 然后 如何做 的问题 但它已经困扰我好几天了 目前 我正在使用 CodeIgniter 进行一些工作 并暂时从 Ruby 返回到 PHP 这让我对以下作用域魔法感到困扰
  • 使用可重用图表更新 d3.js 中的 HTML 表格

    我有这个可重复使用的模式来创建一张桌子 灵感来自http bl ocks org 3687826 我对此有两个问题 这是函数 d3 table function config var columns var tbl function sel
  • ggplotly 从单个方面删除数据

    我正在尝试为闪亮的应用程序创建一个绘图 我遇到了有关多面图的某些布局的问题 每当有四个小平面并且它们位于 2x2 网格中时 左下小平面不会显示任何数据 即使数据存在于ggplot数字 当 3x2 网格中有 6 个面且左下角再次被丢弃时 也会
  • 类型同义词与类型类约束是否可能?

    请随意更改标题 我只是经验不足 不知道到底发生了什么 所以 我正在松散地编写一个程序this 并写下了这个 与原文一样 type Row a a type Matrix a Row a 那里没什么特别的 然而 我发现自己编写了几个具有如下类
  • 在宏运行结束时打开 NUMLOCK

    什么代码的作用 我有一个代码可以在屏幕上移动鼠标 打印屏幕并将其粘贴到 Excel 中 Problem 由于某种原因 我的代码总是 绝对没有例外 在每次运行后关闭 NUMLOCK 键 到目前为止我尝试过的 我四处搜寻 发现了 SendKey
  • 查询为空 PHP 错误

    我正在尝试使用 MySQL 构建一个购物车 当我运行此代码时 我不断收到此错误 查询为空 请帮助我尝试了几种方法 例如将变量放入字符串中而不是连接它
  • HTML 链接不会转到外部网站

    我在构建网站时一直使用react js运行本地主机网站 当我尝试链接到外部网站 例如youtube 时 它最终会转到如下链接 http localhost 3000 www youtube com 当我试图去时 https www yout
  • 我可以立即打印循环中的每次迭代吗?

    我的部署服务器为每个新的数据库构建运行一个部署脚本 部分脚本会阻塞以等待另一个异步操作完成 阻塞代码如下所示 DECLARE i INT 0 DECLARE laststatus NVARCHAR MAX N WHILE i lt 5 BE
  • cusparse csrsv_analysis 的性能非常慢

    我编写了一个带有 LU 预处理的共轭梯度求解器 用于线性方程组 我使用了 Maxim Naumov 博士的papers以nvidia的研究社区为指导 残差更新步骤需要先求解下三角矩阵系统 然后求解上三角矩阵系统 分为两个阶段 分析阶段 利用
  • 选择工资高于其部门平均水平的每位员工

    我只有 1 个名为EMPLOYEE在我的数据库中包含以下 3 列 Employee Name Employee Salary Department ID 现在我必须选择每个工资高于其部门平均水平的员工 我怎么做 我遇到的主要问题是 当将每个
  • 错误:只能在初始化程序中访问静态成员,这是什么意思?

    我有这样的东西 我很难理解这个错误 为什么访问filterController这里给出这个错误 但是如果我移动当前的整个内容 它不会给出这个错误TextFormField在构建方法中创建 在注释 A 和 B 之间 整个搬家如何TextFor
  • 从 MVC 的 DependencyResolver 转换到 AutofacWebApiDependencyResolver - .Current 在哪里?

    我让 AutoFac 与 MVC4 一起正常工作 我正在尝试过渡到 Web API 2 以下是我设置 AutoFac 的方法 public class AutofacRegistrations public static void Regi
  • Python 2.5 上选择模块的问题

    我有一个 Python 2 5 中的应用程序 用于监听 beanstalk 队列 到目前为止 除了我新买的 MacBook Pro 之外 它在我测试过的所有机器上都运行良好 在那台计算机上 当我尝试运行它时 出现以下错误 Traceback
  • 如何从使用 LINQ to SQL 的方法返回查询结果

    这是我正在使用的代码 我对 LINQ 还是有点陌生 所以这是一项正在进行的工作 具体来说 我想从此查询中获取结果 大约 7 列字符串 整数和日期时间 并将它们返回到调用包含此 LINQ to SQL 查询的方法的方法 一个简单的代码示例将非
  • 使用 QuickBooks Online (QBO) Intuit 合作伙伴平台 (IPP) DevKit 查询具有未结余额的所有发票

    我正在尝试使用 IPP 查询所有具有未结余额的发票 但我不断收到 0 个结果 我在代码中做错了什么吗 这是我尝试使用应用的过滤执行的 C 代码片段 InvoiceQuery qboInvoiceQuery new InvoiceQuery