Open8
Stripe Checkoutを使ったサブスクリプションサービスを作る上でのメモ
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)
支払い方法の変更
カスタマーポータルを使って支払い方法変更ページに遷移
const session = await stripe.billingPortal.sessions.create({
customer: '{{CUSTOMER_ID}}',
return_url: 'https://example.com/account',
});
return res.redirect(303, stripeSession.url)
});
サブスクの解約
以下のコードで次の請求日に自動でサブスクが解約される
const result = await stripe.subscriptions.update(subscription.id, {
cancel_at_period_end: true,
})
顧客のインボイス一覧取得
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, {
apiVersion: "2022-08-01",
});
const invoices = await stripe.invoices.list({
customer: user.stripeCustomerId,
})
顧客のサブスクのステータス一覧を取得
const subscription = await stripe.subscriptions.list({
customer: user.stripeCustomerId,
});
Stripe注意点
testモードの時はサブスク購入時や更新時に自動でメールが送信されない
ただし管理画面からの送信は可能
サブスクが解約された際のWebhook
Webhook周りのテスト