メインコンテンツへスキップ
← 記事一覧に戻る
·開発·6 min read

Stripe × Next.js 決済導入ガイド2026 — 個人開発で売上を立てるまでの全手順

StripeNext.js個人開発決済

個人開発でも決済は簡単に導入できる

「個人開発で課金機能を付けるのは難しそう…」と思っていませんか?Stripeを使えば、1日で決済機能を実装できます。

筆者はNext.js + Supabase + Stripeの構成で個人開発SaaSを¥9,800で販売しています。決済機能の実装は実質2〜3時間でした。

この記事でわかること:

  • Stripeアカウント開設から初期設定まで
  • Next.jsでCheckout Sessionを作成する方法
  • Webhookで購入を自動処理する方法
  • テスト→本番切り替えの注意点

全体の流れ

ユーザーが「購入」ボタンをクリック
  → Next.js APIでStripe Checkout Session作成
  → Stripeの決済ページにリダイレクト
  → 決済完了
  → Webhook でNext.js APIに通知
  → Supabase DBに購入記録を保存
  → ユーザーに成功画面を表示

ステップ1:Stripeアカウント設定

  1. stripe.com でアカウント作成
  2. ダッシュボードで本番利用の審査を申請(1〜2日で承認)
  3. 「商品」から販売する商品を作成
  4. APIキーを取得
# .env.local
STRIPE_SECRET_KEY=sk_test_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...

ステップ2:Checkout Session作成

APIルートの実装

// app/api/checkout/route.ts
import Stripe from 'stripe'

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

export async function POST(request: Request) {
  const { priceId, userId } = await request.json()

  const session = await stripe.checkout.sessions.create({
    mode: 'payment',
    payment_method_types: ['card'],
    line_items: [{ price: priceId, quantity: 1 }],
    success_url: `${process.env.NEXT_PUBLIC_APP_URL}/success?session_id={CHECKOUT_SESSION_ID}`,
    cancel_url: `${process.env.NEXT_PUBLIC_APP_URL}/`,
    metadata: { userId },
  })

  return Response.json({ url: session.url })
}

フロントエンドの購入ボタン

// components/BuyButton.tsx
'use client'

export function BuyButton({ priceId }: { priceId: string }) {
  const handleClick = async () => {
    const res = await fetch('/api/checkout', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ priceId }),
    })
    const { url } = await res.json()
    window.location.href = url
  }

  return <button onClick={handleClick}>購入する</button>
}

ステップ3:Webhookで購入を処理

決済完了後、Stripeからサーバーに通知が届きます。これを処理して購入記録を保存します。

// app/api/webhooks/stripe/route.ts
import Stripe from 'stripe'

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

export async function POST(request: Request) {
  const body = await request.text()
  const sig = request.headers.get('stripe-signature')!

  let event: Stripe.Event
  try {
    event = stripe.webhooks.constructEvent(
      body, sig, process.env.STRIPE_WEBHOOK_SECRET!
    )
  } catch {
    return new Response('Webhook Error', { status: 400 })
  }

  if (event.type === 'checkout.session.completed') {
    const session = event.data.object as Stripe.Checkout.Session

    // Supabaseに購入記録を保存
    // await supabase.from('purchases').insert({
    //   user_id: session.metadata?.userId,
    //   stripe_session_id: session.id,
    // })
  }

  return new Response('OK')
}

重要: Webhookのエンドポイントは必ず署名検証を行ってください。これを省略すると、偽のリクエストで不正な購入記録が作れてしまいます。

ステップ4:テストと本番切り替え

テスト用カード番号

カード番号結果
4242 4242 4242 4242成功
4000 0000 0000 0002拒否
4000 0000 0000 32203Dセキュア必要

本番切り替えチェックリスト

  • Stripeダッシュボードで本番モードに切り替え
  • .env のAPIキーを本番用に変更(sk_live_...
  • Webhookエンドポイントを本番URLに設定
  • テスト購入を1件実行して動作確認
  • 特定商取引法に基づく表記ページを用意

料金体系

項目コスト
初期費用¥0
月額固定費¥0
決済手数料3.6%(国内カード)

¥9,800の商品が1件売れた場合:手数料 ¥353、手取り ¥9,447

個人開発では固定費ゼロが重要です。Stripeは売れた分だけ手数料がかかる完全従量課金なので、売上がゼロでもコストがゼロです。

よくあるハマりポイント

Webhookがローカルで動かない

StripeのWebhookはインターネット経由でサーバーに届きます。ローカル開発では Stripe CLI を使います。

stripe listen --forward-to localhost:3000/api/webhooks/stripe

日本円の扱い

Stripeでは日本円は「最小通貨単位 = 1円」です。$1 = 100centsのようなゼロ付けは不要です。

// ¥9,800の商品
{ unit_amount: 9800, currency: 'jpy' }

まとめ

ステップ内容所要時間
アカウント設定Stripe登録・商品作成30分
Checkout実装APIルート + ボタン1時間
Webhook実装購入処理の自動化1時間
テスト・本番切替動作確認・表記準備30分

Stripeの決済実装は、恐れるほど難しくありません。まずはテストモードで試してみてください。

関連する有料記事

Next.js + Supabase + Stripe で有料コンテンツ販売を実装する完全ガイド

Stripe Checkout だけでなく、Magic Link認証・Webhook・MDXペイウォールまで、ブログに有料記事機能を組み込む全工程を実装コード付きで公開。この記事自体がその仕組みで動いています。


Next Step

次に読むならこの導線です

すべての記事を見る
有料で次へ進む¥1,000

【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード

Claude Codeラボ全12話の集大成。Skills/MCP/サブエージェント/Hooks/リモート運用を統合した「自走する Claude 自動化」を、月 ¥5K の実コストで動かす全構成を公開。寝てる間に競合調査・記事下書き・PR まで自動化する 6 層アーキテクチャの完成版。

次の実験記録も追う

Claude Code × 個人開発の実験ログ、失敗、判断変更をまとめて追いたい人向けに、月次でLab Freeを届けます。

masatoman のメルマガ — 毎週月曜の朝に 1 通

masatoman.net で今週公開した記事の中から 1 本を、読者目線で深掘りした手紙が届きます。「自分も同じことやってる」「ここで詰まってた」が見つかる予告編。

この記事が役に立ったらシェア