【问题标题】:How to apply a payment to an invoice with the QBO API v3 in C#?如何使用 C# 中的 QBO API v3 将付款应用于发票?
【发布时间】:2015-02-26 00:34:12
【问题描述】:

如何使用 C# 中的 QuickBooks Online API v3 将付款应用到现有发票?

我已经尝试了以下代码:

    private void UpdateInvoice(Payment payment)
    {
        Invoice oldInvoice = cmbInvoices.SelectedItem as Invoice;
        if (oldInvoice == null) return;
        Invoice invoiceToUpdate = new Invoice();
        invoiceToUpdate.Id = oldInvoice.Id;
        invoiceToUpdate.SyncToken = oldInvoice.SyncToken;
        invoiceToUpdate.Deposit = payment.TotalAmt;
        invoiceToUpdate.DepositSpecified = true;
        invoiceToUpdate.sparse = true;
        invoiceToUpdate.sparseSpecified = true;
        invoiceToUpdate.PaymentType = PaymentTypeEnum.CreditCard;
        invoiceToUpdate.PaymentTypeSpecified = true;
        invoiceToUpdate.PaymentMethodRef = payment.PaymentMethodRef;
        invoiceToUpdate.PaymentRefNum = payment.PaymentRefNum;
        invoiceToUpdate.CustomerRef = oldInvoice.CustomerRef;
        QBO.DataService.Update(invoiceToUpdate);
    }

它失败并出现此错误:

{"ValidationException was thrown."}

我显然在这里遗漏了一些东西,或者我一定做错了什么。错误消息是无用的,希望 Intuit 能把它清理掉。

我对 Intuit 为他们的 QuickBooks Online API v3 发布的糟糕文档感到非常沮丧,并希望他们能够开始清理它并使其有用。另外,请同时删除那些死掉的 404 页面。

任何帮助或指示都会很棒。

【问题讨论】:

  • 我也对 QuickBooks API 非常不满意,以至于我们最终将其废弃,只从 QuickBooks 中导出我们需要的数据来自己处理。
  • @dubstylee,我明白了。问题是,我正在使用基于 REST 的 IPP v3 SDK,并且需要通过 C# Winform 应用程序使用 QuickBooks 的在线版本更新现有发票。所以,这里没有 QuickBooks 桌面交互。
  • 这是旧的,所以我知道这可能已经过去了......但我实际上发现他们的错误非常简单,默认情况下他们只是没有通过 .net v3 api 冒泡.打开日志以查看请求/响应,并且很容易得到验证错误

标签: c# api payment quickbooks-online invoice


【解决方案1】:

您只需创建一个付款对象并将其与发票相关联。它适用于我的 QBO v3 设置。

您正在链接“LinkedTxn”区域中的发票,因此在此示例中我的 InvoiceId 将是 1282。我的 ProccessPayment 是错误的,因为我们正在手动处理付款并登录 QBO。

Payment p = new Payment
{
               PaymentRefNum = "73453",
               PaymentTypeSpecified = true,
               PaymentType = PaymentTypeEnum.CreditCard,
               UnappliedAmt = 0,
               UnappliedAmtSpecified = true,
               TotalAmt = amount,
               TotalAmtSpecified = true,
               ProcessPayment = false,
               ProcessPaymentSpecified = true,
               TxnDateSpecified = true,
               TxnDate = charge.Created,
               CurrencyRef = new ReferenceType { name = "US Dollar", Value = "USD" },
               Line = new Line[] { new Line
               {
                              Amount = amount,
                              AmountSpecified = true,
                              DetailType = LineDetailTypeEnum.PaymentLineDetail,
                              DetailTypeSpecified = true,
                              LinkedTxn = new LinkedTxn[] { new LinkedTxn { TxnId = "1282", TxnType = "Invoice" } } }
               },
               CustomerRef = new ReferenceType { Value = "123" }
};

【讨论】:

    【解决方案2】:

    因为它值得尝试这件事给我带来了同样的问题。最终它不喜欢不指定行项目,即使指定稀疏更新也是如此。我找到了一位 sdk 工程师的参考,他说只需获取最初保存的发票,修改并将其传递给 api。最终解决了至少我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多