前提条件
Dodo Payments APIを統合するには、以下が必要です:
Dodo Paymentsのマーチャントアカウント
ダッシュボードからのAPI認証情報(APIキーとWebhookシークレットキー)
ダッシュボードの設定
Dodo Paymentsダッシュボード に移動します。
商品を作成します(一回限りの支払いまたはサブスクリプション)。
APIキーを生成します:
Developer > APIに移動します。
詳細ガイド
環境変数DODO_PAYMENTS_API_KEYにAPIキーをコピーします。
Webhookを設定します:
Developer > Webhooksに移動します。
支払い通知用のWebhook URLを作成します。
環境変数にWebhookシークレットキーをコピーします。
支払いリンク
ユースケースに合った統合パスを選択してください:
チェックアウトセッション(推奨) :ほとんどの統合に最適です。サーバー上でセッションを作成し、顧客を安全なホストされたチェックアウトにリダイレクトします。
オーバーレイチェックアウト(埋め込み) :ホストされたチェックアウトをサイトに埋め込む必要がある場合に使用します。
静的支払いリンク :ノーコードで、すぐに共有可能なURLで迅速な支払い収集が可能です。
動的支払いリンク :プログラムで作成されたリンク。ただし、チェックアウトセッションが推奨され、より柔軟性があります。
1. チェックアウトセッション
チェックアウトセッションを使用して、一回限りの支払いまたはサブスクリプションのための安全なホストされたチェックアウト体験を作成します。サーバー上でセッションを作成し、顧客を返されたcheckout_urlにリダイレクトします。
チェックアウトセッションはデフォルトで24時間有効です。confirm=trueを渡すと、セッションは15分間有効で、すべての必須フィールドを提供する必要があります。
チェックアウトセッションを作成する
お好みのSDKを選択するか、REST APIを呼び出します。 Node.js SDK
Python SDK
REST API
import DodoPayments from 'dodopayments' ;
const client = new DodoPayments ({
bearerToken: process . env . DODO_PAYMENTS_API_KEY ,
environment: 'test_mode' , // defaults to 'live_mode'
});
const session = await client . checkoutSessions . create ({
product_cart: [{ product_id: 'prod_123' , quantity: 1 }],
customer: { email: '[email protected] ' , name: 'John Doe' },
return_url: 'https://yourapp.com/checkout/success' ,
});
import os
from dodopayments import DodoPayments
client = DodoPayments(
bearer_token = os.environ.get( "DODO_PAYMENTS_API_KEY" ),
environment = "test_mode" , # defaults to "live_mode"
)
session = client.checkout_sessions.create(
product_cart = [{ "product_id" : "prod_123" , "quantity" : 1 }],
customer = { "email" : "[email protected] " , "name" : "John Doe" },
return_url = "https://yourapp.com/checkout/success" ,
)
const response = await fetch ( 'https://test.dodopayments.com/checkouts' , {
method: 'POST' ,
headers: {
'Content-Type' : 'application/json' ,
'Authorization' : `Bearer ${ process . env . DODO_PAYMENTS_API_KEY } ` ,
},
body: JSON . stringify ({
product_cart: [{ product_id: 'prod_123' , quantity: 1 }],
customer: { email: '[email protected] ' , name: 'John Doe' },
return_url: 'https://yourapp.com/checkout/success' ,
}),
});
const session = await response . json ();
顧客をチェックアウトにリダイレクトする
セッション作成後、checkout_urlにリダイレクトしてホストされたフローを開始します。 // Example in a browser context
window . location . href = session . checkout_url ;
2. オーバーレイチェックアウト
シームレスなインページチェックアウト体験のために、顧客がウェブサイトを離れることなく支払いを完了できるオーバーレイチェックアウト 統合を検討してください。
3. 静的支払いリンク
静的支払いリンクを使用すると、シンプルなURLを共有することで迅速に支払いを受け付けることができます。クエリパラメータを渡すことで、顧客の詳細を事前入力し、フォームフィールドを制御し、カスタムメタデータを追加してチェックアウト体験をカスタマイズできます。
支払いリンクを構築する
ベースURLから始めて、商品IDを追加します: https://checkout.dodopayments.com/buy/{productid}
顧客情報を事前入力する(オプション)
チェックアウトをスムーズにするために、顧客または請求フィールドをクエリパラメータとして追加します。
顧客のフルネーム(firstNameまたはlastNameが提供されている場合は無視されます)。
フォームフィールドを制御する(オプション)
特定のフィールドを無効にして、顧客にとって読み取り専用にすることができます。これは、すでに顧客の詳細を持っている場合(例:ログインユーザー)に便利です。
フィールドを無効にするには、その値を提供し、対応するdisable…フラグをtrueに設定します: フィールド 無効フラグ 必須パラメータ フルネーム disableFullNamefullName名 disableFirstNamefirstName姓 disableLastNamelastNameメール disableEmailemail国 disableCountrycountry住所 disableAddressLineaddressLine市 disableCitycity州 disableStatestate郵便番号 disableZipCodezipCode
フィールドを無効にすることで、誤った変更を防ぎ、データの一貫性を確保できます。
showDiscounts=falseを設定すると、チェックアウトフォームの割引セクションが無効になり、非表示になります。これは、顧客がチェックアウト中にクーポンやプロモコードを入力するのを防ぎたい場合に使用します。
高度なコントロールを追加する(オプション)
支払い通貨を指定します。デフォルトは請求国の通貨です。
セント単位の金額(「支払いたい金額」価格設定のみ)。
カスタムメタデータフィールド(例:metadata_orderId=123)。
リンクを共有する
完成した支払いリンクを顧客に送信します。顧客が訪問すると、すべてのクエリパラメータが収集され、セッションIDと共に保存されます。URLは、セッションパラメータ(例:?session=sess_1a2b3c4d)だけを含むように簡略化されます。保存された情報はページのリフレッシュを通じて持続し、チェックアウトプロセス全体でアクセス可能です。 顧客のチェックアウト体験は、あなたのパラメータに基づいてスムーズでパーソナライズされています。
4. 動的支払いリンク
ほとんどのユースケースにはチェックアウトセッションを優先してください。これにより、より柔軟性と制御が得られます。
API呼び出しまたはSDKを介して顧客の詳細で作成されます。以下はその例です:
動的支払いリンクを作成するためのAPIは2つあります:
以下のガイドは、一回限りの支払いリンクの作成に関するものです。
サブスクリプションの統合に関する詳細な手順については、サブスクリプション統合ガイド を参照してください。
支払いリンクを取得するためにpayment_link = trueを渡していることを確認してください。
Node.js SDK
Python SDK
Go SDK
APIリファレンス
import DodoPayments from 'dodopayments' ;
const client = new DodoPayments ({
bearerToken: process . env [ 'DODO_PAYMENTS_API_KEY' ], // This is the default and can be omitted
environment: 'test_mode' , // defaults to 'live_mode'
});
async function main () {
const payment = await client . payments . create ({
payment_link: true ,
billing: { city: 'city' , country: 'AF' , state: 'state' , street: 'street' , zipcode: 0 },
customer: { email: '[email protected] ' , name: 'name' },
product_cart: [{ product_id: 'product_id' , quantity: 0 }],
});
console . log ( payment . payment_id );
}
main ();
import os
from dodopayments import DodoPayments
client = DodoPayments(
bearer_token = os.environ.get( "DODO_PAYMENTS_API_KEY" ), # This is the default and can be omitted (if using same name `DODO_PAYMENTS_API_KEY`)
environment = "test_mode" , # defaults to "live_mode"
)
payment = client.payments.create(
payment_link = True ,
billing = {
"city" : "city" ,
"country" : "AF" ,
"state" : "state" ,
"street" : "street" ,
"zipcode" : 0 ,
},
customer = {
"email" : "[email protected] " ,
"name" : "name" ,
},
product_cart = [{
"product_id" : "product_id" ,
"quantity" : 0 ,
}],
)
print (payment.payment_link)
package main
import (
" context "
" fmt "
" github.com/dodopayments/dodopayments-go "
" github.com/dodopayments/dodopayments-go/option "
)
func main () {
client := dodopayments . NewClient (
option . WithBearerToken ( "My Bearer Token" ), // defaults to os.LookupEnv("DODO_PAYMENTS_API_KEY")
)
payment , err := client . Payments . New ( context . TODO (), dodopayments . PaymentNewParams {
PaymentLink : dodopayments . F ( true ),
Billing : dodopayments . F ( dodopayments . PaymentNewParamsBilling {
City : dodopayments . F ( "city" ),
Country : dodopayments . F ( dodopayments . CountryCodeAf ),
State : dodopayments . F ( "state" ),
Street : dodopayments . F ( "street" ),
Zipcode : dodopayments . F ( int64 ( 0 )),
}),
Customer : dodopayments . F ( dodopayments . PaymentNewParamsCustomer {
Email : dodopayments . F ( "email" ),
Name : dodopayments . F ( "name" ),
}),
ProductCart : dodopayments . F ([] dodopayments . PaymentNewParamsProductCart { dodopayments . PaymentNewParamsProductCart {
ProductID : dodopayments . F ( "product_id" ),
Quantity : dodopayments . F ( int64 ( 0 )),
}}),
})
if err != nil {
panic ( err . Error ())
}
fmt . Printf ( " %+v \n " , payment . PaymentLink )
}
import { NextRequest , NextResponse } from "next/server" ;
export async function POST ( request : NextRequest ) {
try {
const body = await request . json ();
const { formData , cartItems } = paymentRequestSchema . parse ( body );
const response = await fetch ( ` ${ process . env . NEXT_PUBLIC_DODO_TEST_API } /payments` , {
method: "POST" ,
headers: {
"Content-Type" : "application/json" ,
Authorization: `Bearer ${ process . env . DODO_API_KEY } ` , // Replace with your API secret key generated from the Dodo Payments Dashboard
},
body: JSON . stringify ({
billing: {
city: formData . city ,
country: formData . country ,
state: formData . state ,
street: formData . addressLine ,
zipcode: parseInt ( formData . zipCode ),
},
customer: {
email: formData . email ,
name: ` ${ formData . firstName } ${ formData . lastName } ` ,
phone_number: formData . phoneNumber || undefined ,
},
payment_link: true ,
product_cart: cartItems . map (( id ) => ({
product_id: id ,
quantity: 1 ,
})),
return_url: process . env . NEXT_PUBLIC_RETURN_URL ,
}),
});
if ( ! response . ok ) {
const errorData = await response . json (). catch (() => null );
return NextResponse . json (
{ error: "Payment link creation failed" , details: errorData },
{ status: response . status }
);
}
const data = await response . json ();
return NextResponse . json ({ paymentLink: data . payment_link });
} catch ( err ) {
console . error ( "Payment error:" , err );
return NextResponse . json (
{
error: err instanceof Error ? err . message : "An unknown error occurred" ,
},
{ status: 500 }
);
}
}
支払いリンクを作成した後、顧客をリダイレクトして支払いを完了させます。
Webhookの実装
支払い通知を受信するためのAPIエンドポイントを設定します。以下はNext.jsを使用した例です:
import { Webhook } from "standardwebhooks" ;
import { headers } from "next/headers" ;
import { WebhookPayload } from "@/types/api-types" ;
const webhook = new Webhook ( process . env . DODO_WEBHOOK_KEY ! ); // Replace with your secret key generated from the Dodo Payments Dashboard
export async function POST ( request : Request ) {
const headersList = headers ();
const rawBody = await request . text ();
const webhookHeaders = {
"webhook-id" : headersList . get ( "webhook-id" ) || "" ,
"webhook-signature" : headersList . get ( "webhook-signature" ) || "" ,
"webhook-timestamp" : headersList . get ( "webhook-timestamp" ) || "" ,
};
await webhook . verify ( rawBody , webhookHeaders );
const payload = JSON . parse ( rawBody ) as WebhookPayload ;
// Process the payload according to your business logic
}
私たちのWebhook実装は、Standard Webhooks 仕様に従っています。Webhookタイプの定義については、Webhookイベントガイド を参照してください。
Next.jsとTypeScriptを使用したデモ実装のプロジェクトは、GitHub で参照できます。
ライブ実装はこちら で確認できます。