【问题标题】:Xero invoice send email using standard .NET libraryXero 发票使用标准 .NET 库发送电子邮件
【发布时间】:2020-08-19 11:18:58
【问题描述】:

在这里,我在 标准 .NET 库上创建了我的项目以获取/发布发票。但是因为我想通过电子邮件发送发票,以该名称创建发票。下面是我创建发票的示例代码。

        public async Task<ActionResult> Create(string Name, string LineDescription, string LineQuantity, string LineUnitAmount, string LineAccountCode)
        {
            var xeroToken = TokenUtilities.GetStoredToken();
            var utcTimeNow = DateTime.UtcNow;

            var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
            var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();

            XeroConfiguration XeroConfig = new XeroConfiguration
            {
                ClientId = ConfigurationManager.AppSettings["XeroClientId"],
                ClientSecret = ConfigurationManager.AppSettings["XeroClientSecret"],
                CallbackUri = new Uri(ConfigurationManager.AppSettings["XeroCallbackUri"]),
                Scope = ConfigurationManager.AppSettings["XeroScope"],
                State = ConfigurationManager.AppSettings["XeroState"]
            };

            if (utcTimeNow > xeroToken.ExpiresAtUtc)
            {
                var client = new XeroClient(XeroConfig, httpClientFactory);
                xeroToken = (XeroOAuth2Token)await client.RefreshAccessTokenAsync(xeroToken);
                TokenUtilities.StoreToken(xeroToken);
            }

            string accessToken = xeroToken.AccessToken;
            string xeroTenantId = xeroToken.Tenants[0].TenantId.ToString();
            //string xeroTenantId = xeroToken.Tenants[1].TenantId.ToString();

            var contact = new Contact();
            contact.Name = Name;

            var line = new LineItem()
            {
                Description = LineDescription,
                Quantity = decimal.Parse(LineQuantity),
                UnitAmount = decimal.Parse(LineUnitAmount),
                AccountCode = LineAccountCode
            };

            var lines = new List<LineItem>() { line };
            //var lines = new List<LineItem>();
            //for (int j = 0;j < 5;j++)
            //{
            //    lines.Add(line);
            //}
            
            var invoice = new Invoice()
            {
                Type = Invoice.TypeEnum.ACCREC,
                Contact = contact,
                Date = DateTime.Today,
                DueDate = DateTime.Today.AddDays(30),
                LineItems = lines
            };

            var invoiceList = new List<Invoice>();
            invoiceList.Add(invoice);

            var invoices = new Invoices();
            invoices._Invoices = invoiceList;

            var AccountingApi = new AccountingApi();
            var response = await AccountingApi.CreateInvoicesAsync(accessToken, xeroTenantId, invoices);
            RequestEmpty _request = new RequestEmpty();
            //trying this method to send email to specified invoice....
            //var test = await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, Guid.NewGuid(), null);
            var updatedUTC = response._Invoices[0].UpdatedDateUTC;

            return RedirectToAction("Index", "InvoiceSync");
        }

现在我了解到 Xero 允许向指定发票发送电子邮件,这是我了解到的链接。
https://developer.xero.com/documentation/api/invoices#email

但是当我尝试在 .NET 标准库中为 Xero 寻找方法时,我偶然发现了这个方法。

var test = await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, Guid.NewGuid(), null);    

如何使用此方法向指定发票发送电子邮件..?
它给我一个关于无法将 void 分配给隐式类型变量的错误。

这个库中还有另一种方法。

var test2 = await AccountingApi.EmailInvoiceAsyncWithHttpInfo(accessToken, xeroTenantId, Guid.NewGuid(), null);

由于我使用的Guid.NewGuid() 仅用于测试,当我了解这两种方法的操作方式时会添加创建的GUID

更新 1:
这是我使用的第二种方法。

await AccountingApi.EmailInvoiceAsyncWithHttpInfo(accessToken, xeroTenantId, Guid.NewGuid(), null)

更新 2:
这是我使用的代码。

        public async Task EmailInvoiceTest(string accessToken,string xeroTenantId,Guid invoiceID, RequestEmpty requestEmpty)
        {
            var AccountingApi = new AccountingApi();
            await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, invoiceID, requestEmpty).ConfigureAwait(false);
        }

【问题讨论】:

  • 我假设这两种方法的返回值都是 void 类型。您是否尝试删除 var test = /var test2 =
  • @rufer7 因为我已经更新了上面的请求 requestEmpty .. ?

标签: c# xero-api


【解决方案1】:

方法EmailInvoiceAsync 的返回类型似乎是Task,返回类型为void。如果您等待任务,则没有可以分配给变量的返回类型。删除变量赋值并为RequestEmpty类型的参数传递一个有效的参数来解决问题。

RequestEmpty requestEmpty = new RequestEmpty();
await AccountingApi.EmailInvoiceAsync(accessToken, xeroTenantId, Guid.NewGuid(), requestEmpty);

有关示例测试,请参阅here

重要提示:根据documentation(参见Emailing an invoice 部分),发票必须是类型ACCREC 并且必须具有有效的发送状态(SUMBITTEDAUTHORISED 或@ 987654330@)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多