🎫

月額会員サービスをLINEとStripeで作る際のアーキテクチャ

2022/05/19に公開
1

今回は以前、LINE Developer Community の LT 会で発表した以下の動画を記事にします。

https://www.youtube.com/watch?v=6lZbW23p_rs&t=110s

序章

2021 年 11 月にリリースした「すごい文字起こしばりぐっどくん」という画像、音声、動画を LINE トーク画面に送ると文字起こししてテキストで返す LINE アプリ、のアーキテクチャをもとに LINE× 月額会員サービスを紹介します。

https://prtimes.jp/main/html/rd/p/000000016.000036415.html
https://varygoodkun.net/app/line-sugoi-mojiokoshi/

仕様

顧客属性

LINE 公式アカウント内で顧客は 2 種類あります。

  • 非会員:文字起こし不可
  • 月額会員:画像、音声、動画の文字起こしが可能

リッチメニュー

顧客の属性に合わせてリッチメニューを用意してます。

Bot と LIFF の使い分け

  1. LINE Bot で友だち登録処理を行う(webhook の follow イベント内で DB に顧客情報を登録)
  2. LIFF で月額契約処理を行う(LIFF から URL に遷移させる)
  3. Stripe Webhook でリッチメニューを切り替える(事前に登録した 2 種類目のリッチメニューに切り替える)

契約設計の注意点

月額契約処理を LIFF で行う理由は、トーク履歴内の過去の契約ボタンを押すユーザーが多く、「契約できません」という問い合わせが多発したからです。

Bot 側で月額契約処理を実装すると、LINE トーク上に契約 URL が残ってしまい、過去に発行したボタンにアクセスされてしまいます。

Stripe API

Stripe Subscription(月額課金)

  1. Bot の follow event で DB に登録
  2. 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であるかどうかで判断します。

trialingcanceledの 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の組み合わせでアプリを作る際の手助けになれば幸いです ❗

GitHubで編集を提案
YOSHINANI

Discussion

joshnnjoshnn

ポスト興味深く読ませていただきました。ありがとうございます。
2023年4月に試しているのですが次のような記載があってLINE Messaging APIチャネルからLIFFアプリを呼び出せるのかで悩んでいます。
https://developers.line.biz/ja/news/2019/11/11/liff-cannot-be-used-with-messaging-api-channels/

Messaging APIチャネルにLIFFアプリを追加しないでください
現時点では、Messaging APIチャネルにLIFFアプリを追加することもできますが、追加しないでください。Messaging APIチャネルに追加したLIFFアプリには、以下の制限があります。
....
<<<