经过一些研究,我发现这可以通过简单的方式完成。您只需要保留刷新令牌的副本(可能在读/写文件中)。当您想要访问 API 时,只需调用 OAuth2Client.RefreshTokenAsync() 即可获取访问令牌。可以使用 OAuth2 游乐场找到所有其他所需的项目。
然后,访问令牌最多可与 API 一起使用一小时。您还可以取回更新的刷新令牌。如果发生这种情况,只需将其存储起来以备将来使用。在您必须使用从 Refresh Token 操作返回的较新版本之前,刷新令牌最多可以持续 100 天。
下面是如何在 C# 中使用 API 的更长版本:
创建一个应用,但不要在 QBO 应用商店中发布它。要做到这一点登录到
developer.intuit.com 使用您的 QBO 帐户。转到“我的应用程序”然后创建一个应用程序(例如,名为“MyQBOApiApp”)。这只需要执行一次。将默认重定向 URL 设置为 OAuth2 游乐场,因为这是唯一需要的重定向 URL。
从应用的“OAuth 2.0 密钥”选项卡的“生产密钥”部分获取生产客户端 ID 和 客户端密钥。 (记录这些以在您的 C# 程序中使用,因为它们不会改变)
转到 https://developer.intuit.com/v2/ui#/playground 的 OAuth 2.0 游乐场
在第 1 步“获取授权码”中,从下拉框列表中选择 MyQBOApiApp(Production)
如果您只需要向 QBO 公司读取/写入数据,请在“选择范围”列表中选择“会计”
点击“获取授权码”
将您的 QBO 公司连接到 MyQBOApiApp 应用程序
在 Playground 页面上的第 2 步“从身份验证代码中获取 OAuth 2.0 令牌”中,单击 “获取令牌”。这将为您的 API 访问您的公司获得一个刷新令牌。
跳到 Playground 页面上的第 4 步“刷新访问令牌”。访问令牌只能使用 59 分钟
所以只需保留 'Refresh Token',因为它可以使用 100 天来获取新的访问令牌和刷新令牌。将其存储在 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 之前,您需要这样的代码来获取访问令牌:
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() 以从持久存储中加载和保存刷新令牌。
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());