Есть ли простой способ доступа к API Quickbooks с помощью OAuth2? - PullRequest
0 голосов
/ 26 января 2019

Мне просто нужен доступ к данным в моей компании Quickbooks Online (QBO) с использованием API на C #. Но теперь они перешли на OAuth2, это выглядит очень сложно. Например, он предполагает, что мне нужен URI перенаправления для получения кода авторизации, но я пишу простое консольное приложение для экспорта данных в QBO и не хочу для этого размещать конечную точку URI.

Также сложно понять, как получить и управлять следующим:

  • идентификатор клиента
  • Секрет клиента
  • RealmID
  • Код авторизации
  • Обновить токен
  • Токен доступа

Должен быть простой способ сделать это. Например, в Stripe вам нужно только управлять ключом API.

1 Ответ

0 голосов
/ 26 января 2019

После некоторых исследований я обнаружил, что это можно сделать простым способом. Вам нужно только сохранить копию токена обновления (возможно, в файле для чтения / записи). Если вы хотите получить доступ к API, просто вызовите OAuth2Client.RefreshTokenAsync (), чтобы получить токен доступа. Все остальные необходимые предметы можно найти на детской площадке OAuth2.

Токен доступа может быть использован в течение одного часа с API. Вы также можете получить обновленный токен обновления. Если это произойдет, просто сохраните это для будущего использования. Токен обновления длится до 100 дней, прежде чем вы должны использовать более новую версию, которая была возвращена из операции Обновить токен.

Вот более длинная версия того, как использовать API из C #:

  1. Создайте приложение, но не публикуйте его в магазине приложений QBO. Для этого войдите в developer.intuit.com использует вашу учетную запись QBO. Перейдите в «Мои приложения». Затем создайте приложение (например, « MyQBOApiApp »). Это нужно сделать только один раз. Оставьте заданный по умолчанию URL-адрес перенаправления для площадки OAuth2, поскольку это единственный требуемый URL-адрес перенаправления.

  2. Получите производственный идентификатор клиента и Client Secret в разделе «Ключи производства» на вкладке «Ключи OAuth 2.0» для приложения. (Запишите их для использования в вашей программе на C #, поскольку они не меняются)

  3. Перейти на площадку OAuth 2.0 по адресу https://developer.intuit.com/v2/ui#/playground

  4. На шаге 1 «Получить код авторизации» выберите MyQBOApiApp (Production) из раскрывающегося списка

  5. В списке Select Scopes выберите «Бухгалтерия», если вам просто нужно читать / записывать данные в свою компанию QBO

  6. Нажмите «Получить код авторизации»

  7. Подключите свою компанию QBO к приложению MyQBOApiApp

  8. На шаге 2 «Получить токен OAuth 2.0 из кода авторизации» на странице игровой площадки нажмите «Получить токены» . Это получит токен обновления для вашего доступа API к вашей компании.

  9. Перейдите к шагу 4 «Обновить токен доступа» на странице детской площадки. Токен доступа можно использовать только в течение 59 минут. поэтому просто сохраните 'Refresh Token' , так как его можно использовать в течение 100 дней для получения новых токенов доступа и обновления токенов. Сохраните его где-нибудь, из чего ваша программа 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, вам понадобится такой код, чтобы получить токен доступа:

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 () для загрузки и сохранения маркера обновления из постоянного хранилища.

Весь доступ к API в QBO начинается с Сервисного контекста. Вы можете создать код с таким кодом:

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());
...