我只需要使用带有 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 的较长版本:
创建一个应用程序,但不要在 QBO 应用程序商店中发布它。为此,请登录 developer.intuit.com 使用您的 QBO 帐户。转到“我的应用程序”然后创建一个应用程序(例如称为“MyQBOApiApp”)。这只需要做一次。将默认重定向 URL 设置为 OAuth2 Playground ,因为这是唯一需要的重定向 URL。
从应用的“OAuth 2.0 key ”选项卡的“生产 key ”部分获取生产客户端 ID 和客户端 key 。 (记录这些以供在您的 C# 程序中使用,因为它们不会更改)
转到 OAuth 2.0 Playground https://developer.intuit.com/app/developer/playground
在第 1 步“获取授权码”中,从下拉列表中选择 MyQBOApiApp(Production)
如果您只需要向您的 QBO 公司读取/写入数据,请在“选择范围”列表中选择“会计”
点击“获取授权码”
将您的 QBO 公司连接到 MyQBOApiApp 应用
在 playground 页面上的第 2 步“从授权代码中获取 OAuth 2.0 token ”中,点击“获取 token ”。这将为您对贵公司的 API 访问获取一个刷新 token 。
跳至 playground 页面上的第 4 步“刷新访问 token ”。访问 token 只能使用 59 分钟 所以只需保留'Refresh Token',因为它可以使用 100 天来获取新的访问 token 和刷新 token 。将其存储在您的 C# 程序可以读取和写入的位置(例如文件或数据库)
realmID 可从第 3 步获得。“进行 API 调用”。 (记录下来以便在您的 C# 程序中使用,因为它不会改变)
将 IppDotNetSdkForQuickBooksApiV3 NuGet 包添加到您的 C# 程序中。提供对 API 的轻松访问。
确保您使用的是 .Net Framework 4.6.1 或更高版本,因为 QBO 需要 TLS 1.2 连接
遗憾的是,默认情况下,.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/