Skip to main content

GitHub Repository

FastAPI 및 Dodo Payments 보일러플레이트의 소스 코드입니다.

개요

FastAPI 보일러플레이트는 Dodo Payments가 이미 연결된 Python 백엔드입니다. checkout session과 Customer Portal session을 생성하는 endpoint, 서명을 검증하는 웹훅 endpoint, Jinja2 템플릿으로 렌더링되는 pricing page가 포함되어 있습니다.
이 보일러플레이트는 async route handler에 FastAPI를, validation 및 설정에 Pydantic을, Python SDK에 dodopayments를 사용합니다. handler는 동기 DodoPayments client를 호출합니다. event loop가 차단되지 않도록 AsyncDodoPayments로 전환하고 해당 호출을 await하세요.

기능

보일러플레이트에는 다음이 포함됩니다:
  • 빠른 설정: clone부터 실행 중인 서버까지 약 5분이면 완료됩니다.
  • Async Handler: Route handler는 FastAPI async def 함수입니다.
  • Checkout Session: Python SDK를 사용하는 사전 구성된 checkout endpoint입니다.
  • Webhook 처리: SDK의 unwrap method로 각 서명을 검증하는 웹훅 endpoint입니다.
  • Customer Portal: Customer Portal session을 생성하는 endpoint입니다.
  • Type Safety: Pydantic model이 request body를 검증하며, 코드에서 type hint를 사용합니다.
  • Environment Configuration: pydantic-settings가 .env에서 설정을 로드하고 검증합니다.

사전 요구 사항

시작하기 전에 다음이 필요합니다:
  • Python 3.9 이상. dodopayments SDK에 필요합니다. Python 3.11 이상을 권장합니다.
  • 패키지 관리를 위한 pip 또는 uv.
  • Dodo Payments 계정. 대시보드에서 API key와 웹훅 signing secret을 생성하는 데 필요합니다.

빠른 시작

1

Clone the Repository

2

Create Virtual Environment

격리된 Python 환경을 설정합니다:
또는 더 빠른 dependency 관리를 위해 uv를 사용합니다:
3

Install Dependencies

또는 uv를 사용하는 경우:
4

Get API Credentials

Dodo Payments에 가입한 다음 대시보드에서 credentials를 가져옵니다:
사이드바의 Live Mode 스위치가 꺼져 있는 동안 두 항목을 모두 생성합니다. 테스트 모드 key는 DODO_PAYMENTS_ENVIRONMENT=test_mode에서만 작동하며, 테스트 모드 결제는 실제 금액을 이동시키지 않습니다.
5

Configure Environment Variables

예제 파일을 복사하여 루트 디렉터리에 .env 파일을 생성합니다:
값을 Dodo Payments credentials로 설정합니다:
.env
네 변수는 모두 필수입니다. app/core/config.py가 pydantic-settings를 사용해 변수를 로드하며, 하나라도 누락되었거나 비어 있으면 앱이 시작되지 않습니다. DODO_PAYMENTS_RETURN_URL는 결제 후 checkout이 customer를 보내는 위치입니다.
.env 파일을 version control에 commit하지 마세요. repository의 .gitignore가 이미 해당 파일을 제외합니다.
6

Add Your Products

app/lib/products.py의 샘플 product를 직접 만든 product로 교체합니다. 각 product_id를 대시보드의 Products에 있는 product ID로 설정합니다. pricing page에 이 product들이 표시됩니다.
7

Run the Development Server

대화형 API documentation을 확인하려면 http://localhost:8000/docs를 엽니다.
Swagger UI에 테스트할 준비가 된 /api/checkout/, /api/webhook/ 및 /api/customer-portal/ endpoint가 표시됩니다.
루트 URL인 http://localhost:8000은 가격 페이지를 제공합니다.
app/main.py은 Starlette 1.x에서 더 이상 허용되지 않는 templates.TemplateResponse("index.html", {"request": request, ...})을 호출하므로, 새로 설치하면 가격 페이지에서 500 오류가 반환됩니다. 이 문제를 해결하려면 호출을 templates.TemplateResponse(request, "index.html", {"products": products})로 변경하세요.

프로젝트 구조

API 엔드포인트

app/main.py은 각 router를 /api prefix 아래에 마운트합니다: 각 path는 슬래시로 끝납니다. FastAPI는 슬래시가 없는 path로 요청이 들어오면 307 redirect로 응답하므로, 특히 webhook URL에서는 정확한 path를 사용하세요.

코드 예제

이 예제는 app/api/의 파일을 간추린 것입니다.

Checkout Session 생성

app/api/checkout.py은 checkout session을 생성하고 해당 checkout_url을 반환합니다. request body에는 product_id, 선택 사항인 quantity, 그리고 name 및 email을 포함하는 선택 사항인 customer object가 필요합니다:

Webhook 처리

app/api/webhook.py은 SDK의 unwrap method로 signature를 검증한 다음 event type에 따라 분기합니다:

Customer Portal 통합

app/api/portal.py은 customer ID에 대한 Customer Portal session을 생성하고 portal link를 url으로 반환합니다:
app/templates/index.html의 가격 페이지는 하드코딩된 customer ID(cus_001)를 이 endpoint로 전송하고, 하드코딩된 name과 email을 checkout endpoint로 전송합니다. 이를 로그인한 사용자의 값으로 바꾸세요.

Webhook 이벤트

app/api/webhook.py의 handler는 다음 이벤트에 따라 분기합니다: 다른 이벤트를 처리하려면 해당 type에 대한 분기를 추가하세요. 예를 들어 성공적으로 처리된 환불에는 refund.succeeded을 사용할 수 있습니다. 모든 event type은 Webhook Event Guide를 참조하세요. Webhook handler 내부에 다음 작업을 수행하는 비즈니스 로직을 추가하세요:
  • 데이터베이스의 사용자 권한 업데이트
  • 확인 이메일 전송
  • 디지털 제품에 대한 액세스 프로비저닝
  • 분석 및 metric 추적

로컬에서 Webhook 테스트

Dodo Payments는 localhost에 연결할 수 없습니다. 로컬 개발에서는 ngrok과 같은 도구를 사용해 로컬 서버를 외부에 노출하세요:
ngrok HTTPS URL 뒤에 /api/webhook/을 붙여 Dodo Payments Dashboard에 endpoint로 추가하세요:
endpoint의 signing secret을 .env의 DODO_PAYMENTS_WEBHOOK_KEY에 복사한 다음 서버를 다시 시작하세요. 앱은 시작 시에만 .env을 읽습니다.

배포

Docker

repository에는 Dockerfile이 포함되어 있지 않습니다. container에서 앱을 실행하려면 repository root에 다음 Dockerfile을 추가하세요:
COPY . .은 .env을 포함해 build context의 모든 파일을 복사합니다. key가 image에 포함되지 않도록 .env을 나열하는 .dockerignore 파일을 추가하세요. 그런 다음 image를 빌드하고 environment file을 사용해 실행합니다:

Production 고려 사항

Production에 배포하기 전에:
  • DODO_PAYMENTS_ENVIRONMENT을 live_mode으로 전환하세요.
  • dashboard에서 live mode API key를 사용하세요.
  • production domain용 webhook endpoint를 추가하고, DODO_PAYMENTS_WEBHOOK_KEY을 해당 endpoint의 signing secret으로 설정하세요.
  • DODO_PAYMENTS_RETURN_URL을 production URL로 설정하세요.
  • 모든 endpoint에 HTTPS를 활성화하세요.

문제 해결

virtual environment가 활성화되어 있고 dependency가 설치되어 있는지 확인하세요:
app/main.py은 app/static에서 static file을 제공하지만 repository에는 해당 directory가 포함되어 있지 않습니다. mkdir app/static을 사용해 directory를 생성한 다음 서버를 다시 시작하세요.
다음과 같은 일반적인 원인을 확인하세요:
  • product ID가 Dodo Payments dashboard에 존재하지 않습니다.
  • .env의 API key 또는 DODO_PAYMENTS_ENVIRONMENT이 잘못되었습니다. test mode key는 test_mode에서만 작동합니다.
endpoint는 400 response로 SDK error를 반환합니다. 자세한 error message는 FastAPI log를 확인하세요.
로컬 테스트에서는 ngrok을 사용해 서버를 외부에 노출하세요:
Dodo dashboard에 ngrok URL 뒤에 /api/webhook/을 붙인 endpoint를 추가하고, 끝에 슬래시를 포함하세요. 해당 endpoint의 signing secret을 .env 파일의 DODO_PAYMENTS_WEBHOOK_KEY에 복사하세요.
  • .env의 DODO_PAYMENTS_WEBHOOK_KEY이 endpoint의 signing secret과 일치하는지 확인하세요.
  • JSON으로 parsing하기 전에 raw request body에 대해 signature를 검증하세요.
  • webhook-id, webhook-timestamp, webhook-signature 세 가지 header를 모두 client.webhooks.unwrap()에 전달하세요. Standard Webhooks signature는 body만이 아니라 id.timestamp.body을 포함합니다.

추가 학습

Python SDK

async support를 포함한 완전한 Python SDK documentation

Webhooks Documentation

모든 webhook event와 best practice 알아보기

Checkout Sessions

checkout session configuration 자세히 알아보기

API Reference

완전한 Dodo Payments API documentation

지원

boilerplate에 대한 도움이 필요하면 다음을 이용하세요:
마지막 수정일 2026년 9월 26일