GitHub リポジトリ
完全な FastAPI + Dodo Payments ボイラープレート
FastAPI ボイラープレートは、Dodo Payments を Python バックエンドに統合するための生産準備が整った出発点を提供します。このテンプレートには、チェックアウトセッションの処理、Webhook の検証、カスタマーポータルの統合、非同期 API パターンが含まれており、迅速に支払いを受け入れることができます。
このボイラープレートは、非同期/待機パターンを使用した FastAPI、検証のための Pydantic、およびシームレスな API 統合のための dodopayments Python SDK を使用しています。
- クイックセットアップ - 5 分以内に始められます
- 非同期サポート - FastAPI のネイティブな非同期/待機パターンで構築
- チェックアウトセッション - Python SDK を使用した事前設定されたチェックアウトフロー
- Webhook 処理 - 署名検証付きの安全な Webhook エンドポイント
- カスタマーポータル - 簡単なカスタマーポータルセッションの作成
- 型安全性 - 完全な Pydantic 検証と型ヒント
- 環境設定 - すぐに使用できる環境変数のセットアップ
前提条件
始める前に、次のものを用意してください:
- Python 3.9+(推奨:Python 3.11+)
- pip または uv パッケージ管理用
- Dodo Payments アカウント(ダッシュボードから API および Webhook キーにアクセスするため)
クイックスタート
リポジトリをクローン
git clone https://github.com/dodopayments/fastapi-boilerplate.git
cd fastapi-boilerplate
仮想環境を作成
隔離された Python 環境を設定します:python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
または、依存関係管理を高速化するために uv を使用:uv venv
source .venv/bin/activate
依存関係をインストール
pip install -r requirements.txt
または uv を使用:uv pip install -r requirements.txt
API 認証情報を取得
Dodo Payments にサインアップし、ダッシュボードから認証情報を取得します:開発中は テストモード にいることを確認してください!
環境変数を設定
ルートディレクトリに .env ファイルを作成します:Dodo Payments の認証情報で値を更新します:DODO_PAYMENTS_API_KEY=your_api_key_here
DODO_PAYMENTS_WEBHOOK_KEY=your_webhook_signing_key_here
DODO_PAYMENTS_ENVIRONMENT=test_mode
.env ファイルをバージョン管理にコミットしないでください。これは .gitignore に既に含まれています。
開発サーバーを実行
uvicorn main:app --reload
http://localhost:8000/docs を開いて、インタラクティブな API ドキュメントを確認してください!FastAPI の Swagger UI が表示され、すべての利用可能なエンドポイントがテストの準備が整っています。
プロジェクト構造
fastapi-boilerplate/
├── main.py # FastAPI application entry point
├── routers/
│ ├── checkout.py # Checkout session endpoints
│ ├── webhook.py # Webhook handler endpoint
│ └── customer_portal.py # Customer portal endpoints
├── config.py # Environment configuration
├── requirements.txt # Python dependencies
├── .env.example # Environment template
└── README.md
API エンドポイント
ボイラープレートには、次の事前設定されたエンドポイントが含まれています:
| エンドポイント | メソッド | 説明 |
|---|
/checkout | POST | 新しいチェックアウトセッションを作成 |
/webhook | POST | Dodo Payments Webhook を処理 |
/customer-portal | POST | カスタマーポータル URL を生成 |
コード例
チェックアウトセッションの作成
from fastapi import APIRouter, HTTPException
from dodopayments import AsyncDodoPayments
from pydantic import BaseModel
from config import settings
router = APIRouter()
dodo = AsyncDodoPayments(
bearer_token=settings.DODO_PAYMENTS_API_KEY,
environment=settings.DODO_PAYMENTS_ENVIRONMENT
)
class CheckoutRequest(BaseModel):
product_id: str
quantity: int = 1
customer_email: str | None = None
customer_name: str | None = None
@router.post("/checkout")
async def create_checkout(request: CheckoutRequest):
try:
session = await dodo.checkout_sessions.create(
product_cart=[{
"product_id": request.product_id,
"quantity": request.quantity
}],
customer={
"email": request.customer_email,
"name": request.customer_name
} if request.customer_email else None,
return_url="http://localhost:8000/success"
)
return {"checkout_url": session.url, "session_id": session.session_id}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
Webhook の処理
from fastapi import APIRouter, Request, HTTPException
import hmac
import hashlib
from config import settings
router = APIRouter()
def verify_webhook_signature(payload: bytes, signature: str) -> bool:
expected = hmac.new(
settings.DODO_PAYMENTS_WEBHOOK_KEY.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
@router.post("/webhook")
async def handle_webhook(request: Request):
payload = await request.body()
signature = request.headers.get("webhook-signature", "")
if not verify_webhook_signature(payload, signature):
raise HTTPException(status_code=401, detail="Invalid signature")
event = await request.json()
event_type = event.get("type")
match event_type:
case "payment.succeeded":
# Handle successful payment
payment_id = event["data"]["payment_id"]
print(f"Payment succeeded: {payment_id}")
case "subscription.active":
# Handle subscription activation
subscription_id = event["data"]["subscription_id"]
print(f"Subscription activated: {subscription_id}")
case "refund.succeeded":
# Handle refund
refund_id = event["data"]["refund_id"]
print(f"Refund processed: {refund_id}")
return {"status": "received"}
カスタマーポータルの統合
from fastapi import APIRouter, HTTPException
from dodopayments import AsyncDodoPayments
from pydantic import BaseModel
from config import settings
router = APIRouter()
dodo = AsyncDodoPayments(
bearer_token=settings.DODO_PAYMENTS_API_KEY,
environment=settings.DODO_PAYMENTS_ENVIRONMENT
)
class PortalRequest(BaseModel):
customer_id: str
@router.post("/customer-portal")
async def create_portal_session(request: PortalRequest):
try:
session = await dodo.customers.create_customer_portal(
customer_id=request.customer_id
)
return {"portal_url": session.url}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
Webhook イベント
ボイラープレートは、一般的な Webhook イベントの処理を示しています:
| イベント | 説明 |
|---|
payment.succeeded | 支払いが正常に完了 |
payment.failed | 支払いの試行が失敗 |
subscription.active | サブスクリプションがアクティブになりました |
subscription.cancelled | サブスクリプションがキャンセルされました |
refund.succeeded | 返金が正常に処理されました |
Webhook ハンドラー内にビジネスロジックを追加して:
- データベース内のユーザー権限を更新
- 確認メールを送信
- デジタル製品へのアクセスを提供
- 分析とメトリクスを追跡
Webhook をローカルでテスト
ローカル開発には、ngrok のようなツールを使用してローカルサーバーを公開します:
Webhook URL を Dodo Payments ダッシュボード で更新します:
https://your-ngrok-url.ngrok.io/webhook
デプロイメント
Docker
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
ビルドして実行:
docker build -t fastapi-dodo .
docker run -p 8000:8000 --env-file .env fastapi-dodo
本番環境での考慮事項
本番環境にデプロイする前に:
DODO_PAYMENTS_ENVIRONMENT を live_mode に切り替え
- ダッシュボードから本番 API キーを使用
- Webhook URL を本番ドメインに更新
- すべてのエンドポイントで HTTPS を有効にする
トラブルシューティング
仮想環境がアクティブで、依存関係がインストールされていることを確認してください:source venv/bin/activate
pip install -r requirements.txt
一般的な原因:
- 無効な製品 ID - Dodo ダッシュボードに存在することを確認
.env の API キーまたは環境設定が間違っている
- 詳細なエラーメッセージのために FastAPI ログを確認
ローカルテストには、ngrok を使用してサーバーを公開します:Webhook URL を Dodo ダッシュボード で ngrok URL に更新します。正しい Webhook 検証キーで .env ファイルを更新することを忘れないでください。
DODO_PAYMENTS_WEBHOOK_KEY が .env に正しく設定されていることを確認
- 署名検証のために生のリクエストボディを使用していることを確認
webhook-signature ヘッダーを正しく読み取っていることを確認
詳細を学ぶ
サポート
ボイラープレートに関して助けが必要ですか?