Open8

Stripe Checkoutを使ったサブスクリプションサービスを作る上でのメモ

Godai HoriGodai Hori

Stripe Checkout を利用したサブスクリプション

まずはCustomerを作成

const customer = await stripe.customers.create({
  email: user.email,
})

よしなに作った顧客をサービスのユーザー情報に紐付ける

await prisma.user.update({
  where: {
    id: user.id,
  },
  data: {
    stripeCustomerId: customer.id,
  }
})

Customer ID を紐付けてCheckoutフォームに遷移

以下のコードでStripeのサブスク画面に遷移
購入時に自動で、カスタマーとサブスク情報が紐づく
なんだかんだStripeのCheckoutフォームをそのまま利用するのが色々と楽だった

  const stripeSession = await stripe.checkout.sessions.create({
    mode: 'subscription',
    payment_method_types: ['card'],
    line_items: [
      {
        price: process.env.PRICE_ID,
        quantity: 1,
      },
    ],
    customer: newUser.stripeCustomerId,
    success_url: `${process.env.SITE_URL}/payment?status=success`,
    cancel_url: `${process.env.SITE_URL}/payment?status=failed`,
  });

  return res.redirect(303, stripeSession.url)

Godai HoriGodai Hori

支払い方法の変更

カスタマーポータルを使って支払い方法変更ページに遷移

  const session = await stripe.billingPortal.sessions.create({
    customer: '{{CUSTOMER_ID}}',
    return_url: 'https://example.com/account',
  });

  return res.redirect(303, stripeSession.url)
});
Godai HoriGodai Hori

サブスクの解約

以下のコードで次の請求日に自動でサブスクが解約される

const result = await stripe.subscriptions.update(subscription.id, {
  cancel_at_period_end: true,
})
Godai HoriGodai Hori

顧客のインボイス一覧取得

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, {
  apiVersion: "2022-08-01",
});
const invoices = await stripe.invoices.list({
  customer: user.stripeCustomerId,
})
Godai HoriGodai Hori

顧客のサブスクのステータス一覧を取得

  const subscription = await stripe.subscriptions.list({
    customer: user.stripeCustomerId,
  });
Godai HoriGodai Hori

Stripe注意点

testモードの時はサブスク購入時や更新時に自動でメールが送信されない
ただし管理画面からの送信は可能