首页 > 解决方案 > Xero Accounting Sdk Core:身份验证错误

问题描述

我正在实施一个内部程序来从我的数据库生成发票。在使用.NET Core. 我安装了 Xero.Api.SDK.Core v. 1.1.4

我发现 Xero 文档很难理解,而且有点最新。我查看了Github存储库,它们仅指OAuth 2.0. 就我而言,我不想要任何用户交互,因为我想要一个后台进程。

我创建了一个作为开发人员的帐户和一个用于测试的演示公司。

在此处输入图像描述

我用谷歌搜索了一下,我在一个站点中找到了一个如何连接到 api 的示例(我在 Xero 文档中找不到任何详细信息)。

X509Certificate2 cert = new X509Certificate2(@"public_privatekey.pfx", "password");

var api = new Xero.Api.Example.Applications.Private.PrivateAuthenticator(cert);

var private_app_api = new XeroCoreApi("https://api.xero.com", 
                                      new PrivateAuthenticator(cert),
                                      new Consumer("ClientId", "ClientSecret"), 
                                      null, null);

现在,我想,我应该使用 api。我试图阅读联系人列表:

var contacts = private_app_api.Contacts;
var list = contacts.FindAsync().Result;

结果是以下错误:

System.AggregateException: '发生一个或多个错误。(oauth_problem=consumer_key_unknown&oauth_problem_advice=Consumer%20key%20was%20not%20recognised)'

内部异常 UnauthorizedException: oauth_problem=consumer_key_unknown&oauth_problem_advice=Consumer%20key%20was%20not%20recognised

然后,我从 Github 下载了存储库。我复制并粘贴 ClientId 和 ClientSecret 并运行测试。没有一项测试通过!

在此处输入图像描述

我的目标是创建联系人或在列表中查找联系人,创建发票并将发票以 PDF 格式保存在我的存储中。

我怎样才能做到这一点?有什么例子吗?

PS:在开发者论坛登录不起作用,邮递员集合是旧的,它也没有。

更新

我很绝望。我尝试用另一种方式连接到 api XOauth。最糟糕的。正如 Xero 在Github上解释的那样,我创建了连接。

在此处输入图像描述

当我尝试与

xoauth 连接

在我的浏览器中打开一个新标签,然后...

在此处输入图像描述

邮递员更新

我按照Postman的步骤进行操作。我在我的邮递员中打开了收藏。在环境中,我从 Xero Developer 站点更新了 client_id 和 client_secret,然后进行了以下配置:

re_directURI:https ://developer.xero.com

范围:offline_access 个人资料电子邮件accounting.transactions

认证网址:https ://login.xero.com/identity/connect/authorize

访问令牌:https ://identity.xero.com/connect/token

我打开了Get started api,Generate token并给出了相同的结果。

在此处输入图像描述

标签: c#azure-functionsxero-api

解决方案


老实说,这真是一团糟。我花了两个多星期的时间来了解如何调用 Xero。我创建了一个帖子来逐步解释我必须做什么。

有很多问题:

  • 了解 Xero 文档,因为它不是很清楚
  • 找到正确的值以放入请求中
  • 用代码翻译 Postman 请求
  • 没有 Xero 文档,只有一堆没用的项目

解释一切都很长,但例如,如果你想阅读一个组织,代码RestSharp是:

/// <summary>
/// Gets the organizations.
/// </summary>
/// <returns>OrganizationResponse.</returns>
public OrganizationResponse GetOrganizations()
{
    var _client = new RestClient("https://api.xero.com/connections");
    _client.Timeout = -1;

    var request = new RestRequest(Method.GET);
    request.AddHeader("Authorization", "Bearer " + _settings.AccessToken);
    var response = _client.Execute<IList<Organization>>(request);

    return response;
}

我将创建其他帖子来解释如何实现更多功能。

我为此创建了一个NuGet包。Github上的源代码。


推荐阅读