DjangoアプリケーションへのQuickBooks統合入門

By manhnv, at: 2025年3月28日10:32

Estimated Reading Time: __READING_TIME__ minutes

A Short Introduction to Integrate QuickBooks to Django Application
A Short Introduction to Integrate QuickBooks to Django Application

DjangoアプリケーションへのQuickBooks統合に関する簡単な紹介

 

QuickBooksDjangoアプリケーションに統合することで、会計業務を効率化し、財務ワークフローを自動化し、ビジネスの効率性を向上させることができます。請求書作成、経費追跡、顧客データの同期など、アプリケーションを構築する場合、QuickBooksとDjangoを連携させることは強力なソリューションとなります。このブログでは、この統合を始めるための基本的な手順を説明します。

 

なぜQuickBooksとDjangoを統合するのか?


QuickBooksは、企業が財務管理に使用している一般的な会計ソフトウェアであり、DjangoはWebアプリケーションを構築するための堅牢なPythonフレームワークです。これらを組み合わせることで、以下を実現できます。
 

  • アプリケーションとQuickBooks間のデータ同期を自動化します。
     
  • ユーザーにリアルタイムの財務情報を提供します。
     
  • 手動でのデータ入力とエラーを削減します。

 

前提条件


始める前に、以下のものがあることを確認してください。
 

  • セットアップ済みで稼働しているDjangoプロジェクト。
     
  • QuickBooks Onlineアカウント(サンドボックスまたはライブ)。
     
  • Pythonのパッケージ(requestsなど)またはintuit-oauthやquickbooks-pythonなどのSDK。
     
  • 認証のためのOAuth 2.0の基本知識。

 

QuickBooksとDjangoを統合する手順

 

ステップ1:QuickBooks APIアクセスの設定


まず、Intuit Developer Portalでアプリケーションを登録して、クライアントIDとクライアントシークレットを取得する必要があります。これにより、DjangoアプリケーションはAPI経由でQuickBooksと通信できるようになります。テスト目的でサンドボックスモードを有効にします。

 

ステップ2:必要なライブラリのインストール


QuickBooks APIとやり取りするには、python-quickbooksライブラリを使用します。これは、QuickBooks Online統合用に特別に設計された、軽量で強力なPythonパッケージです。このライブラリは、認証、APIリクエスト、データ処理を簡素化するため、Djangoアプリケーションに最適です。
 

ライブラリのインストール

python-quickbooksライブラリをインストールすることから始めます。ターミナルを開き、Djangoプロジェクトディレクトリに移動し、次のコマンドを実行します。

pip install python-quickbooks


これにより、ライブラリとその依存関係がダウンロードおよびインストールされます。仮想環境を使用している場合は、アクティブ化されていることを確認してください。

 

なぜpython-quickbooksを使うのか?

python-quickbooksライブラリは、既製のクラスを提供することで、QuickBooks APIの呼び出しを簡素化します。つまり、開発者は生のリクエストとレスポンスを手動で処理する必要がなくなり、統合がより迅速かつ容易になります。

例えば、請求書を手動で取得する場合:

import requests
import json

# 認証の詳細とAPIエンドポイント
access_token = "your_access_token"
realm_id = "your_realm_id"
url = f"https://sandbox-quickbooks.api.intuit.com/v3/company/{realm_id}/query"
# HTTPリクエストのヘッダー
headers = {
    "Authorization": f"Bearer {access_token}",
    "Accept": "application/json",
    "Content-Type": "application/text"
}
# 請求書を取得するためのSQLライクなクエリ
query = "SELECT * FROM Invoice WHERE Id = '123'"


# QuickBooks APIにPOSTリクエストを送信する
response = requests.post(url, headers=headers, data=query)
# レスポンスを手動で処理する
if response.status_code == 200:
    data = response.json()
    invoices = data["QueryResponse"]["Invoice"]
    print(invoices)
else:
    print(f"Error: {response.status_code} - {response.text}")

 

このライブラリを使用して請求書を取得する

from quickbooks import QuickBooks
from quickbooks.objects import Invoice

# 資格情報を使用してQuickBooksクライアントを初期化する
client = QuickBooks(
    sandbox=True,                    # テスト用にサンドボックスモードを使用
    consumer_key="your_client_id",   # Intuit Developer PortalからのクライアントID
    consumer_secret="your_client_secret",  # Intuitからのクライアントシークレット
    access_token="your_access_token",      # OAuth 2.0アクセストークン
    access_token_secret="your_access_token_secret",  # OAuth 2.0トークンシークレット
    company_id="your_realm_id"       # QuickBooks会社ID(Realm ID)
)

# IDで請求書を取得する
invoice = Invoice.get(id=123, qb=client)

# 請求書の情報を表示する
print(invoice.to_json())  # またはinvoice.TotalAmtなどの属性にアクセスする

 

ステップ3:認証の設定

 

QuickBooksは安全なアクセスにOAuth 2.0を使用します。Djangoアプリケーションを接続するには、クラスベースのビューを使用して認証フローを実装する必要があります。
 

  1. トークンの取得:ユーザーをQuickBooksの承認URLにリダイレクトして承認コードを取得し、それをトークンと交換します。
     
  2. 資格情報の保存:トークンを安全に保存します(データベースまたはセッションなど)。
     
  3. クライアントの設定:python-quickbooksを使用してクライアントを初期化します。
     

QuickBooksの設定の詳細については、QuickBooks OAuth 2.0ドキュメントを参照してください。

Djangoアプリケーションでこのプロセスを処理するためのコードを次に示します。

views.py

import uuid

import requests

from django.views.generic import RedirectView, View
from django.shortcuts import redirect
from django.conf import settings

from quickbooks import QuickBooks


 

# ボタンがクリックされたときにOAuthフローを開始するビュー
class QuickBooksAuthView(RedirectView):
    permanent = False
    
    def get_redirect_url(self, *args, **kwargs):
        # CSRF保護のために一意の状態トークンを生成する
        state_token = str(uuid.uuid4())
        self.request.session['state_token'] = state_token
        
        # QuickBooks OAuth 2.0承認URL
        auth_url = (
            "https://appcenter.intuit.com/connect/oauth2"
            "?client_id={}&response_type=code"
            "&scope=com.intuit.quickbooks.accounting"
            "&redirect_uri={}&state={}"
        ).format(
            settings.QB_CLIENT_ID,       # settings.pyからのクライアントID
            settings.QB_REDIRECT_URI,   # settings.pyからのリダイレクトURI
            state_token                 # セキュリティのための状態トークン
        )
        return auth_url

# QuickBooksからのリダイレクトURI(コールバック)を処理するビュー
class QuickBooksCallbackView(View):
    def get(self, request, *args, **kwargs):
        # コールバックURLからコードと状態を抽出する
        auth_code = request.GET.get('code')
        state = request.GET.get('state')
        realm_id = request.GET.get('realmId')
        
        # CSRFを防ぐために状態トークンの一致を確認する
        if state != request.session.get('state_token'):
            return redirect('error_page')  # エラーURLに置き換える
        
        # アクセスと更新トークンに対して承認コードを交換する
        token_url = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"
        payload = {
            'grant_type': 'authorization_code',
            'code': auth_code,
            'redirect_uri': settings.QB_REDIRECT_URI,
            'client_id': settings.QB_CLIENT_ID,
            'client_secret': settings.QB_CLIENT_SECRET,
        }
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        response = requests.post(token_url, data=payload, headers=headers)
        
        if response.status_code == 200:
            tokens = response.json()
            # トークンを安全に保存する(セッションまたはデータベースなど)
            request.session['access_token'] = tokens['access_token']
            request.session['refresh_token'] = tokens['refresh_token']
            request.session['realm_id'] = realm_id
            
            # QuickBooksクライアントを初期化する
            client = QuickBooks(
                sandbox=True,
                consumer_key=settings.QB_CLIENT_ID,
                consumer_secret=settings.QB_CLIENT_SECRET,
                access_token=tokens['access_token'],
                access_token_secret=tokens.get('access_token_secret', ''),
                company_id=realm_id
            )
            # クライアントを保存するか、API呼び出しを続行する
            request.session['qb_client'] = client  # オプション:シリアル化されたクライアントを保存する
        
        return redirect('success_page')  # 成功URLに置き換える

 

settings.py

QB_CLIENT_ID = 'your_client_id'
QB_CLIENT_SECRET = 'your_client_secret'
QB_REDIRECT_URI = 'http://localhost:8000/callback/'  # QuickBooksアプリと一致させる

 

urls.py

from django.urls import path
from .views import QuickBooksAuthView, QuickBooksCallbackView

urlpatterns = [
    path('auth/', QuickBooksAuthView.as_view(), name='qb_auth'),
    path('callback/', QuickBooksCallbackView.as_view(), name='qb_callback'),
]

 

ステップ4:QuickBooksとのデータ同期


認証が成功したら、Djangoアプリケーションは顧客、請求書、支払いなど、QuickBooksとデータを交換できるようになります。このステップでは、アプリケーションのデータベースとQuickBooksのAPI間のシームレスなフローを作成します。同期したいデータを表すDjangoモデル(顧客または請求書モデルなど)を定義することから始めます。次に、ローカルデータをQuickBooksにプッシュしたり、QuickBooksからアプリケーションに更新を取得したりする操作を処理するビューを作成します。例えば、ユーザーがフォームを送信したときに新しい請求書を送信するビューを作成したり、ダッシュボードに顧客のリストを表示するために顧客のリストを取得したりできます。python-quickbooksライブラリは、QuickBooksオブジェクトを直接操作できるようにすることでこれを簡素化し、両システム間でデータの一貫性を確保します。

 

ステップ5:テストと展開


統合を開始する前に、厳格なテストが不可欠です。QuickBooksのサンドボックス環境を使用して、ライブデータに影響を与えることなく現実世界のシナリオをシミュレートします。レコードの作成、更新、取得をテストして、すべてが期待通りに機能することを確認します。アクセストークンの期限切れ(更新が必要)やAPIレート制限(再試行ロジックが必要)などのエッジケースに特に注意してください。これらの問題を適切に管理し、何かが失敗した場合にユーザーに明確なフィードバックを提供するために、ビューにエラー処理を追加します。テストが完了して安定したら、アプリケーションを本番環境に展開し、資格情報とリダイレクトURIがライブQuickBooksアプリの設定と一致することを確認します。

 

結論


QuickBooksをDjangoと統合することで、財務自動化の可能性が広がります。これらの手順に従うことで、WebアプリケーションとQuickBooks間のシームレスな接続を作成し、時間と精度の向上を実現できます。必要に応じてコードを調整して、特定のユースケースに適応させてください!

Tag list:
- QuickBooks API tutorial
- QuickBooks Django Integration
- Integrate QuickBooks Online Django
- Django financial integration
- QuickBooks OAuth Django
- QuickBooks Python integration
- Django QuickBooks API
- QuickBooks Django setup
- Automate Accounting Django
- python-quickbooks Django

Subscribe

Subscribe to our newsletter and never miss out lastest news.