You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core集成Xero SDK Core认证失败,求发票生成解决方案

解决Xero私有应用认证错误及实现后台发票流程的方案

首先,你遇到的consumer_key_unknown错误核心原因是:你混淆了Xero私有应用(Private App)和OAuth 2.0应用的认证参数。Xero的Private App是专为无用户交互的后台场景设计的认证方式,它不使用OAuth2的ClientId/ClientSecret,而是用Xero开发者门户为私有应用生成的Consumer Key和Consumer Secret,搭配PFX证书完成认证。

第一步:确认私有应用的正确配置

在Xero开发者门户中,你需要完成以下操作:

  • 创建应用时选择Private类型(而非Public或Partner)
  • 生成并下载PFX证书(或自行生成RSA证书对,上传公钥到Xero,保留本地私钥PFX文件)
  • 记录下Xero提供的Consumer Key和Consumer Secret(这两个值在私有应用详情页中,不是OAuth2的ClientId/Secret)
  • 确保你的测试演示公司已经授权该私有应用(私有应用创建后需关联到测试组织)

第二步:修正认证代码

你之前的代码错误地将OAuth2的ClientId/ClientSecret传给了Consumer类,现在替换为私有应用的专属密钥,同时确保证书加载正确:

using Xero.Api.Core;
using Xero.Api.Core.Model;
using Xero.Api.Core.Model.Types;
using Xero.Api.Infrastructure.Authentication.Private;
using System.Security.Cryptography.X509Certificates;

// 加载PFX证书(确保路径正确,密码为证书设置的密码)
var cert = new X509Certificate2(@"path/to/your/public_privatekey.pfx", "your-cert-password", 
    X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);

// 初始化私有应用认证器
var authenticator = new PrivateAuthenticator(cert);

// 替换为你的私有应用Consumer Key和Consumer Secret
var consumer = new Consumer("YOUR_PRIVATE_APP_CONSUMER_KEY", "YOUR_PRIVATE_APP_CONSUMER_SECRET");

// 初始化Xero Core API客户端
var xeroApi = new XeroCoreApi("https://api.xero.com", authenticator, consumer, null, null);

第三步:实现联系人查询/创建

查询联系人

// 查询所有联系人(可添加过滤条件)
var contacts = await xeroApi.Contacts.FindAsync();

// 按名称查询特定联系人
var specificContact = await xeroApi.Contacts.FindAsync("Name == 'Test Company'");

创建联系人

var newContact = new Contact
{
    Name = "New Test Client",
    EmailAddress = "client@test.com",
    ContactStatus = ContactStatus.Active
};

var createdContact = await xeroApi.Contacts.CreateAsync(newContact);

第四步:创建发票并导出为PDF

创建发票

var invoice = new Invoice
{
    Type = InvoiceType.AccountsReceivable,
    Contact = new Contact { Id = createdContact.Id }, // 关联已创建的联系人
    Date = DateTime.UtcNow,
    DueDate = DateTime.UtcNow.AddDays(30),
    LineItems = new List<LineItem>
    {
        new LineItem
        {
            Description = "Consulting Services",
            Quantity = 1,
            UnitAmount = 500.00m,
            AccountCode = "200" // 确保你的Xero组织存在该账户代码
        }
    }
};

var createdInvoice = await xeroApi.Invoices.CreateAsync(invoice);

导出发票为PDF并保存到存储

Xero API支持直接获取发票的PDF流,你可以通过SDK方法获取后保存到本地或云存储:

// 获取PDF字节流
var pdfBytes = await xeroApi.Invoices.GetInvoicePdfAsync(createdInvoice.Id);

// 保存到本地文件(示例)
File.WriteAllBytes(@"path/to/saved/invoice.pdf", pdfBytes);

// 若保存到云存储(如Azure Blob、AWS S3),直接上传pdfBytes即可

额外排查要点

  • 确保PFX证书未过期且包含完整私钥(加载证书报错时,检查密码和文件路径)
  • 验证Xero开发者门户中私有应用的公钥与本地PFX证书的公钥一致(可通过cert.GetPublicKeyString()查看本地公钥,对比门户中的公钥)
  • 确认Xero应用状态为“Active”,且测试组织已授权该应用

内容的提问来源于stack exchange,提问作者Enrico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:43:11