메인 콘텐츠로 건너뛰기

설치

1

패키지 설치

프로젝트 루트에서 다음 명령을 실행하세요:
npm install @dodopayments/astro
2

환경 변수 설정

프로젝트 루트에 .env 파일을 생성하세요:
DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" or "live_mode"
DODO_PAYMENTS_RETURN_URL=https://yourdomain.com/checkout/success
.env 파일이나 비밀 정보를 버전 관리에 커밋하지 마세요.

라우트 핸들러 예제

모든 예제는 Astro App Router를 사용한다고 가정합니다.
이 핸들러를 사용하여 Dodo Payments 체크아웃을 Astro 앱에 통합하세요. 정적 (GET), 동적 (POST), 세션 (POST) 결제 흐름을 지원합니다.
// src/pages/api/checkout.ts
import { Checkout } from "@dodopayments/astro";
export const prerender = false;

export const GET = Checkout({
    bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
    returnUrl: import.meta.env.DODO_PAYMENTS_RETURN_URL,
    environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
    type: "static", // optional, defaults to 'static'
});

export const POST = Checkout({
    bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
    returnUrl: import.meta.env.DODO_PAYMENTS_RETURN_URL,
    environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
    type: "dynamic", // for dynamic checkout
});

export const POST = Checkout({
    bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
    returnUrl: import.meta.env.DODO_PAYMENTS_RETURN_URL,
    environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
    type: "session", // for checkout sessions
});
curl --request GET \
--url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
curl --request POST \
--url https://example.com/api/checkout \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test \
--data '{
"billing": {
  "city": "Texas",
  "country": "US",
  "state": "Texas",
  "street": "56, hhh",
  "zipcode": "560000"
},
"customer": {
  "email": "[email protected]",
  	"name": "test"
},
"metadata": {},
"payment_link": true,
  "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
  "quantity": 1,
  "billing_currency": "USD",
  "discount_code": "IKHZ23M9GQ",
  "return_url": "https://example.com",
  "trial_period_days": 10
}'
curl --request POST \
--url https://example.com/api/checkout \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test \
--data '{
"product_cart": [
  {
    "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
    "quantity": 1
  }
],
"customer": {
  "email": "[email protected]",
  "name": "test"
},
"return_url": "https://example.com/success"
}'

체크아웃 라우트 핸들러

Dodo Payments는 웹사이트에 결제를 통합하기 위한 세 가지 유형의 결제 흐름을 지원하며, 이 어댑터는 모든 유형의 결제 흐름을 지원합니다.
  • 정적 결제 링크: 빠르고 코드 없이 결제를 수집할 수 있는 즉시 공유 가능한 URL입니다.
  • 동적 결제 링크: API 또는 SDK를 사용하여 사용자 정의 세부정보로 결제 링크를 프로그래밍 방식으로 생성합니다.
  • 체크아웃 세션: 미리 구성된 제품 장바구니 및 고객 세부정보로 안전하고 사용자 정의 가능한 체크아웃 경험을 생성합니다.

지원되는 쿼리 매개변수

productId
string
required
제품 식별자 (예: ?productId=pdt_nZuwz45WAs64n3l07zpQR).
quantity
integer
제품의 수량.
fullName
string
고객의 전체 이름.
firstName
string
고객의 이름.
lastName
string
고객의 성.
email
string
고객의 이메일 주소.
country
string
고객의 국가.
addressLine
string
고객의 주소.
city
string
고객의 도시.
state
string
고객의 주/도.
zipCode
string
고객의 우편번호.
disableFullName
boolean
전체 이름 필드 비활성화.
disableFirstName
boolean
이름 필드 비활성화.
disableLastName
boolean
성 필드 비활성화.
disableEmail
boolean
이메일 필드 비활성화.
disableCountry
boolean
국가 필드 비활성화.
disableAddressLine
boolean
주소 필드 비활성화.
disableCity
boolean
도시 필드 비활성화.
disableState
boolean
주 필드 비활성화.
disableZipCode
boolean
우편번호 필드 비활성화.
paymentCurrency
string
결제 통화를 지정합니다 (예: USD).
showCurrencySelector
boolean
통화 선택기 표시.
paymentAmount
integer
결제 금액을 지정합니다 (예: 1000은 $10.00).
showDiscounts
boolean
할인 필드 표시.
metadata_*
string
metadata_로 시작하는 모든 쿼리 매개변수는 메타데이터로 전달됩니다.
productId가 누락된 경우 핸들러는 400 응답을 반환합니다. 잘못된 쿼리 매개변수도 400 응답을 초래합니다.

응답 형식

정적 체크아웃은 체크아웃 URL이 포함된 JSON 응답을 반환합니다:
{
  "checkout_url": "https://checkout.dodopayments.com/..."
}

응답 형식

동적 체크아웃은 체크아웃 URL이 포함된 JSON 응답을 반환합니다:
{
  "checkout_url": "https://checkout.dodopayments.com/..."
}
체크아웃 세션은 일회성 구매 및 구독을 위한 전체 결제 흐름을 처리하는 보다 안전하고 호스팅된 체크아웃 경험을 제공합니다.자세한 내용과 지원되는 필드의 전체 목록은 체크아웃 세션 통합 가이드를 참조하세요.

응답 형식

체크아웃 세션은 체크아웃 URL이 포함된 JSON 응답을 반환합니다:
{
  "checkout_url": "https://checkout.dodopayments.com/session/..."
}

고객 포털 라우트 핸들러

고객 포털 라우트 핸들러를 사용하면 Dodo Payments 고객 포털을 Astro 애플리케이션에 원활하게 통합할 수 있습니다.

쿼리 매개변수

customer_id
string
required
포털 세션의 고객 ID (예: ?customer_id=cus_123).
send_email
boolean
true로 설정하면 고객에게 포털 링크가 포함된 이메일을 보냅니다.
customer_id가 누락된 경우 400을 반환합니다.

웹훅 라우트 핸들러

  • 메서드: POST 요청만 지원됩니다. 다른 메서드는 405를 반환합니다.
  • 서명 검증: webhookKey를 사용하여 웹훅 서명을 검증합니다. 검증 실패 시 401을 반환합니다.
  • 페이로드 검증: Zod로 검증됩니다. 잘못된 페이로드에 대해 400을 반환합니다.
  • 오류 처리:
    • 401: 잘못된 서명
    • 400: 잘못된 페이로드
    • 500: 검증 중 내부 오류
  • 이벤트 라우팅: 페이로드 유형에 따라 적절한 이벤트 핸들러를 호출합니다.

지원되는 웹훅 이벤트 핸들러

onPayload?: (payload: WebhookPayload) => Promise<void>;
onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>;
onPaymentFailed?: (payload: WebhookPayload) => Promise<void>;
onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>;
onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>;
onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>;
onRefundFailed?: (payload: WebhookPayload) => Promise<void>;
onDisputeOpened?: (payload: WebhookPayload) => Promise<void>;
onDisputeExpired?: (payload: WebhookPayload) => Promise<void>;
onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>;
onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>;
onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>;
onDisputeWon?: (payload: WebhookPayload) => Promise<void>;
onDisputeLost?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>;
onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>;
onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>;

LLM 프롬프트


You are an expert Astro developer assistant. Your task is to guide a user through integrating the @dodopayments/astro adapter into their existing Astro project.

The @dodopayments/astro adapter provides route handlers for Dodo Payments' Checkout, Customer Portal, and Webhook functionalities, designed for the Astro App Router.

First, install the necessary packages. Use the package manager appropriate for your project (npm, yarn, or bun) based on the presence of lock files (e.g., package-lock.json for npm, yarn.lock for yarn, bun.lockb for bun):

npm install @dodopayments/astro

Here's how you should structure your response:

    Ask the user which functionalities they want to integrate.

"Which parts of the @dodopayments/astro adapter would you like to integrate into your project? You can choose one or more of the following:

    Checkout Route Handler (for handling product checkouts)

    Customer Portal Route Handler (for managing customer subscriptions/details)

    Webhook Route Handler (for receiving Dodo Payments webhook events)

    All (integrate all three)"

    Based on the user's selection, provide detailed integration steps for each chosen functionality.

If Checkout Route Handler is selected:

Purpose: This handler redirects users to the Dodo Payments checkout page.
File Creation: Create a new file at app/checkout/route.ts in your Astro project.

Code Snippet:

// src/pages/api/checkout.ts
import { Checkout } from "@dodopayments/astro";

export const prerender = false;

export const GET = Checkout({
  bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
  returnUrl: import.meta.env.DODO_PAYMENTS_RETURN_URL,
  environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
  type: "static", // optional, defaults to 'static'
});

export const POST = Checkout({
  bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
  returnUrl: import.meta.env.DODO_PAYMENTS_RETURN_URL,
  environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
  type: "dynamic", // for dynamic checkout
});

export const POST = Checkout({
  bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
  returnUrl: import.meta.env.DODO_PAYMENTS_RETURN_URL,
  environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
  type: "session", // for checkout sessions
});

Configuration & Usage:

    bearerToken: Your Dodo Payments API key. It's recommended to set this via the DODO_PAYMENTS_API_KEY environment variable.

    returnUrl: (Optional) The URL to redirect the user to after a successful checkout.

    environment: (Optional) Set to "test_mode" for testing, or omit/set to "live_mode" for production.

    type: (Optional) Set to "static" for GET/static checkout, "dynamic" for POST/dynamic checkout, or "session" for POST/checkout sessions.

Static Checkout (GET) Query Parameters:

    productId (required): Product identifier (e.g., ?productId=pdt_nZuwz45WAs64n3l07zpQR)

    quantity (optional): Quantity of the product

    Customer Fields (optional): fullName, firstName, lastName, email, country, addressLine, city, state, zipCode

    Disable Flags (optional, set to true to disable): disableFullName, disableFirstName, disableLastName, disableEmail, disableCountry, disableAddressLine, disableCity, disableState, disableZipCode

    Advanced Controls (optional): paymentCurrency, showCurrencySelector, paymentAmount, showDiscounts

    Metadata (optional): Any query parameter starting with metadata_ (e.g., ?metadata_userId=abc123)

    Returns: {"checkout_url": "https://checkout.dodopayments.com/..."}

Dynamic Checkout (POST) - Returns JSON with checkout_url: Parameters are sent as a JSON body. Supports both one-time and recurring payments. Returns: {"checkout_url": "https://checkout.dodopayments.com/..."}. For a complete list of supported POST body fields, refer to:

    Docs - One Time Payment Product: https://docs.dodopayments.com/api-reference/payments/post-payments

    Docs - Subscription Product: https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions

Checkout Sessions (POST) - (Recommended) A more customizable checkout experience. Returns JSON with checkout_url: Parameters are sent as a JSON body. Supports both one-time and recurring payments. Returns: {"checkout_url": "https://checkout.dodopayments.com/session/..."}. For a complete list of supported fields, refer to:

  Checkout Sessions Integration Guide: https://docs.dodopayments.com/developer-resources/checkout-session

Error Handling: If productId is missing or other query parameters are invalid, the handler will return a 400 response.

If Customer Portal Route Handler is selected:

Purpose: This handler redirects authenticated users to their Dodo Payments customer portal.
File Creation: Create a new file at app/customer-portal/route.ts in your Astro project.

Code Snippet:

// src/pages/api/customer-portal.ts
import { CustomerPortal } from "@dodopayments/astro";

export const GET = CustomerPortal({
  bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY,
  environment: import.meta.env.DODO_PAYMENTS_ENVIRONMENT,
});

Query Parameters:

    customer_id (required): The customer ID for the portal session (e.g., ?customer_id=cus_123)

    send_email (optional, boolean): If set to true, sends an email to the customer with the portal link.

    Returns 400 if customer_id is missing.

If Webhook Route Handler is selected:

Purpose: This handler processes incoming webhook events from Dodo Payments, allowing your application to react to events like successful payments, refunds, or subscription changes.
File Creation: Create a new file at app/api/webhook/dodo-payments/route.ts in your Astro project.

Code Snippet:

// src/pages/api/webhook.ts
import { Webhooks } from "@dodopayments/astro";

export const POST = Webhooks({
  webhookKey: import.meta.env.DODO_PAYMENTS_WEBHOOK_KEY,
  onPayload: async (payload) => {
    // handle the payload
  },
  // ... other event handlers for granular control
});

Handler Details:

    Method: Only POST requests are supported. Other methods return 405.

    Signature Verification: The handler verifies the webhook signature using the webhookKey and returns 401 if verification fails.

    Payload Validation: The payload is validated with Zod. Returns 400 for invalid payloads.

Error Handling:

    401: Invalid signature

    400: Invalid payload

    500: Internal error during verification

Event Routing: Calls the appropriate event handler based on the payload type.

Supported Webhook Event Handlers:

    onPayload?: (payload: WebhookPayload) => Promise<void>

    onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>

    onPaymentFailed?: (payload: WebhookPayload) => Promise<void>

    onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>

    onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>

    onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>

    onRefundFailed?: (payload: WebhookPayload) => Promise<void>

    onDisputeOpened?: (payload: WebhookPayload) => Promise<void>

    onDisputeExpired?: (payload: WebhookPayload) => Promise<void>

    onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>

    onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>

    onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>

    onDisputeWon?: (payload: WebhookPayload) => Promise<void>

    onDisputeLost?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>

    onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>

    onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>

    Environment Variable Setup:

To ensure the adapter functions correctly, you will need to manually set up the following environment variables in your Astro project's deployment environment (e.g., Vercel, Netlify, AWS, etc.):

    DODO_PAYMENTS_API_KEY: Your Dodo Payments API Key (required for Checkout and Customer Portal).

    RETURN_URL: (Optional) The URL to redirect to after a successful checkout (for Checkout handler).

    DODO_PAYMENTS_WEBHOOK_SECRET: Your Dodo Payments Webhook Secret (required for Webhook handler).

Example .env file:

DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" or "live_mode"
DODO_PAYMENTS_RETURN_URL=your-return-url

Usage in your code:

bearerToken: import.meta.env.DODO_PAYMENTS_API_KEY
webhookKey: import.meta.env.DODO_PAYMENTS_WEBHOOK_KEY

Important: Never commit sensitive environment variables directly into your version control. Use environment variables for all sensitive information.

If the user needs assistance setting up environment variables for their specific deployment environment, ask them what platform they are using (e.g., Vercel, Netlify, AWS, etc.), and provide guidance. You can also add comments to their PR or chat depending on the context