🎫

月額会員サービスを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で編集を提案

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アプリには、以下の制限があります。
....
<<<