月額会員サービスを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アプリには、以下の制限があります。
....
<<<