Overview
Better Auth 어댑터인@dodopayments/better-auth는 사용자를 Dodo Payments에 연결하는 Better Auth 플러그인입니다. 다음 기능을 제공합니다:
- 가입 시 선택적으로 고객을 생성하거나 이메일을 기반으로 고객을 연결
- 제품 slug 매핑을 지원하는 Checkout 세션(권장 Checkout 방식)
- 셀프서비스 Customer Portal
- 사용량 기반 청구를 위한 사용량 수집 및 보고 endpoints
- signature verification을 지원하는 Webhook event processing
- 모든 endpoint에 대한 TypeScript types
You need a Dodo Payments account and API keys to use this integration.
Prerequisites
- Node.js 16 이상
- Dodo Payments 대시보드에 대한 액세스
- Better Auth 1.4 또는 이후 1.x 릴리스를 사용하는 기존 프로젝트
Installation
1
Install Dependencies
프로젝트 루트에서 다음 명령을 실행합니다:
어댑터, Dodo Payments SDK, Better Auth 및 Zod가 설치됩니다.
Setup
1
Configure Environment Variables
이 변수를
.env 파일에 추가합니다. 대시보드의 Developer → API Keys에서 API key를 생성합니다. 이 페이지의 Webhooks 섹션에 설명된 대로 webhook endpoint를 추가하면 webhook secret을 확인할 수 있습니다. BETTER_AUTH_SECRET는 32자 이상의 random string입니다.2
Set Up Server-Side Integration
src/lib/auth.ts를 생성하거나 업데이트합니다:user 테이블에 dodoCustomerId 필드를 추가하고, 여기에 각 사용자의 Dodo Payments 고객 ID를 저장합니다. 플러그인을 추가한 후 Better Auth CLI를 사용하여 database schema를 업데이트합니다.3
Set Up Client-Side Integration
src/lib/auth-client.ts를 생성하거나 업데이트합니다:사용 예시
새로운 통합에는
authClient.dodopayments.checkoutSession를 사용합니다. 기존
checkout method는 deprecated되었으며 이전 버전과의
호환성을 위해서만 유지됩니다.Checkout 세션 생성(권장)
구성된 slug 또는 product cart에서 checkout 세션을 생성한 다음, 반환된 URL로 고객을 redirect합니다:checkoutSession가 일부 필드를 자동으로 입력합니다:
- Billing address: checkout에서 고객으로부터 수집하므로 처음부터 입력할 필요가 없습니다. 미리 입력하려면
billing_address를 전달합니다. - Customer: 로그인한 사용자의 경우 플러그인은 Better Auth 세션의 email과 name을 사용하며, 전달한
customerobject는 무시합니다. 로그인한 사용자가 없으면customerobject를 사용합니다. - Other fields: argument는 Create Checkout Session endpoint의 request body와 동일한 field 및
slug와referenceId를 추가로 허용합니다.
slug와 product_cart 중 어느 것도 전달하지 않으면 request가 400 error와 함께 실패합니다.
return URL은 server plugin에서 구성한
successUrl에서 가져오며,
앱의 URL을 기준으로 resolve됩니다. 플러그인은 client payload의 return_url를
무시합니다.기존 Checkout(Deprecated)
기존 method에는billing와 customer가 필요하며, deprecated된 dynamic checkout flow를 통해 payment link를 생성합니다. customer에서 설정한 field는 session의 email과 name보다 우선합니다.
Customer Portal 액세스
portal endpoint에는 verified email address를 가진 로그인 사용자가 필요합니다. 사용자에게 아직 Dodo Payments 고객이 없으면 플러그인이 email로 고객을 찾거나 생성합니다.customer.portal()는 portal URL을 반환합니다:
고객 데이터 나열
로그인한 고객의 subscriptions와 payments를 나열합니다.page는 1부터 시작하며, status는 결과를 filter합니다:
Metered Usage 추적
server에서usage() plugin을 활성화하여 usage-based billing을 위한 usage event를 기록하고 고객이 사용량을 확인할 수 있도록 합니다. 두 method 모두 verified email address를 가진 로그인 사용자를 필요로 합니다.
authClient.dodopayments.usage.ingest는 로그인한 사용자의 event를 기록합니다.authClient.dodopayments.usage.meters.list는 로그인한 고객의 usage event를 나열합니다.page_number,page_size,event_name,meter_id,start및endquery parameter를 허용합니다.
meter_id를 생략하면 list에 고객의 모든 usage event가 포함됩니다. meter_id를 사용하면 해당 meter와 일치하는 event만 포함됩니다.
Webhooks
webhooks plugin은 각 Dodo Payments event의 signature를 확인하고
사용자의 handler를 호출합니다. 기본 endpoint는
/api/auth/dodopayments/webhooks입니다.1
Generate and Set Webhook Secret
대시보드에서 Developer → Webhooks로 이동하여 endpoint URL을 추가합니다. 예를 들어
https://<your-domain>/api/auth/dodopayments/webhooks와 같습니다. endpoint의 signing secret을 .env 파일에 복사합니다:2
Handle Webhook Events
처리하려는 각 event에 대한 handler를 전달합니다.
onPayload는 모든 event에 대해 실행됩니다:{ received: true }를 반환합니다.
지원되는 Webhook Event Handler
각 handler는 해당 event type에 대해 verified된 payload를 받습니다:Configuration Reference
Plugin Options
Plugin Options
- client (required): DodoPayments client instance
- createCustomerOnSignUp (optional): 사용자가 가입할 때 Dodo Payments customer를 생성하거나 동일한 email을 가진 기존 customer를 연결합니다. 사용자의 세부 정보가 변경되면 플러그인이 customer도 업데이트합니다.
- use (required): 활성화할 plugin의 array(checkout, portal, usage, webhooks)
- getCustomerParams (optional): Better Auth
User를 받고 생성 및 업데이트 시 Dodo Payments customer에 추가할 field를 반환하는 function입니다(예:metadata,phone_number). async일 수 있습니다.
Checkout Plugin Options
Checkout Plugin Options
- products:
{ productId, slug }object의 array 또는 하나를 반환하는 async function - successUrl: 결제가 성공한 후 redirect할 URL
- authenticatedUsersOnly: user authentication 필요 여부(기본값:
false)
문제 해결 및 팁
Common Issues
Common Issues
- Invalid API key:
.env의DODO_PAYMENTS_API_KEY를 확인하고 key의 mode가environment와 일치하는지 확인합니다. - Webhook signature mismatch: webhook secret이 Dodo Payments 대시보드에 설정된 값과 일치하는지 확인합니다.
- Customer not created:
createCustomerOnSignUp가true로 설정되어 있는지 확인합니다. - Portal or usage requests return 401: 사용자의 email address가 verified되지 않았습니다.
Best Practices
Best Practices
- 모든 secret과 key에는 environment variable을 사용합니다.
live_mode로 전환하기 전에test_mode에서 테스트합니다.- debugging 및 auditing을 위해 webhook event를 log로 기록합니다.