c# - 有没有使用 OAuth2 访问 Quickbooks API 的简单方法?

标签 c# quickbooks-online

我只需要使用带有 C# 的 API 访问我的 Quickbooks Online (QBO) 公司中的数据。但现在他们已经转向 OAuth2,它看起来非常复杂。例如,它建议我需要一个重定向 URI 来接收授权代码,但我正在编写一个简单的控制台应用程序来将数据导出到 QBO,并且不想托管 URI 端点来执行此操作。

了解如何获取和管理以下内容也令人困惑:

  • 客户编号
  • 客户 secret
  • 领域ID
  • 授权码
  • 刷新 token
  • 访问 token

一定有一种简单的方法可以做到这一点。例如,对于 Stripe,您只需管理一个 API key 。

最佳答案

经过一些研究,我发现这可以通过一种简单的方式完成。您只需要保留一份刷新 token 的副本(可能在读/写文件中)。当您想要访问 API 时,只需调用 OAuth2Client.RefreshTokenAsync() 即可获取访问 token 。可以使用 OAuth2 Playground 找到所需的所有其他项目。

然后,访问 token 最多可与 API 一起使用一小时。您还可以取回更新后的刷新 token 。如果发生这种情况,请将其存储起来以备将来使用。刷新 token 最多可以使用 100 天,然后您必须使用从刷新 token 操作返回的较新版本。

以下是如何从 C# 使用 API 的较长版本:

  1. 创建一个应用程序,但不要在 QBO 应用程序商店中发布它。为此,请登录 developer.intuit.com 使用您的 QBO 帐户。转到“我的应用程序”然后创建一个应用程序(例如称为“MyQBOApiApp”)。这只需要做一次。将默认重定向 URL 设置为 OAuth2 Playground ,因为这是唯一需要的重定向 URL。

  2. 从应用的“OAuth 2.0 key ”选项卡的“生产 key ”部分获取生产客户端 ID客户端 key 。 (记录这些以供在您的 C# 程序中使用,因为它们不会更改)

  3. 转到 OAuth 2.0 Playground https://developer.intuit.com/app/developer/playground

  4. 在第 1 步“获取授权码”中,从下拉列表中选择 MyQBOApiApp(Production)

  5. 如果您只需要向您的 QBO 公司读取/写入数据,请在“选择范围”列表中选择“会计”

  6. 点击“获取授权码”

  7. 将您的 QBO 公司连接到 MyQBOApiApp 应用

  8. 在 playground 页面上的第 2 步“从授权代码中获取 OAuth 2.0 token ”中,点击“获取 token ”。这将为您对贵公司的 API 访问获取一个刷新 token 。

  9. 跳至 playground 页面上的第 4 步“刷新访问 token ”。访问 token 只能使用 59 分钟 所以只需保留'Refresh Token',因为它可以使用 100 天来获取新的访问 token 和刷新 token 。将其存储在您的 C# 程序可以读取和写入的位置(例如文件或数据库)

  10. realmID 可从第 3 步获得。“进行 API 调用”。 (记录下来以便在您的 C# 程序中使用,因为它不会改变)

  11. 将 IppDotNetSdkForQuickBooksApiV3 NuGet 包添加到您的 C# 程序中。提供对 API 的轻松访问。

  12. 确保您使用的是 .Net Framework 4.6.1 或更高版本,因为 QBO 需要 TLS 1.2 连接

  13. 遗憾的是,默认情况下,.Net 控制台应用程序不使用 TLS 1.2。因此,在 C# 程序启动的某处添加这行代码:

    // Have to explicitly set TLS 1.2 as QBO APIs require it
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
    

在访问 API 之前,您需要像这样的代码来获取访问 token :

public static string GetAccessToken()
{
    var oauth2Client = new OAuth2Client(CLIENTID_FROM_STEP_2, 
            CLIENT_SECRET_FROM_STEP_2,
            // Redirect not used but matches entry for app
            "https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl",
            "production"); // environment is “sandbox” or “production”

    var previousRefreshToken = ReadRefreshTokenFromWhereItIsStored();
    var tokenResp = oauth2Client.RefreshTokenAsync(previousRefreshToken );
    tokenResp.Wait();
    var data = tokenResp.Result;

    if ( !String.IsNullOrEmpty(data.Error) || String.IsNullOrEmpty(data.RefreshToken) || 
          String.IsNullOrEmpty(data.AccessToken))
    {
        throw new Exception("Refresh token failed - " + data.Error);
    }

    // If we've got a new refresh_token store it in the file
    if (previousRefreshToken != data.RefreshToken)
    {
        Console.WriteLine("Writing new refresh token : " + data.RefreshToken);
        WriteNewRefreshTokenToWhereItIsStored(data.RefreshToken)

    }
    return data.AccessToken;
}

您需要编写函数 ReadRefreshTokenFromWhereItIsStored()WriteNewRefreshTokenToWhereItIsStored() 以从持久存储加载和保存刷新 token 。

QBO 中的所有 API 访问都从服务上下文开始。您可以使用如下代码创建一个:

static public ServiceContext GetServiceContext()
{
    var accessToken = GetAccessToken(); // Code from above
    var oauthValidator = new OAuth2RequestValidator(accessToken);

    ServiceContext qboContext = new ServiceContext(REALMID_PROD_FROM_STEP10,
            IntuitServicesType.QBO, oauthValidator);

    return qboContext;
}

要访问数据,您可以创建这样的数据服务:

var service = new DataService(GetServiceContext());

关于c# - 有没有使用 OAuth2 访问 Quickbooks API 的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54381095/

相关文章:

c# - 如何给一个sql命令添加超过10000个参数

QuickBooks API - 检索所有帐户的交易

php - 添加发票时 QuickBooks IPP v3 出现错误 3200

c# - 如何创建带有滚动的复选框列表?

c# - 在方法中修改变量是不好的做法吗?

c# - 如何在 ASP.NET 中创建无 key URL 参数

php - 无法刷新 Quickbooks API 中的访问 token 。检查 TLS 1.2 的 cURL 版本时出错

java - Quickbooks API - 如何使用存储的银行帐户创建费用

c# - 如何使用 C# 中的 QBO API v3 将付款应用于发票?

c# - MouseDoubleClick 事件不会冒泡