使用 .net SDK 在 Quickbook 中发送带有发票的电子邮件

Send email with invoice in Quickbook with .net SDK

我正在使用 .net 的 SDK V3 IppDotNetSdkForQuickBooksApiV3 并尝试 在创建发票后发送带有发票的电子邮件 (我发现 Quickbook 很奇怪在我创建发票后不会自动执行此操作,所以也许我做错了什么)。

事情是这样的:

//Get customer
var customerQueryService = new QueryService<Customer>(context);            
var customer = customerQueryService.ExecuteIdsQuery("query to get customer");
/*I fill the invoice with data  
..      
..
..*/
//Call to generate invoice
var invoiceAdded = dataService.Add(invoice);
//Email to send
invoiceAdded.BillEmail = customer.PrimaryEmailAddr;
invoiceAdded.EmailStatus = EmailStatusEnum.NeedToSend;
invoiceAdded.EInvoiceStatusSpecified = true;
//Send Email
dataService.SendEmail(invoiceAdded);

这就是我遇到麻烦的地方,首先我注意到 customer.PrimaryEmailAddr 中的对象没有 id:

因此,当我在创建发票后打电话发送电子邮件时,出现以下异常:

Object not found: EmailAddress

如果我去我的 Quickbook 网站,我当然有我的客户,那就是他的电子邮件。

那我做错了什么?

试试这个:

//Call to generate invoice

var invoiceAdded = dataService.Add(invoice);

//Send Email

dataService.SendEmail<Invoice>(invoiceAddded, customer.PrimaryEmailAddr.Address);

您传递给该方法的第二个参数是一个特定的电子邮件,它将覆盖发票对象中的默认电子邮件,这应该可以修复此错误。基本上有两个版本的请求可以用来发送发票,有以下几种:

POST /v3/company/<companyID>/invoice/<invoiceId>/send

然后是这个:

POST /v3/company/<companyID>/invoice/<invoiceId>/send?sendTo=<emailAddr>

因此,当您只传递发票时,它会通过获取您的发票对象并确定 ID 是什么来映射到第一个请求,但是由于某些原因,QBO 默认情况下不会填写其中的很多字段,这就是为什么您只传递发票时会出错,因为出于某种原因它依赖于具有 ID 的电子邮件,我猜 QBO 不会为您自动填写,所以我会做的是使用另一个映射到第二个请求的此方法的重载,它在请求中明确设置电子邮件地址,这样无论如何,只要您传递了一个有效的电子邮件地址,并且发票存在,请求就不会失败,否则你依赖于一堆数据被正确填充,这让你容易出现很多错误,QuickBooks API 通常非常非常容易出现错误,并且在你得到它们时并不能真正帮助你,所以在我看来,一般来说,你接触到的错误越少越好。