見出し画像

connectを利用して決済機能をリリースした話

こんにちは、Jicooという会社でCTOをしている小林です。
本ブログは2021年 Stripe Advent Calendar 2021 の12/21分のエントリーです。

Jicooとは

https://www.jicoo.com/

日程調整の自動化からオンラインサービス・決済まで オンライン予約プラットフォームです。Jicooでアカウントを作成すると、日程調整を受け付ける予約ページを作成できます。基本機能は無料で利用できますが、有料プランを利用する事で自社や個人のブランディング設定を有効化でき、自社サイトの予約ページのように顧客に見せる事が可能になります。

ブランディングが可能

予約時にカードで事前決済できる機能をリリースしました!

Jicooは12月13日に決済機能をリリースしました。その中でクレジットカードで事前決済が利用できるのですが、今回Stripeを利用して実現する事ができました。

予約ページの作成者(ホスト)はサービス(スキル・チケットなど)を作成して予約ページに紐づける事ができ、予約者(ゲスト)はstripeを利用してカード決済を行う事ができます。

本記事ではStripe connectを利用する事で決済機能を新規開発するための勘所をまとめます。

カード決済機能を作るために検討が必要な事

まず最初になにがあれば決済機能が作れるのか考えます。基本的にStripeがほぼ全て用意してくれているので何を採用して組み合わせていくのがベストかを考えていく作業になります。
その中でも特に事前設計で重要な3点について紹介します。

  • Stripeのどの機能を使って決済する?

  • 商品の管理方法はどうする?

  • チェックアウト画面の実装方法はどうする?

Stripeのどの機能を使って決済する?

Stripe Connectを導入する

Jicooのユーザーである予約を受け付ける予約ページ作成者はホスト、予約者はゲストと呼びます。今回のケースではホスト毎に銀行口座を設定してもらい、決済後の収益の入金をできるようにする必要があるためStripe Connectを利用してJicooは親アカウントとしてホスト毎に連結アカウント(子アカウント)を作成して代理で決済できる設計を導入する事としました。

カード支払い方式の検討
connectのカード支払い方法としてStripeにはダイレクトデスティネーション支払いと送金別方式の3つがあります。サービスを購入するゲストはホストによってブランディングされた予約ページでホストと直接取引し、プラットフォーム(Jicoo)の存在に気づきにくい場合はStandardアカウントが推奨されるというガイドラインに沿って今回はダイレクト支払いを選択しました。

ダイレクト支払いの特徴としては、決済されたお金は親アカウント(Jicoo)の残高ではなく連結アカウント(ホスト)の残高に直接反映されます。

出典: https://stripe.com/docs/connect/direct-charges

事業者審査のための情報入力
以前所属していた会社でStripe ConnectをCustomアカウントで実装した経験があるのですが、その時大変だった機能の一つとして、連結アカウントの審査のためにユーザーの会社情報や責任者の入力がありました。住所や本人確認書類などの入力フォームをすべて自前で作成してstripe Account APIを叩いて情報を登録する工数はかなり大きかったのですが、現在はAccount Link APIという機能がありこれらの情報入力フォームを全てStripe側が用意してくれるというとても優れた機能です。
今回はこちらを利用する事で開発工数を大幅に削減する事ができました。

商品の管理方法はどうする?

Standardアカウントの場合、サービス(商品)をどこに定義するか

商品となるサービスをどこに定義するかですが、Stripeには商品(Product)というAPIがあり、こちらに商品を登録する事が可能です。Stripe Checkoutや領収書などとの連携の高さから本来こちらに商品を定義して独自のDBにはstripe商品のIDを保持するべきだと思うのですが、Standardアカウントはホストにフル機能のstripeアカウントを提供できるため商品の削除も可能になってしまいます。そのため今回はStripeの商品機能は使わずに独自のDBに商品を定義するようにしました。

チェックアウト画面の実装方法はどうする?

Stripeでカード情報を受け付ける方法としていくつかのパターンがあります。
要件としては3Dセキュアなどのセキュリティ機能とホストのブランディングを支払い画面にも導入する必要があるというところがございました。

Stripeの用意している機能を使った標準的な組み込みを採用

Stripe CheckoutかElementsを使いwebhookを使って非同期的に支払いを受け付ける方法です。リアルタイムでの在庫の引き当てができるのか心配だったのですがcheckout.session.completedイベントを使う事で可能になっています。具体的にはsession終了後に自社サイトの購入完了画面にリダイレクトするのですが、webhookのレスポンスが返ってくるか10秒経つまでリダイレクト処理を待ってくれるので、その間に在庫の引き当て処理を行う事が可能です。

サーバ側で支払いを確定するシナリオもあり、こちらを使うとサーバ側で在庫の引き当てができるので簡単なのですが、3Dセキュアのフロントエンドの組み込みコストがかなり大きそうなのと将来的なサポートを受けにくいという事なので今回は採用しませんでした。

まとめ

今回はStripeのプラットフォームに乗る事で短期間でセキュアな決済システムを構築する事ができました。久しぶりにStripeを使った感想としてはAPI・webhook機能の豊富さ・日本語ドキュメントの充実度・日本語カスタマーサポートのレベルの質・レスポンスの速さが3拍子そろっており、昔よりもDXが上がっており本当に素晴らしいなと改めて思いました。

Stripeカスタマーサポートの皆様のおかげでリリースできたと言っても過言ではないです。本当にありがとうございました。


この記事が参加している募集

#つくってみた

19,492件

よろしければサポートお願いします!