Stripe ConnectにC2Cの課金処理を丸投げしたサービスを作る
個人的には数年前からStripeには目をつけていたんですが、その時は単なるオンライン決済サービスの一つという認識でした
しかしStripeはここ数年でぐんぐんとサービスの質を高めてきています
Stripeは単純な単発課金だけでなく定期課金サービス(サブスクリプション)など、色々な決済サービスを提供していますが、近年でとりわけすごいサービスなのがStripe Connectです
このStripe Connectを使って試しに1つウェブサービスを作ってみたので、その感想なども含めてレポートします
Stripe Connectとは?
B2Cのような事業者と消費者ユーザ間のやり取りだけでなく、コネクトを使うとC2C間のお金のやり取りを丸ごと委託することができます
C2Cと言ってもイメージがわかないと思うので、ここではメルカリのようなフリマサービスを例に説明します
メルカリでは品物を売ったユーザは購入するユーザからお金をもらいますが、その間にメルカリがいてサービス利用料として手数料を徴収します
このようなサービスを作ろうとすると、サービス運営者はまずは一旦、売れた品物の代金を購入するユーザから受け取る必要があります
その後、手数料を差し引いたのちに売却したユーザへ支払います
言葉で説明すると簡単なのですが、いざこういうサービスを実装しようとすると色々な法律的障害(資金決済法)があったりで、なんやかんやと実装コストが高いです
また、しっかりとしたサービスにしようと思うと、送金前の本人確認機能も必要になります
Stripe Connectはそういった決済に必要な機能を全部乗せしたマシマシサービスなのです
そんなStripe Connectですが、サービスに応じて主に3つ(Standard、Express、Custom)のプランが選べます
スタンダード(Standard)
「一番制約が厳しいけど、一番簡単で安く使えるプラン」
本人確認処理やダッシュボード画面など、ほとんどのシステムがStripe側から供給されます
なので、わざわざ本人確認画面などを実装する必要がありません
ただし、ユーザは支払い処理をするたびにStripeのウェブサイトへ移動することになるので、決済の処理がStripeであることをユーザに対して意識させてしまいます
また、スタンダードは割と単純なシステムには対応してますが、メルカリみたいなお金をある程度プールしてから任意のタイミングで送金を実行する、といった自由度の高い処理には対応できません
カスタム(Custom)
「もっとも実装コストがかかるけど、一番自由度の高いプラン」
スタンダードとは全く反対で、一番実装が面倒だけど一番自由なプランです
ダッシュボードや本人確認などの各処理はAPIを通じてStripeとやり取りするので、画面は好きに作れますからユーザにStripeを意識させません
会社組織で複数人開発するならいいと思いますが、個人開発者にはなかなか難易度が高いプランです
エクスプレス(Express)
「スタンダードとカスタムのまさに中間をとったプラン」
基本的な自由度はカスタムに準拠しますが、本人確認やダッシュボード画面などはStripeが用意したものを使えます
料金プランはカスタムと同じになりますが、いちいちダッシュボード画面などを作る必要がないので個人開発者でも難易度は低いと言えそうです
少し前まではアメリカしか使えないプランでしたが、最近日本でも使えるようになりました
(ちなみに今回、僕が選択したのもこのエクスプレスです)
Stripe Connectを利用せず自前でやる場合の問題点
もしもStripe Connectを利用せずに個人開発者やベンチャーが自前でこういった機能を実装する場合、色々なハードル(問題点)があります
1.銀行口座へ振り込まれるのを待つ
まずは購入したユーザからサービスへの銀行口座へ代金が振り込まれるのを待ちます
法人企業は良いのですが、個人開発者の場合、個人宛の銀行口座へ振り込んでもらうことになるので開発側の個人情報がモロバレになってしまうリスクがあります
2.振り込まれたお金を一定期間プールする
振り込まれるたびにお金を直接購入するユーザへ振込んでいたのでは銀行から振り込む手数料が高くついてしまうので、メルカリのように一定期間お金をプールしておきます
他人のお金を預かる場合、一定期間・一定量を超えると資金決済法に引っかかるので供託金を積む義務が発生します。1000万円以上というそれなりの金額なので、小規模サービスではあまり関係ないように思えますが、サービスのスケールアップを考えると足かせになる部分です
3.売却したユーザへお金を送金する
代金を送金をするタイミングはサービスによって異なりますが、メルカリではユーザが振込申請をしたタイミングでサービス側は送金処理をする必要があります
売却ユーザの残高を確認して、サービス側の手数料を差し引いた金額を売却ユーザが指定する銀行口座へ振り込むという処理が必要になります
マネーロンダリング防止の観点から、振込先の本人確認をすることが望ましいわけですが、個人開発者にとって本人確認は非常にコストの高い部分です。本人確認をアウトソーシングできる委託サービスも存在しますが、利用料はそれなりに高いです。またこのタイミングでも個人開発者は個人口座から送金することになるので、開発者の名前がバレてしまいます
以上のことを考えると、自前で全ての処理を作り上げるのはコスト的には法律的にもかなりハードルが高いものとなります
非常にニッチな個人ユーザがたまに利用する程度のサービスなら良いのですが、それなりにスケール感を持ったサービスを開発しようと考えると一番のネックになる部分です
Stripe Connectを使う場合
1.銀行口座へ振り込まれるのを待つ
正確にいうと銀行口座じゃなくてStripe側のアカウントへ支払われることになります
つまり個人開発者の場合、自分の銀行口座を教える必要がありません
2.振り込まれたお金を一定期間プールする
支払われたお金はStripe側にプールされます
この辺は結構ブラックボックス的部分を含むのですが、Stripe側は一応90日以内に出金するように推奨しているようです
しかし、それを超えるとどうなるのかははっきりと書かれていません
この辺は供託金の話と絡むので、わざとはっきりとは明示していないものと思われます
とにかく、サービス開発者側はお金をプールする必要がないので非常に気が楽になります
他人様のお金を預かるって、精神的ハードルも結構高いですからね
3.売却したユーザへお金を送金する
Stripeへ出金指示をすればStripe側のアカウント口座から売却したユーザ側へ送金が行われます
また、この時にサービスの手数料を差し引きます
Stripe Connectではお金を受け取るユーザは本人確認が求められます
この本人確認処理も、APIとStripe提供の画面で行うことができるので、サービス提供側が本人確認のシステム構築やオペレーションを行う必要がありません
要するに、C2Cのウェブサービスをする上で必要な決済関連を全部やってくれるんです
Stripe Connectの手数料
スタンダード
プラットフォーム手数料は無料ですが、決済手数料は別途発生します
エクスプレスとカスタム
エクスプレスとカスタムは手数料が同じです
$2/月・・・有効なアカウント 1 件に対して (月額)
よくわからない表現ですが、どうやら振込を実行するたびに差し引かれる手数料の様です
なので、送金をしてないのに勝手に毎月差し引かれるとかいうことではないとのこと(サポートに確認しました)
0.25%・・・入金金額に対して
送金する金額に対してかかる手数料です。もしユーザへ送金する金額が1万円だったら25円の手数料ということになります
$0.25/月・・・入金 1 件につき
ユーザへ送金するたびに発生する手数料です
決済手数料は別途発生
なお、上記の手数料はConnectを利用する場合のプラットフォーム手数料なので、Stripeで代金を支払う際(メルカリで言うところの購入代金の振込み部分)の手数料は別途発生します
ちなみに僕が8月ごろ見た限りでは200円と表記されていましたが、今見たら$2に変わっていました。
Stripeの決済手数料も変わっていたので、手数料はそれなりに更新されている様です
Connectの手数料は安い?
この料金表を見てどう感じたでしょうか?
正直僕は安いと思いました
安すぎて不安になるくらいに。
例えば本人確認処理って、それだけでもアウトソーシングするとかなり高い手数料を取られます
また、他人様のお金を一定期間プールする法律的観点や口座情報の開示への抵抗などを考えれば、むしろStripe Connectを利用しない選択はないくらいに思えます
Stripe Connectの欠点
そんな神の様な存在のStripe Connectですが、欠点もあります
それは実装コストです
「Stripeはドキュメントが整っていて実装するコストが低い・楽」
などというコメントをたまに見かけますが、あれは単発決済機能の場合です
確かに単発、つまりB2Cの様に1回だけ消費者から事業者へオンライン決済をするといったケースでは、Stripeは非常に簡単にシステムを実装することができます
しかしConnectは違います
まずドキュメントが英語な上に、翻訳してもよくわからないことが多いです
さらに同じような機能を持つメソッドが多く、どれを使ったら良いのかも案内されていません
サービスの成長速度にドキュメントが追いついていない印象です
まるでグーグルのドキュメントを見ているかのようです
(グーグルのドキュメントは英語圏の人間でさえ理解できないらしく、検索するとドキュメントの意味を問う質問がよく見つかりますがアレに近いです)
例えば、支払いの時に使用するメソッドはChargeとPaymentIntentという2種類の方法が用意されていますが、
それぞれの特徴やどちらを使った方が良いか、
みたいなことが書かれていません
こんな感じで、「やり方が何種類かあるけど、どれでやるのがベストなんだろう」
と迷うことがよくありました
サポートの人は親切なので、聞けば教えてくれるのですが、いちいちメールで問い合わせるのは正直面倒です
サポートサイドも同じ質問に何度も答えなければいけないだろうし、ドキュメントを充実させて欲しいと思うところです
スタンダードプランであれば、それほど実装コストは高くないのですが、上の例のようなメルカリみたいなシステムを作ろうと思うと最低でもエクスプレス以上が必要になります
このように、Stripe ConnectでそれなりのC2Cサービスを作ろうと思うと、実は実装コストは結構高いです
「Stripe?、ああ、前に単発決済サービスで利用したことがあるから楽勝っしょ?」
などと舐めてかかると挫折します
僕はドキュメントを見ながらテストモードでAPIを実際に叩いて、一つ一つの動作を確認していきました
こうすることで体感的にConnectの使い方がわかりましたが、効率的なやり方とは言えません
というわけで、次回からStripe Connectの使い方を紹介していきます
なお、実装に使用してる言語はPHPになります
————- ここから先は有料記事となります ————–
Stripe Connectで課金処理を実装する方法
Part1はConnectのオーソリ機能を利用した支払い処理の実装方法についてを解説しています
ディスカッション
コメント一覧
まだ、コメントがありません
新たにPostされたDocs
: ツール関連
キーボードを銀軸から赤軸に買い替えた話
約3年半前、仕事で使うキーボードとしてARCHISS ProgresTouchの ...: スマホ
楽天モバイルがおすすめできない人の特徴とは?
楽天モバイルの最強プランをおすすめできない人の特徴を簡単にまとめてみました また ...: システム開発
なぜスクラムがつらいのか?開発現場が疲弊するのか?スクラムに対する違和感と共に原因を考えてみた
今ではどこの開発現場に行っても、やれスクラムスクラムと、まるでスクラムでもやって ...: Laravel
1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLara ...: Laravel
Laravelで複数画像アップロード時のvalidateを指定【Laravel10】
jQuery - Image Uploaderを使って、フォームから複数の画像を ...HashMap
created_by
はやぴ
Web/アプリ開発エンジニア
Sierにてお堅いB向けのソフトウェア開発を経て、現在はC向けのWebやアプリを中心に開発しています。
Utilities