MOSHにおける決済とStripeとの関係
こんにちはこんばんはおはようございます。
MOSHでエンジニアやってる@massyuuと申します。
今日も唐揚げ食べてますか?
2025年になりまして、今月からMOSHのメンバーも積極的に発信していこうぜ!ということで今回は僕が筆を取らせていただきます。
何の話をしようかなと考えていたのですが、僕が所属するサンポウというチームはMOSHの決済機能を中心に見ているので、せっかくなら決済に関する話をお届けしようと思います。
MOSHの機能群
そもそもMOSHってどんな機能があるの?という方もいらっしゃると思うので、ざっくりとどんな機能があるかをまとめると以下のようになります。
- 顧客管理
- メール配信
- スケジュール管理
- サービスページ作成
- 決済
- サブスクリプション管理
- コンテンツ配信
- 動画配信
パッと思いつくだけでこれだけのものがあるのですが、その中でも決済はとても重要な機能となっています。
Stripe
MOSHでは決済プロバイダのひとつにStripeを利用しています。
Stripeをしっかりと触り始めたのはMOSHに入ってからなのですが、使えば使うほどとてもリッチで多種多様な機能があるなと日々驚くことも多いです。
今日は、MOSHがStripeをどんなシーンでどのように使っているかを見ていきましょう。
アカウントについて
MOSHでは、サービスを提供する方をクリエイターと呼び、そのサービスを受講(または購入)する方をゲストと呼んでいます。
クリエイターが提供するサービスにおける決済全般を担っており、かつクリエイターがスムーズにサービス提供まで行えるようにStripeアカウント関連の手続きを行うため、MOSHはCustomアカウントを利用してのサービス提供を行っています。
シンプルなECサイトなどではStandardアカウントを利用する方が、必要以上に組み込み実装を行う必要もなくスムーズかと思いますが、プラットフォームとしての細かな調整や痒いところに手が届く仕組みを作ったりする場合に、Customアカウントの方が実現しやすいと思います。
もちろん、組み込み実装の実装量は増えますが、クリエイターやゲストにとってより使いやすいサービスを提供するためにも、この選択が良いと個人的には思っています。
決済する
MOSHでは主にPayment Intents APIを利用した決済を提供しています。
このAPIはとてもシンプルに決済を実行することができ、かつMOSHで求められている決済方法をカバーすることができるため、ゲストが決済を行う場合の大半をPayment Intents APIで行っています。
クレジットカード払いの場合、ゲストがStripe上に登録しているカードに対してPayment Intents APIを利用して規定の金額を請求します。
一例としては以下のような形で実装していて、これだけのコードでゲストの決済を実行できます。
# pythonにて実装しています
payment_intent = stripe.PaymentIntent.create(
amount=amount,
currency=currency,
customer=customer_id,
**settings,
)
※settings
にはいくつかの必要な設定(直近では3Dセキュア2.0に関するもの)を含めています。
また、Stripe上に仮想口座を展開して銀行振込での決済を行うこともできます。
この場合もPayment Intents APIを利用していて、上記のコードがそのまま使えます。
ただし、決済手段の指定など、いくつかの設定をsettings
に含める形での実装をしています。
3Dセキュア2.0に備える
2025年3月末から、3Dセキュア2.0(EMV3-Dセキュア)が義務化されます。
もちろんMOSHでも、その動きに合わせた対応を進めています。Setup Intents APIを利用して3Dセキュア認証を実現することができるので、このAPIを利用した認証機構を実現しています。
Setup Intents APIを利用して、カード情報を登録する際に認証を行うことで、継続的な支払いなどのオフセッションにおける認証をクリアすることができるので、不正利用を防ぎつつ、月々の決済を安定的に行うことができます。
サブスクリプションを契約する
MOSHが展開するサービス種別のひとつに「サブスクリプションサービス」があります。
例えば、月4回のオンラインヨガレッスンを受講するゲストにとって、その都度決済を行うことは結構面倒ですし、決済を忘れてしまってサービスを受けれないなどのトラブルもありえます。
またクリエイターにとっても、その月の決済が行われているので安心してサービスを提供することができますし、課金回数を指定した自動更新のサブスクリプションを設定することもできるので、スクールや講座などでも利用いただくことができます。
MOSHでは、Billing APIを利用してサブスクリプションを実現しています。
通常のサブスクリプション(終了予定日がなく、指定された間隔で課金が発生するもの)はもちろん、サブスクリプションスケジュールを利用して、指定された回数だけ課金を行ったら自動的に解約されるサブスクリプションも提供しています。
例えば「6ヶ月間で胃袋を鷲掴みにする料理教室」のように、提供期間が決まっているサービスなどを展開する場合でも、このサブスクリプションの機能を使って実現することができます。
サブスクリプションを生成する実装もシンプルで
subscription = stripe.Subscription.create(
customer=customer_id,
billing="charge_automatically",
items=[{"plan": plan_id}],
coupon=coupon_id,
default_payment_method=source_id,
on_behalf_of=account_id,
currency=currency,
expand=["latest_invoice.payment_intent"],
)
の記述だけで済みますし、サブスクリプションスケジュールの場合であっても
subscription_schedule = stripe.SubscriptionSchedule.create(
start_date="now",
end_behavior="cancel",
customer=customer_id,
phases=phases,
default_settings=default_settings,
)
で実現しています。
※phases
にスケジュールの設定を持たせています。
クリエイターへの送金を行う
MOSHはStripe上では「プラットフォームアカウント」という立ち位置になっているので、ゲストが実施した決済は一度MOSHの残高へ反映されます。
そこから、クリエイターがゲストに向けてサービスを提供したのちに、クリエイターのアカウントへ売上を送金する形をとっています。
こうしてクリエイターとゲストの間にMOSHが入ることで、サービス提供や金銭のやりとりにおけるトラブルを未然に防いでいる形になっています。
クリエイターのアカウントへの送金は、支払いと送金別方式を作成することによって実現しています。
こうすることで、ゲストが決済した金額を元に算出した規定の売上をクリエイターに滞りなく送金することができます。
他にも
返金や不正利用防止など、Stripeを利用して実現している機能はまだまだありますが、それはまた別の機会に。。
終わりに
今回はMOSHにおけるStripe利用の事例を少しだけ紹介させていただきました。
まだまだ決済の世界は果てしなく広いですが、この記事を見て少しでもMOSHに興味を持ってもらえるととても嬉しいです。
Discussion