インストール
パッケージをインストール
プロジェクトのルートで次のコマンドを実行します: npm install @dodopayments/fastify
環境変数を設定
プロジェクトのルートに .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""
See all 5 lines
.env ファイルやシークレットをバージョン管理にコミットしないでください。
ルートハンドラーの例
すべての例は、Fastify アプリルーターを使用していることを前提としています。
チェックアウトハンドラー
カスタマーポータルハンドラー
Webhook ハンドラー
このハンドラーを使用して、Dodo Payments のチェックアウトを Fastify アプリに統合します。静的 (GET)、動的 (POST)、およびセッション (POST) の支払いフローをサポートします。
// route.ts
import { Checkout } from '@dodopayments/fastify' ;
import Fastify from 'fastify'
const fastify = Fastify ({})
const checkoutGet = Checkout ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
type: 'static'
});
const checkoutPost = Checkout ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
type: 'dynamic'
});
const checkoutSession = Checkout ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT ,
returnUrl: process . env . DODO_PAYMENTS_RETURN_URL ,
type: 'session'
});
fastify . get ( '/api/checkout' , checkoutGet . getHandler );
fastify . post ( '/api/checkout' , checkoutPost . postHandler );
fastify . post ( '/api/checkout-session' , checkoutSession . postHandler );
See all 29 lines
Static Checkout Curl example
curl --request GET \
--url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
See all 5 lines
Dynamic Checkout Curl example
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
}'
See all 27 lines
Checkout Session Curl example
curl --request POST \
--url https://example.com/api/checkout-session \
--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"
}'
See all 19 lines
このハンドラーを使用して、顧客が Dodo Payments カスタマーポータルを介してサブスクリプションや詳細を管理できるようにします。
// route.ts
import { CustomerPortal } from "@dodopayments/fastify" ;
import Fastify from 'fastify'
const fastify = Fastify ({})
const customerPortalHandler = CustomerPortal ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: process . env . DODO_PAYMENTS_ENVIRONMENT
});
fastify . get ( '/api/customer-portal' , customerPortalHandler );
See all 10 lines
Customer Portal Curl example
curl --request GET \
--url 'https://example.com/api/customer-portal?customer_id=cus_9VuW4K7O3GHwasENg31m&send_email=true' \
--header 'User-Agent: insomnia/11.2.0' \
--cookie mode=test
See all 5 lines
このハンドラーを使用して、Dodo Payments の Webhook イベントを安全に受信して処理します。
// route.ts
import Fastify from 'fastify'
import { Webhooks } from '@dodopayments/fastify'
const fastify = Fastify ({})
fastify . addContentTypeParser ( 'application/json' , { parseAs: 'string' }, function ( req , body , done ) {
done ( null , body )
})
fastify . post ( '/api/webhooks' , Webhooks ({
webhookKey: process . env . DODO_PAYMENTS_WEBHOOK_KEY ,
onPayload : async ( payload ) => {
// Handle Payload Here
console . log ( payload )
}
}));
See all 17 lines
チェックアウトルートハンドラー
Dodo Payments は、ウェブサイトに支払いを統合するための 3 種類の支払いフローをサポートしており、このアダプタはすべてのタイプの支払いフローをサポートしています。
静的支払いリンク: すぐに共有可能な URL で、迅速かつノーコードでの支払い収集が可能です。
動的支払いリンク: API または SDK を使用して、カスタム詳細を持つ支払いリンクをプログラムで生成します。
チェックアウトセッション: 事前に設定された商品カートと顧客詳細を使用して、安全でカスタマイズ可能なチェックアウト体験を作成します。
サポートされているクエリパラメータ 商品識別子 (例: ?productId=pdt_nZuwz45WAs64n3l07zpQR)。
支払い金額を指定します (例: 1000 は $10.00 を意味します)。
metadata_ で始まる任意のクエリパラメータはメタデータとして渡されます。
productId が欠けている場合、ハンドラーは 400 のレスポンスを返します。無効なクエリパラメータも 400 のレスポンスになります。
レスポンス形式 静的チェックアウトは、チェックアウト URL を含む JSON レスポンスを返します: {
"checkout_url" : "https://checkout.dodopayments.com/..."
}
パラメータを POST リクエストの JSON ボディとして送信します。
一回限りの支払いと定期的な支払いの両方をサポートします。
サポートされている POST ボディフィールドの完全なリストについては、次を参照してください:
レスポンス形式 動的チェックアウトは、チェックアウト URL を含む JSON レスポンスを返します: {
"checkout_url" : "https://checkout.dodopayments.com/..."
}
チェックアウトセッションは、より安全でホストされたチェックアウト体験を提供し、一回限りの購入とサブスクリプションの完全な支払いフローを処理します。 詳細とサポートされているフィールドの完全なリストについては、チェックアウトセッション統合ガイド を参照してください。 レスポンス形式 チェックアウトセッションは、チェックアウト URL を含む JSON レスポンスを返します: {
"checkout_url" : "https://checkout.dodopayments.com/session/..."
}
カスタマーポータルルートハンドラー
カスタマーポータルルートハンドラーを使用すると、Dodo Payments カスタマーポータルを Fastify アプリケーションにシームレスに統合できます。
クエリパラメータ
ポータルセッションの顧客 ID (例: ?customer_id=cus_123)。
true に設定すると、顧客にポータルリンクを含むメールが送信されます。
customer_id が欠けている場合、400 を返します。
Webhook ルートハンドラー
メソッド: POST リクエストのみがサポートされています。他のメソッドは 405 を返します。
署名検証: webhookKey を使用して Webhook 署名を検証します。検証に失敗した場合は 401 を返します。
ペイロード検証: Zod で検証されます。無効なペイロードには 400 を返します。
エラーハンドリング:
401: 無効な署名
400: 無効なペイロード
500: 検証中の内部エラー
イベントルーティング: ペイロードタイプに基づいて適切なイベントハンドラーを呼び出します。
サポートされている Webhook イベントハンドラー
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 > ;
See all 22 lines
LLM 用のプロンプト
あなたは専門の Fastify 開発者アシスタントです。あなたの仕事は、ユーザーが既存の Fastify プロジェクトに @dodopayments/fastify アダプタを統合する手助けをすることです。
@dodopayments/fastify アダプタは、Dodo Payments のチェックアウト、カスタマーポータル、および Webhook 機能のためのルートハンドラーを提供し、Fastify アプリに直接接続できるように設計されています。
まず、必要なパッケージをインストールします。ユーザーのプロジェクトに適したパッケージマネージャー (npm、yarn、または bun) を使用してください:
npm install @dodopayments/fastify
---
以下のように応答を構成してください:
1. ユーザーに統合したい機能を尋ねます。
"@dodopayments/fastify アダプタのどの部分をプロジェクトに統合したいですか?次の中から 1 つ以上を選択できます:
- チェックアウトルートハンドラー (商品チェックアウトの処理用)
- カスタマーポータルルートハンドラー (顧客のサブスクリプション/詳細の管理用)
- Webhook ルートハンドラー (Dodo Payments の Webhook イベントの受信用)
- すべて (3 つすべてを統合)"
---
2. ユーザーの選択に基づいて、各選択された機能の詳細な統合手順を提供します。
---
**チェックアウトルートハンドラーが選択された場合:**
**目的**: このハンドラーは、ユーザーを Dodo Payments のチェックアウトページにリダイレクトします。
**統合**:
Fastify アプリに静的 (GET) と動的 (POST) のチェックアウト用の 2 つのルートを作成します。
import { Checkout } from '@dodopayments/fastify';
import Fastify from 'fastify'
const fastify = Fastify({})
const checkoutGet = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'static'
});
const checkoutPost = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'dynamic'
});
const checkoutSession = Checkout({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
type: 'session'
});
fastify.get('/api/checkout', checkoutGet.getHandler);
fastify.post('/api/checkout', checkoutPost.postHandler);
fastify.post('/api/checkout-session', checkoutSession.postHandler);
設定オプション:
bearerToken: あなたの Dodo Payments API キー (DODO_PAYMENTS_API_KEY 環境変数に保存することを推奨)。
returnUrl (オプション): チェックアウト成功後にユーザーをリダイレクトする URL。
environment: "test_mode" または "live_mode"
type: "static" (GET)、"dynamic" (POST)、または "session" (POST)
GET (静的チェックアウト) は次のクエリパラメータを期待します:
productId (必須)
quantity、顧客フィールド (fullName、email など)、およびメタデータ (metadata_*) はオプションです。
戻り値: {"checkout_url": "https://checkout.dodopayments.com/..."}
POST (動的チェックアウト) は、支払い詳細 (一回限りまたはサブスクリプション) を含む JSON ボディを期待します。戻り値: {"checkout_url": "https://checkout.dodopayments.com/..."}。完全な POST スキーマについては、ドキュメントを参照してください:
一回限りの支払い: https://docs.dodopayments.com/api-reference/payments/post-payments
サブスクリプション: https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions
POST (チェックアウトセッション) - (推奨) よりカスタマイズ可能なチェックアウト体験。戻り値は JSON で checkout_url を含みます: パラメータは JSON ボディとして送信されます。一回限りの支払いと定期的な支払いの両方をサポートします。戻り値: {"checkout_url": "https://checkout.dodopayments.com/session/..."}。サポートされているフィールドの完全なリストについては、次を参照してください:
チェックアウトセッション統合ガイド: https://docs.dodopayments.com/developer-resources/checkout-session
カスタマーポータルルートハンドラーが選択された場合:
目的: このルートは、顧客が Dodo Payments ポータルを介してサブスクリプションを管理できるようにします。
統合:
import { CustomerPortal } from "@dodopayments/fastify";
import Fastify from 'fastify'
const fastify = Fastify({})
const customerPortalHandler = CustomerPortal({
bearerToken: process.env.DODO_PAYMENTS_API_KEY,
environment: process.env.DODO_PAYMENTS_ENVIRONMENT
});
fastify.get('/api/customer-portal', customerPortalHandler);
クエリパラメータ:
customer_id (必須): 例: ?customer_id=cus_123
send_email (オプション): true の場合、顧客にポータルリンクがメールで送信されます。
customer_id が欠けている場合は 400 を返します。
Webhook ルートハンドラーが選択された場合:
目的: Dodo Payments からの受信 Webhook イベントを処理して、アプリ内のイベントをトリガーします。
統合:
import Fastify from 'fastify'
import { Webhooks } from '@dodopayments/fastify'
const fastify = Fastify({})
fastify.addContentTypeParser('application/json', { parseAs: 'string' }, function (req, body, done) {
done(null, body)
})
fastify.post('/api/webhooks', Webhooks({
webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
onPayload: async (payload) => {
// ペイロードをここで処理
console.log(payload)
}
}));
機能:
POST メソッドのみが許可されており、他は 405 を返します。
署名検証は webhookKey を使用して行われます。無効な場合は 401 を返します。
Zod ベースのペイロード検証。無効なスキーマの場合は 400 を返します。
すべてのハンドラーは非同期関数です。
サポートされている Webhook イベントハンドラー:
次のいずれかのハンドラーを渡すことができます:
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 など)。