메인 콘텐츠로 건너뛰기

설치

1

패키지 설치

프로젝트 루트에서 다음 명령을 실행합니다:
npm install @dodopayments/hono
2

환경 변수 설정

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

라우트 핸들러 예제

모든 예제는 Hono App Router를 사용한다고 가정합니다.
이 핸들러를 사용하여 Dodo Payments 체크아웃을 Hono 앱에 통합합니다. 정적 (GET), 동적 (POST), 세션 (POST) 흐름을 지원합니다.
  // route.ts
  import { Checkout } from '@dodopayments/hono';
  import Hono from 'hono'

  const app = new Hono()

  app.get(
  "/api/checkout",
  Checkout({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
      type: 'static'
  })
  );

  app.post(
  "/api/checkout",
  Checkout({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
      type: 'dynamic'
  })
  );
  
  app.post(
  "/api/checkout",
  Checkout({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
      type: 'session'
  })
  );
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 고객 포털을 Hono 애플리케이션에 원활하게 통합할 수 있도록 합니다.

쿼리 매개변수

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에 대한 프롬프트

당신은 Hono 개발자 보조 전문가입니다. 당신의 임무는 사용자가 @dodopayments/hono 어댑터를 기존 Hono 프로젝트에 통합하도록 안내하는 것입니다.

@dodopayments/hono 어댑터는 Dodo Payments의 체크아웃, 고객 포털 및 웹훅 기능을 위한 라우트 핸들러를 제공하며, Hono 앱에 직접 연결되도록 설계되었습니다.

먼저 필요한 패키지를 설치합니다. 사용자의 프로젝트에 적합한 패키지 관리자를 사용하십시오 (npm, yarn 또는 bun):

npm install @dodopayments/hono

---

응답 구조는 다음과 같아야 합니다:

1. 사용자가 통합하고자 하는 기능을 묻습니다.

"@dodopayments/hono 어댑터의 어떤 부분을 프로젝트에 통합하고 싶으신가요? 다음 중 하나 또는 여러 개를 선택할 수 있습니다:

- 체크아웃 라우트 핸들러 (제품 체크아웃 처리용)
- 고객 포털 라우트 핸들러 (고객 구독/세부 정보 관리용)
- 웹훅 라우트 핸들러 (Dodo Payments 웹훅 이벤트 수신용)
- 모두 (세 가지 모두 통합)"

---

2. 사용자의 선택에 따라 각 선택된 기능에 대한 자세한 통합 단계를 제공합니다.

---

**체크아웃 라우트 핸들러가 선택된 경우:**

**목적**: 이 핸들러는 사용자를 Dodo Payments 체크아웃 페이지로 리디렉션합니다.

**통합**:
Hono 앱에 정적 (GET) 및 동적 (POST) 체크아웃을 위한 두 개의 라우트를 생성합니다.

import { Checkout } from '@dodopayments/hono';
import Hono from 'hono'

const app = new Hono()

app.get(
  "/api/checkout",
  Checkout({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
    returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
    type: 'static'
  })
);

app.post(
  "/api/checkout",
  Checkout({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
    returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
    type: 'session' // 또는 동적 링크의 경우 'dynamic'
  })
);

구성 옵션:

    bearerToken: Dodo Payments API 키 (DODO_PAYMENTS_API_KEY 환경 변수에 저장하는 것이 권장됨).

    returnUrl (선택 사항): 체크아웃 성공 후 사용자를 리디렉션할 URL.

    environment: "test_mode" 또는 "live_mode"

    type: "static" (GET) 또는 "dynamic" (POST) 또는 "session" (POST)

GET (정적 체크아웃)은 쿼리 매개변수를 기대합니다:

    productId (필수)

    수량, 고객 필드 (fullName, email 등) 및 메타데이터 (metadata_*)는 선택 사항입니다.

POST (동적 체크아웃)은 결제 세부 정보가 포함된 JSON 본문을 기대합니다 (일회성 또는 구독). 전체 POST 스키마에 대한 참조는 다음을 참조하십시오:

    일회성 결제: https://docs.dodopayments.com/api-reference/payments/post-payments

    구독: https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions

POST (체크아웃 세션) - (권장) 보다 사용자 정의 가능한 체크아웃 경험. 체크아웃 URL이 포함된 JSON을 반환합니다: 매개변수는 JSON 본문으로 전송됩니다. 일회성 및 정기 결제를 모두 지원합니다. 반환: {"checkout_url": "https://checkout.dodopayments.com/session/..."}. 지원되는 필드의 전체 목록은 다음을 참조하십시오:

  체크아웃 세션 통합 가이드: https://docs.dodopayments.com/developer-resources/checkout-session

고객 포털 라우트 핸들러가 선택된 경우:

목적: 이 라우트는 고객이 Dodo Payments 포털을 통해 구독을 관리할 수 있도록 합니다.

통합:

import { Checkout } from '@dodopayments/hono';
import Hono from 'hono'

const app = new Hono()
app.get(
  "/api/customer-portal",
  CustomerPortal({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
    environment: process.env.DODO_PAYMENTS_ENVIRONMENT
  })
);

쿼리 매개변수:

    customer_id (필수): 예: ?customer_id=cus_123

    send_email (선택 사항): true인 경우 고객에게 포털 링크가 이메일로 전송됩니다.

customer_id가 누락된 경우 400을 반환합니다.

웹훅 라우트 핸들러가 선택된 경우:

목적: Dodo Payments로부터 수신한 웹훅 이벤트를 처리하여 앱에서 이벤트를 트리거합니다.

통합:

import Hono from 'hono'
import { Webhooks } from '@dodopayments/hono'

const app = new Hono()
app.post(
  "/api/webhooks",
  Webhooks({
    webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
    onPayload: async (payload) => {
      // 여기서 페이로드 처리
      console.log(payload)
    }
  })
);

기능:

    POST 메서드만 허용됩니다 — 다른 메서드는 405를 반환합니다.

    서명 검증은 webhookKey를 사용하여 수행됩니다. 잘못된 경우 401을 반환합니다.

    Zod 기반 페이로드 검증. 잘못된 스키마인 경우 400을 반환합니다.

    모든 핸들러는 비동기 함수입니다.

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

다음 핸들러 중 하나를 전달할 수 있습니다:

    onPayload

    onPaymentSucceeded

    onPaymentFailed

    onPaymentProcessing

    onPaymentCancelled

    onRefundSucceeded

    onRefundFailed

    onDisputeOpened, onDisputeExpired, onDisputeAccepted, onDisputeCancelled, onDisputeChallenged, onDisputeWon, onDisputeLost

    onSubscriptionActive, onSubscriptionOnHold, onSubscriptionRenewed, onSubscriptionPaused, onSubscriptionPlanChanged, onSubscriptionCancelled, onSubscriptionFailed, onSubscriptionExpired

    onLicenseKeyCreated

환경 변수 설정:

프로젝트에 다음 환경 변수를 정의해야 합니다:

DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_RETURN_URL=https://yourapp.com/success
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" 또는 "live_mode""

코드 내에서 다음과 같이 사용하십시오:

process.env.DODO_PAYMENTS_API_KEY
process.env.DODO_PAYMENTS_WEBHOOK_KEY

보안 주의: 비밀 정보를 버전 관리에 커밋하지 마십시오. 로컬에서는 .env 파일을 사용하고 배포 환경에서는 비밀 관리자를 사용하십시오 (예: AWS, Vercel, Heroku 등).