ISSUEでStripe connectで銀行振込を実装しました

1

2022年10月01日 8:41

こんにちはISSUEの寒河江です。
ISSUEにStripe connectを利用した銀行振込を実装しました。ただ、Stripeの銀行振込は2022年4月にリリースされたばかりということもあり、実装例がほとんどなく実装には苦労しました。ISSUEでの実装例を参考に詰まったところなど皆さんの参考になれば幸いです。

なぜ銀行振込を実装したか

ISSUEはエンジニアと企業とのマッチングプラットフォームです。また、単発のタスクだけではなく継続の依頼もあるので、エンジニアの報酬は数十万/月規模の決済になります。そのような状況から下記の問題が発生していました。

  • 既存の支払いにはクレジットカードを使っていたが、決済の上限に引っかかってしまう問題が多発してオペレーションコストがかかってしまう
  • 企業は業務委託エンジニアへの支払いは銀行振込で統一していたが、ISSUEでエンジニアと取引をするとクレカ決済により支払い方法増えて管理が大変になってしまう
  • 決済手数料も銀行振込はクレジットカードのよりも安い1.5%(クレカは3.6%)

以上をふまえて、銀行振込の実装に踏み切りました。

実装

前提

  • アカウントのタイプとしては企業(customer)、エンジニア(custom)となります
  • エンジニアが稼働分の報酬を企業に請求します
  • 支払い方法はStripe connectのデスティネーション支払いです

【プラットフォームの登場人物と役割】

支払い側のアカウントはバーチャル銀行口座が作成される

Stripeでは銀行振込用の口座としてcustomerごとに、バーチャル口座が作成されます。決済時はこのバーチャル口座に振込むとconnectアカウントに送金されます。

ISSUEの請求フロー

ISSUEでは請求下記のようなフローで作成しています。
①エンジニアが稼働分の請求する
②①が問題なければ承認する

エンジニアが企業に請求する

この処理ではStripe側にデータの作成はされません。プラットフォームによっては仮売り上げする場合もあるかとは思いますが、弊社では実売り上げのタイミングと時間が空くことも少なくないので実装しませんでした。

企業がエンジニアの請求を承認する

この時、Stripe側にpaymet_intentデータが作成されます。payment_intentや基本的なフィールドの内容は別の記事でも解説しているので省略しています。
img
重要なのは後半のpayment_method_typesからpayment_method_optionsまでのパラメータになります。このパラメータをpayment_intent作成時にセットすることで銀行振込決済の処理に切り替わります。

決済失敗

企業(支払い側)のStripeアカウントの残高に、支払いに対する残高が不足していた場合はレスポンスのpayment_intent.next_actionの中に 値が入ります。next_action中にはdisplay_bank_transfer_instructionsという振込先の口座情報がセットされます。この振込先口座情報を支払い失敗時にクライアントに表示したり、メール送信をして振込を促すようにしましょう。

img
不足残高はnextAction["display_bank_transfer_instructions"].amount_remainingにセットされています。

銀行残高を確認する

銀行振込を支払い方法に設定している際は、口座残高や振込先を常に把握できるようにしておくと安心です。
振込口座取得用のコードサンプルです。

振込先の取得

img
ISSUEでは下記のように表示しています。

口座残高の取得

customerに紐づいた現在の口座残高を取得するサンプルコードです。
img

簡単ですが、以上が銀行振込の実装方法の説明になります。
クレカ決済と違い、決済を行うたびに口座情報を見に行かなければならない、銀行振込の自動化があまり浸透していないのでクライアントにキャッチアップコストがかかるなどの問題があります。UX・UIの改善をしていき、快適な請求体験を提供できればと思います。

参考

銀行振込を受け付ける

# Stripe
# Node.js
1

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。

目次を見る