サブスクリプションの実装を構築する
サブスクリプションを作成して、継続支払いを受け付けるように管理します。




サーバーを設定する
Stripe を設定する
任意の Stripe クライアントをインストールします。
商品と価格を作成する
ダッシュボードまたは Stripe CLI で商品とその価格を作成します。
この例では、「基本」と「プレミアム」という 2 つのサービスレベルオプションがある固定価格のサービスを使用しています。サービスレベルオプションごとに、1 つの商品と 1 つの継続価格を作成する必要があります (初期費用のような 1 回限りの支払いを追加する場合は、1 回限りの価格で 3 つ目の商品を作成します。わかりやすくするために、この例には 1 回限りの支払いを含めていません)。
この例では、各商品が 1 カ月間隔で請求されます。基本商品の価格は 5 USD で、プレミアム商品の価格は 15 USD です。
複数の請求期間を提供している場合は、決済を使用して、請求期間の長い顧客をアップセルし、より多くの収入を前払いで徴収します。
その他の料金体系モデルについては、Billing の例をご覧ください。
Checkout セッションを作成する
Checkout セッションを作成するサーバー上にエンドポイントを追加します。
Checkout セッションの作成時には、以下のパラメーターを渡します。
- 組み込み決済フォームを使用するには、ui_modeを
embedded
に設定します。 - 顧客の購入時にサブスクリプションを作成するには、mode (モード) を
subscription
に設定します。 - 決済を完了または試行した際に顧客が戻るページを定義するには、return_url を指定します。URL に
{CHECKOUT_
のテンプレート変数を含めます。Checkout はこの変数を Checkout セッション ID に置き換えてから、顧客をリダイレクトします。お客様のウェブサイトに戻り先ページを作成してホストしてください。SESSION_ ID} - サブスクリプションとキャンセルの規約、および顧客がサブスクリプションを更新またはキャンセルできるリンクを含めるには、オプションでカスタムテキストを使用します。サブスクリプション登録者にはメールリマインダーと通知を設定することをお勧めします。
Checkout をマウントするには、レスポンスで返される Checkout セッションの client_
を使用します。
サブスクリプションページを構築するクライアント
Checkout をマウントする
戻り先ページを表示する
顧客は支払いを試行した後、お客様のサイトにホストされている戻り先ページにリダイレクトされます。戻り先ページは、Checkout セッションの作成時に return_url パラメーターで指定した URL です。
注
決済の進行中、支払い方法によっては、銀行のオーソリページなどの中間ページに顧客がリダイレクトされる場合があります。そのページでの操作を完了した顧客は、Stripe によって戻り先ページにリダイレクトされます。
エンドポイントを作成して Checkout セッションを取得する
エンドポイントを追加し、URL で Checkout セッションの ID を指定して Checkout セッションのステータスを取得します。
Checkout セッションを取得する
Checkout セッションの詳細を使用するには、戻り先ページが読み込まれたらすぐに URL のCheckout セッション ID を使用して、サーバー上のエンドポイントに Checkout セッションの取得ステータスをリクエストします。
セッションを処理する
セッションのステータスに応じて結果を処理します。
complete
: 決済が成功しました。Checkout セッションの情報を使用して成功ページをレンダリングします。open
: 決済が失敗またはキャンセルされました。 顧客がやり直せるように Checkout を再マウントします。
// Retrieve a Checkout Session // Use the session ID initialize(); async function initialize() { const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const sessionId = urlParams.get('session_id'); const response = await fetch(`/session-status?session_id=${sessionId}`); const session = await response.json(); // Handle the session according to its status if (session.status == 'open') { // Remount embedded Checkout window.location.replace('http://localhost:4242/checkout.html') } else if (session.status == 'complete') { document.getElementById('success').classList.remove('hidden'); document.getElementById('customer-email').textContent = session.customer_email; // Show success page // Optionally use session.payment_status or session.customer_email // to customize the success page } }
// Add an endpoint to fetch the Checkout Session status app.get('/session_status', async (req, res) => { const session = await stripe.checkout.sessions.retrieve(req.query.session_id); const customer = await stripe.customers.retrieve(session.customer); res.send({ status: session.status, payment_status: session.payment_status, customer_email: customer.email }); });
アクセスを提供する
ここまででサブスクリプションが有効になりました。次は、ユーザーがサービスにアクセスできるようにします。これには、customer.
、customer.
、customer.
の各イベントをリッスンします。これらのイベントは、Subscription オブジェクトを渡し、このオブジェクトには、サブスクリプションが有効か、期日超過か、キャンセルされたかを示す status
フィールドが含まれます。ステータスの一覧については、サブスクリプションのライフサイクルをご覧ください。商品の機能へのアクセスの管理については、エンタイトルメントの組み込みに関するドキュメントをご覧ください。
Webhook ハンドラーで、以下を実行します。
- サブスクリプションのステータスを確認します。
active
の場合、ユーザーは商品の支払いを実行しています。 - 顧客が登録している商品を確認し、サービスへのアクセス権を付与します。価格ではなく商品を確認することにより、料金体系や請求期間の変更が必要になった場合に、柔軟に対応できます。
product.
、id subscription.
およびid subscription.
を、すでに保存されているstatus customer.
とともにデータベースに保存します。アプリケーションでユーザーに対して有効にする機能を決定する際に、このレコードを確認します。id
サブスクリプションのステータスは、アプリケーションから直接 Stripe に呼び出しを行わなくても、そのライフサイクルのどの時点でも変更される可能性があります。たとえばクレジットカードの有効期限切れで更新ができなかった場合、サブスクリプションは past due のステータスになります。または、お客様が customer portal を実装している場合、顧客はお客様のアプリケーションに直接アクセスせずにサブスクリプションをキャンセルする可能性があります。ハンドラーを正しく実装することで、お客様のアプリケーションのステータスを Stripe と同期した状態に維持することができます。
組み込みをテストする
支払い方法をテストする
次の表を使用して、さまざまな支払い方法とシナリオをテストします。
決済手段 | シナリオ | テスト方法 |
---|---|---|
BECS ダイレクトデビット | 顧客が BECS ダイレクトデビットによる支払いに成功します。 | アカウント番号900123456 と BSB000000 を使用して、フォームに入力します。確定された PaymentIntent のステータスは、まずprocessing に移行し、3 分後にsucceeded ステータスに移行します。 |
BECS ダイレクトデビット | 顧客の支払いが account_ エラーコードで失敗します。 | アカウント番号 111111113 と BSB 000000 を使用して、フォームに入力します。 |
クレジットカード | カード支払いは成功し、認証は必要とされません。 | クレジットカード番号 4242 4242 4242 4242 と、任意の有効期限、セキュリティコード、郵便番号を使用してクレジットカードフォームに入力します。 |
クレジットカード | カード決済で認証が要求されます。 | クレジットカード番号 4000 0025 0000 3155 と、任意の有効期限、セキュリティコード、郵便番号を使用してクレジットカードフォームに入力します。 |
クレジットカード | カードが insufficient_ などの拒否コードで支払い拒否されます。 | クレジットカード番号 4000 0000 0000 9995 と、任意の有効期限、セキュリティコード、郵便番号を使用してクレジットカードフォームに入力します。 |
SEPA ダイレクトデビット | 顧客が SEPA ダイレクトデビットによる支払いに成功します。 | 口座番号 AT321904300235473204 を使用して、フォームに入力します。確定された PaymentIntent のステータスはまず、processing に移行し、3 分後に succeeded ステータスに移行します。 |
SEPA ダイレクトデビット | 顧客の PaymentIntent ステータスが processing から requires_ に移行します。 | 口座番号 AT861904300235473202 を使用して、フォームに入力します。 |
イベントを監視する
Webhook がアップグレードやキャンセルなどのサブスクリプション変更イベントをリッスンするよう設定します。詳しくは、サブスクリプション Webhook についての記事をご覧ください。イベントは、ダッシュボードまたは Stripe CLI で表示できます。
詳細は、Billing の導入テストをご覧ください。