.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
相关产品推荐
相关产品推荐

