概要
プラグインの収益化方法は、開発者自身の責任で選択します。現在、 推奨 され、 一般提供 されている方法は、開発者自身のドメインでユーザーが購入を完了する 外部チェックアウトです。現在承認されているのは物理的な商品の購入に対応するプラグインのみですが、より幅広いコマースのユースケースに対応できるよう、積極的に取り組んでいます。
また、一部のマーケットプレイスパートナー向けに、 ChatGPT の支払いシートを使った埋め込み型チェックアウト の提供を ベータ版として進めています。今後、より多くのマーケットプレイスや 物理的な商品を扱う小売事業者に利用対象を拡大する予定です。それまでは、 通常の外部チェックアウトに購入フローを誘導することをお勧めします。
推奨される収益化方法
✅ 外部チェックアウト(推奨)
外部チェックアウト とは、ChatGPT から自社のウェブサイトやアプリケーション上の 販売事業者がホストするチェックアウトフロー へユーザーを誘導する方法です。対象となる物理的な商品の価格設定、決済、配送、注文の履行は、自社で処理します。
ほとんどのプラグイン開発者には、この方法をお勧めします。
仕組み
- ユーザーが ChatGPT でプラグイン UI を操作します。
- プラグイン UI に、対象となる物理的な商品を表示します(たとえば、「今すぐ購入」アクションを付けます)。
- ユーザーが購入を決めると、プラグイン UI がリンクまたはリダイレクトによって、ChatGPT から自社の外部チェックアウトフローへ誘導します。
- 決済、請求、税金、返金、コンプライアンスへの対応は、すべて自社のドメインで行います。
- 購入後、ユーザーは注文確認情報や配送追跡情報を持って ChatGPT に戻ることができます。
保存済みの支払い方法によるチェックアウト
プラグイン開発者は、顧客が販売事業者に保存済みの支払い方法を使えるチェックアウトフローを、オプションの UI に実装できます。このフローでは保存済みの支払い方法の表示のみが可能で、顧客から新たな支払い方法の認証情報を収集することはできません。
この方法では、顧客は ChatGPT 外の別の画面にリダイレクトされることなく、購入を完了できます。
仕組み
- ユーザーが ChatGPT でプラグイン UI を操作します。
- プラグイン UI に、対象となる物理的な商品と、それに対応する合計金額を表示します。
- プラグイン UI に、顧客が自社に保存済みの支払い方法のうち、利用可能なものを表示します。
- 顧客が保存済みの支払い方法を選択し、ChatGPT 内で購入を確定します。
- 自社のサーバーが保存済みの支払い方法で購入を処理し、確認情報をプラグインに返します。
ChatGPT の支払いシートによるチェックアウト(プライベートベータ)
ChatGPT の支払いシートによるチェックアウトは、現在、一部のマーケットプレイスに限定されており、すべてのユーザーが利用できるわけではありません。
チェックアウトフロー内で新しい支払い方法を収集するには、プラグイン開発者は
ChatGPT の支払いシートを使用する必要があります。チェックアウトセッションのデータ
(商品明細、合計金額、保存済みの支払い方法)を渡して requestCheckout を呼び出すと、シートが開きます。ユーザーが
購入を選択すると、ChatGPT は選択された支払い方法を表すトークンを、
complete_checkout ツールの呼び出しを通じて自社の MCP サーバーに送信します。PSP との連携を利用して
このトークンで決済を行い、確定した注文の詳細を
complete_checkout から返します。
フローの概要
- サーバーでセッションを準備:MCP ツールが、チェックアウトセッションのデータ(セッション ID、商品明細、合計金額、決済プロバイダー)を
structuredContentに格納して返します。 - ウィジェットでカートをプレビュー:ウィジェットが商品明細と合計金額を表示し、ユーザーが確認できるようにします。
- ウィジェットから
requestCheckoutを呼び出し:ウィジェットがrequestCheckout(session_data)を呼び出します。ChatGPT が支払いシートを開き、請求金額と各種支払い方法を表示します。 - サーバーで確定処理:ユーザーが支払いボタンをクリックすると、ウィジェットは
complete_checkoutツールの呼び出しを通じて、自社の MCP にコールバックします。MCP ツールが完了した注文を返し、その内容がrequestCheckoutへのレスポンスとしてウィジェットに返されます。
チェックアウトセッション
ホストが表示するチェックアウトセッションのペイロードは、開発者の責任で構築します。id や payment_provider などのフィールドに設定する具体的な値は、利用する決済サービスプロバイダーとコマースシステムによって異なります。実際には、MCP ツールから次の情報を返す必要があります。
- ユーザーが購入する商品の明細と数量
- サーバー側の計算と一致する金額の集計(小計、税金、割引、手数料、合計)
- PSP との連携に必要なプロバイダーのメタデータ
- 法的事項やポリシーへのリンク(規約、返金ポリシーなど)
ウィジェット:requestCheckout の呼び出し
ホストは window.openai.requestCheckout を提供します。ユーザーが購入を開始したときに、これを使って ChatGPT の支払いシートを開きます。
例:
async function handleCheckout(sessionJson: string) {
const session = JSON.parse(sessionJson);
if (!window.openai?.requestCheckout) {
throw new Error("requestCheckout is not available in this host");
}
// Host opens the ChatGPT payment sheet.
const order = await window.openai.requestCheckout({
...session,
id: String(checkout_session_id), // Use a unique ID for every checkout session.
});
return order; // Host returns the order payload.
}
コンポーネントでは、たとえばボタンのクリック時にこの処理を開始できます。
<Button
onClick={async () => {
setIsLoading(true);
try {
const orderResponse = await handleCheckout(checkoutSessionJson);
setOrder(orderResponse);
} catch (error) {
console.error(error);
} finally {
setIsLoading(false);
}
}}
>
{isLoading ? "Loading..." : "Checkout"}
</Button>
以下は、ウィジェットからホストに渡せるチェックアウトセッションの完全な例です。
プラグインは、以下のチェックアウトセッションのフィールドを提供します。ChatGPT は、
merchant、logo_url、conversation_id、
connector_id、ecosystem_app_uri など、ホストが管理するフィールドを追加します。merchant_id フィールドには、
PSP が指定する値を設定してください。
const checkoutRequest = {
id: "checkout_session_123",
payment_provider: {
provider: "stripe",
merchant_id: "merchant_123",
supported_payment_methods: [
{
type: "card",
allowed_card_brands: ["visa", "mastercard"],
},
{ type: "apple_pay" },
{ type: "google_pay" },
],
managed_payment_methods: [
{
type: "card",
id: "pm_123",
display_name: "Visa ending in 4242",
display_last4: "4242",
display_brand: "visa",
},
],
},
payment_mode: "live",
status: "ready_for_payment",
currency: "USD",
metadata: {
cart_id: "cart_123",
merchant_order_reference: "order_ref_123",
},
line_items: [
{
id: "line_item_123",
item: {
id: "item_123",
quantity: 1,
},
name: "Canvas backpack",
description: "A weather-resistant everyday backpack.",
images: ["https://merchant.example.com/images/canvas-backpack.png"],
base_amount: 3000,
discount: 0,
subtotal: 3000,
tax: 300,
total: 3300,
},
],
totals: [
{
type: "items_base_amount",
display_text: "Items subtotal",
amount: 3000,
},
{
type: "subtotal",
display_text: "Subtotal",
amount: 3000,
},
{
type: "fulfillment",
display_text: "Shipping",
amount: 550,
},
{
type: "tax",
display_text: "Tax",
amount: 300,
},
{
type: "total",
display_text: "Total",
amount: 3850,
},
],
fulfillment_options: [
{
id: "standard_shipping",
type: "shipping",
title: "Standard shipping",
subtitle: "Arrives in 3-5 business days",
carrier: "USPS",
earliest_delivery_time: "2027-01-15T15:00:00Z",
latest_delivery_time: "2027-01-19T18:00:00Z",
subtotal: 500,
tax: 50,
total: 550,
},
],
fulfillment_option_id: "standard_shipping",
fulfillment_address: {
name: "Jane Customer",
line_one: "123 Main St",
line_two: "Apt 4B",
city: "San Francisco",
state: "CA",
country: "US",
postal_code: "94107",
phone_number: "+14155550123",
},
messages: [
{
type: "info",
param: "fulfillment_address",
content_type: "plain",
content: "Free returns within 30 days.",
},
],
links: [
{ type: "terms_of_use", url: "https://merchant.example.com/terms" },
{ type: "privacy_policy", url: "https://merchant.example.com/privacy" },
{ type: "support_url", url: "https://merchant.example.com/support" },
],
};
const response = await window.openai.requestCheckout(checkoutRequest);
要点:
window.openai.requestCheckout(session)は、ホストのチェックアウト UI を開きます。- Promise は注文結果を返して解決され、エラーやキャンセルが発生すると拒否されます。
- ユーザーが支払い内容を確認できるよう、セッションの JSON を表示してください。
- すべての金額フィールドには、通貨の最小単位で表した整数を使用してください。
- 顧客が販売事業者に保存済みの支払い方法には、
payment_provider.managed_payment_methodsを使用してください。 metadataの値は文字列のまま保持してください。providerには、連携先が要求する PSP のスラッグを使用し、merchant_idの値は PSP に問い合わせて取得してください。
MCP サーバー:complete_checkout ツールの公開
このパターンを参考に、独自のロジックに置き換えることができます。
CallToolResult を直接返す場合、Python MCP SDK は以下の Annotated 戻り値型を使用して、
structuredContent に対応するツールの outputSchema を宣言します。
from typing import Annotated, Any
from pydantic import BaseModel
class CompleteCheckoutOutput(BaseModel):
id: str
status: str
currency: str
line_items: list[dict[str, Any]]
fulfillment_address: dict[str, Any]
fulfillment_options: list[dict[str, Any]]
fulfillment_option_id: str
totals: list[dict[str, Any]]
order: dict[str, Any]
@tool(description="")
async def complete_checkout(
self,
checkout_session_id: str,
buyer: Buyer,
payment_data: PaymentData,
) -> Annotated[types.CallToolResult, CompleteCheckoutOutput]:
return types.CallToolResult(
content=[],
structuredContent={
"id": checkout_session_id,
"status": "completed",
"currency": "USD",
"line_items": [
{
"id": "line_item_1",
"item": {
"id": "item_1",
"quantity": 1,
},
"base_amount": 3000,
"discount": 0,
"subtotal": 3000,
"tax": 300,
"total": 3300,
},
],
"fulfillment_address": {
"name": "Jane Customer",
"line_one": "123 Main St",
"line_two": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"country": "US",
"postal_code": "94107",
"phone_number": "+1 (555) 555-5555",
},
"fulfillment_options": [
{
"id": "fulfillment_option_1",
"type": "shipping",
"title": "Standard shipping",
"subtitle": "3-5 business days",
"carrier": "USPS",
"earliest_delivery_time": "2026-02-24T15:00:00Z",
"latest_delivery_time": "2026-02-28T18:00:00Z",
"subtotal": 0,
"tax": 0,
"total": 0,
},
],
"fulfillment_option_id": "fulfillment_option_1",
"totals": [
{
"type": "items_base_amount",
"display_text": "Items subtotal",
"amount": 3000,
},
{
"type": "subtotal",
"display_text": "Subtotal",
"amount": 3000,
},
{
"type": "tax",
"display_text": "Tax",
"amount": 300,
},
{
"type": "total",
"display_text": "Total",
"amount": 3300,
},
],
"order": {
"id": "order_id_123",
"checkout_session_id": checkout_session_id,
"permalink_url": "",
},
},
_meta={META_SESSION_ID: "checkout-flow"},
isError=False,
)
以下の処理を行うように調整してください。
- 決済サービスプロバイダーと連携し、
payment_data内の支払い方法で請求を行います。 - 自社のシステムに注文を永続化します。
- 正本となる注文・領収書データを返します。
- 確認ウィジェットを表示する場合は、
_meta.ui.resourceUriを含めてください(ChatGPT は、互換性のための任意のエイリアスとして_meta["openai/outputTemplate"]も受け付けます)。
以下の決済サービスプロバイダーが、ChatGPT の支払いシートの決済処理に対応しています。
- Adyen
- Checkout.com
- Fiserv
- PayPal
- Stripe
- Worldpay
任意:決済手段の生データの受信
PCI DSS Level 1 認証を取得した加盟店は、Agentic Commerce Protocol の Delegate Payment エンドポイントを実装することで、決済手段の生データを直接受信できます。決済委任リクエストには、カード番号の生データ、有効期限、CVC、請求先住所、利用許可に関する制約、リスクシグナル、メタデータなど、決済フローに必要な決済手段の詳細情報がすべて含まれます。
たとえば、カードの生データを含む決済手段のリクエストは次のようになります。
{
"payment_method": {
"type": "card",
"card_number_type": "fpan",
"number": "4242424242424242",
"exp_month": "11",
"exp_year": "2026",
"name": "Jane Doe",
"cvc": "223",
"checks_performed": ["avs", "cvv"],
"iin": "424242",
"display_card_funding_type": "credit",
"display_brand": "visa",
"display_last4": "4242",
"metadata": {}
},
"allowance": {
"reason": "one_time",
"max_amount": 5000,
"currency": "usd",
"checkout_session_id": "cs_01HV3P3ABC123",
"merchant_id": "acme_corp",
"expires_at": "2026-02-13T12:00:00Z"
},
"billing_address": {
"name": "Jane Doe",
"line_one": "185 Berry Street",
"line_two": "Suite 550",
"city": "San Francisco",
"state": "CA",
"country": "US",
"postal_code": "94107"
},
"risk_signals": [
{
"type": "card_testing",
"score": 5,
"action": "authorized"
}
],
"metadata": {
"session_id": "sess_abc123",
"user_agent": "ChatGPT/2.0"
}
}
対応するレスポンスでは、決済手段を表す ID を返す必要があります。この ID は、payment_data の一部として complete_checkout に渡されます。
{
"id": "vt_01J8Z3WXYZ9ABC123",
"created": "2026-02-12T14:30:00Z",
"metadata": {
"source": "agent_checkout",
"merchant_id": "acme_corp",
"idempotency_key": "idem_xyz789"
}
}
エラー処理
complete_checkout ツールの呼び出しでは、error 型のメッセージを返せます。code が payment_declined または requires_3ds に設定されたエラーメッセージは、ChatGPT の決済シートに表示されます。それ以外のエラーメッセージはすべて、requestCheckout へのレスポンスとしてウィジェットに返されます。ウィジェット側では、任意の方法でエラーを表示できます。
テスト決済モード
requestCheckout の呼び出しで、payment_mode フィールドの値を test に設定できます。これにより、テストカード(4242 テストカードなど)を受け付ける ChatGPT の決済シートが表示されます。その結果、complete_checkout ツールに渡される payment_data 内の token は、PSP のステージング環境で処理できます。実際に資金を移動することなく、エンドツーエンドのフローをテストできます。
テスト決済モードでは、merchant_id に異なる値を設定する必要がある場合があります。
詳しくは、ご利用の決済プロバイダーの
収益化ガイドを参照してください。
実装チェックリスト
- チェックアウトセッションモデルの定義:ID、決済プロバイダーのオブジェクト、 明細項目、合計金額、法的事項へのリンクを含めます。
- MCP ツールからセッションを返します 。ウィジェットテンプレートとともに、
structuredContentに含めて返します。 - ユーザーが商品、合計金額、規約を確認できるよう、ウィジェットにセッションを表示します 。
- ユーザーの操作に応じて
requestCheckout(session_data)を呼び出し 、返された注文結果またはエラーを処理します。 - チェックアウト仕様に沿ったレスポンスを返す
complete_checkoutMCP ツールを実装し、 ユーザーに請求します 。 - 実際の利用を想定した金額、税金、割引でエンドツーエンドのテストを実施し 、ホストに想定どおりの合計金額が表示されることを確認します。