Skip to main content

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입니다.
Never commit API keys or secrets to version control.
2

Set Up Server-Side Integration

src/lib/auth.ts를 생성하거나 업데이트합니다:
플러그인은 Better Auth의 user 테이블에 dodoCustomerId 필드를 추가하고, 여기에 각 사용자의 Dodo Payments 고객 ID를 저장합니다. 플러그인을 추가한 후 Better Auth CLI를 사용하여 database schema를 업데이트합니다.
프로덕션 환경에서는 environment를 live_mode로 설정합니다.
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을 사용하며, 전달한 customer object는 무시합니다. 로그인한 사용자가 없으면 customer object를 사용합니다.
  • Other fields: argument는 Create Checkout Session endpoint의 request body와 동일한 field 및 slug와 referenceId를 추가로 허용합니다.
slug가 구성되지 않았거나 slug와 product_cart 중 어느 것도 전달하지 않으면 request가 400 error와 함께 실패합니다.
return URL은 server plugin에서 구성한 successUrl에서 가져오며, 앱의 URL을 기준으로 resolve됩니다. 플러그인은 client payload의 return_url를 무시합니다.

기존 Checkout(Deprecated)

authClient.dodopayments.checkout method는 deprecated되었습니다. 새로운 구현에서는 대신 checkoutSession를 사용합니다.
기존 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 및 end query parameter를 허용합니다.
Dodo Payments는 timestamp가 과거 1시간보다 오래되었거나 미래 5분을 초과한 event를 거부합니다.
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에 대해 실행됩니다:
signature verification이 실패하거나 handler에서 error가 발생하면 endpoint는 400으로 응답합니다. handler 실행이 끝나면 { received: true }를 반환합니다.

지원되는 Webhook Event Handler

각 handler는 해당 event type에 대해 verified된 payload를 받습니다:

Configuration Reference

  • 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일 수 있습니다.
  • products: { productId, slug } object의 array 또는 하나를 반환하는 async function
  • successUrl: 결제가 성공한 후 redirect할 URL
  • authenticatedUsersOnly: user authentication 필요 여부(기본값: false)

문제 해결 및 팁

  • 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되지 않았습니다.
  • 모든 secret과 key에는 environment variable을 사용합니다.
  • live_mode로 전환하기 전에 test_mode에서 테스트합니다.
  • debugging 및 auditing을 위해 webhook event를 log로 기록합니다.

LLM을 위한 Prompt

이 prompt를 AI coding assistant에 복사하여 프로젝트에 어댑터를 추가하도록 합니다. agent에 Dodo Payments docs와 skills도 제공하려면 Agent Plugin을 설치합니다.
마지막 수정일 2026년 9월 26일