月額会員サービスをLINEとStripeで作る際のアーキテクチャ
今回は以前、LINE Developer CommunityのLT会で発表した以下の動画を記事にします。
序章
2021年11月にリリースした「すごい文字起こしばりぐっどくん」という画像、音声、動画をLINEトーク画面に送ると文字起こししてテキストで返すLINEアプリ、のアーキテクチャをもとにLINE×月額会員サービスを紹介します。
仕様
顧客属性
LINE公式アカウント内で顧客は2種類あります。
- 非会員:文字起こし不可
- 月額会員:画像、音声、動画の文字起こしが可能
リッチメニュー
顧客の属性に合わせてリッチメニューを用意してます。
BotとLIFFの使い分け
- LINE Botで友だち登録処理を行う(webhookのfollowイベント内でDBに顧客情報を登録)
- LIFFで月額契約処理を行う(LIFFからURLに遷移させる)
- Stripe Webhookでリッチメニューを切り替える(事前に登録した2種類目のリッチメニューに切り替える)
契約設計の注意点
月額契約処理をLIFFで行う理由は、トーク履歴内の過去の契約ボタンを押すユーザーが多く、「契約できません」という問い合わせが多発したからです。
Bot側で月額契約処理を実装すると、LINEトーク上に契約URLが残ってしまい、過去に発行したボタンにアクセスされてしまいます。
Stripe API
Stripe Subscription(月額課金)
- Botのfollow eventでDBに登録
- LIFFからSubscription Checkoutに遷移
const { url } = await stripe.checkout.sessions
.create({
customer: stripeCustomerId,
line_items: [
{
price: STRIPE_PRICE_ID_IMAGE
},
{
price: STRIPE_PRICE_ID_AUDIO
},
{
price: STRIPE_PRICE_ID_VIDEO
}
],
mode: 'subscription',
payment_method_types: ['card'],
success_url: LINE_FRIEND_LINK,
cancel_url: LINE_FRIEND_LINK
})
Middlewareでアクセス制御を行います。
今回だと、active
であるかどうかで判断します。
trialing
とcanceled
の2つのタイプはサービス仕様に応じて使うことがあります。
Stripe Webhook(リッチメニューの切り替え)
リッチメニューを切り替えるタイミングは以下の2箇所です。
-
customer.subscription.created
月額会員登録時に実行される -
customer.subscription.deleted
退会時実行される
各々で、以下のコードで顧客ごとのリッチメニューを切り替える。
await lineClient.linkRichMenuToUser(userUid, LINE_RICHMENU_ID)
他によく使うトリガー
customer.subscription.trial_will_end
customer.subscription.pending_update_expired
今回は無料トライアルを利用しておらず上記のトリガーを使う機会がありませんが、多くのサービスでは無料トライアル期間を設けることが多いため、覚えておくとよいでしょう。
Stripeの管理者画面でSample Codeが用意されてるので、慣れてない方はそちらを参考にしてください。
Stripe Billing Portal(契約情報の確認または変更)
サブスクの契約状況や決済方法のページを自前で実装するのは労力がかかります。
Stripe Billing Portal
を活用すれば、以下のコードを実行しするだけで、顧客ごとの契約確認または変更URLが発行可能です。
const { url } = await stripe.billingPortal.sessions.create({
customer: stripeCustomerId,
return_url: LINE_FRIEND_LINK
})
Billing Portal
サイト内でできること。
- サブスク契約の確認と変更、キャンセル
- クレジットカードの登録、変更
- 請求先住所または配送先住所の登録、変更
- 過去に決済した請求書と領収書の発行
Billing Portal
を活用することでサービス開発に注力できるので大変便利な機能です。
Stripe Usage Record(重量課金利用時に活用するAPI)
本記事で紹介している「すごい文字起こしばりぐっどくん」では、定額課金ではなく、文字起こしした分請求する従量課金を採用しております。
そのため、従量課金分を集計するためのStripe Usage Record
というAPIを活用しております。
await stripe.subscriptionItems.createUsageRecord(subscription.id, {
quantity,
timestamp,
action: 'set' | 'increment'
})
集計には2パターンあります。
- 上書き
set
- 追加
increment
上記のコード内でaction
オプションで指定します。
「ばりぐっどくん」では、set
を採用し、契約期間の1ヶ月分の利用料を毎日一気に集計してます。
まとめ
- BotとLIFFを使い分けることでユーザー体験を向上させることができる
- 決済関係はStripeにすべて任せることで、サービス開発に注力できる
- LINE + 外部サービスの組み合わせにより、ビジネスの幅が大きく広がる
この記事がLINE+Stripe
の組み合わせでアプリを作る際の手助けになれば幸いです❗
Discussion
ポスト興味深く読ませていただきました。ありがとうございます。
2023年4月に試しているのですが次のような記載があってLINE Messaging APIチャネルからLIFFアプリを呼び出せるのかで悩んでいます。
Messaging APIチャネルにLIFFアプリを追加しないでください
現時点では、Messaging APIチャネルにLIFFアプリを追加することもできますが、追加しないでください。Messaging APIチャネルに追加したLIFFアプリには、以下の制限があります。
....
<<<