Stripeによる銀行振込フローの実装を解説

弊社ではウェブアプリのクレジットカード決済機能の実装にStripeを活用しています。一方でネットバンキングの利便性が高まっているため、銀行振込も根強い支払方法として選ばれています。Stripeでも銀行振込フローは実装可能ですが、いくつか注意すべき点があります。今後の実装の際の参考にしていただければと思います。
この記事では基本的な実装方法の理解とcurlコマンドで正しくAPI経由で値が取得できるところまでを確認します。

事前準備

Stripeのテストアカウントを作成し、IDとシークレットキーの情報を取得しておきましょう。
また実際にウェブアプリへの組み込みにあたっては別途認証の処理などがありますが、今回は割愛します。

ユーザーによる銀行振込の選択

ユーザーが新たに銀行振込のオプションを選択した際、Stripeからユーザーごとに一意の振込先口座番号(バーチャル口座)が払い出されます。Stripe APIを利用して口座番号を取得し、画面上に表示します。既にStripeユーザーとして登録済みであれば、この時点でのStripeへのユーザー登録は不要です。

振込処理

ユーザーが自身に割り当てられた振込先口座番号に対して支払を行うと、Stripe側でトランザクションが生成され、customer_cash_balance_transaction.created イベントがトリガーされます。
振り込み金額が商品価格を上回る場合、購入成功を示すJSONオブジェクトが返されます。それ以外の場合は、振込処理を示すJSONオブジェクトが返されます。typeの値が”funded”であれば振込は行われましたが、金額が商品価格を下回っていることを意味します。typeの値が”applied_to_payment”であれば、商品価格を上回る金額が振り込まれたことを示します。
以下に、日本円で1100円を振り込む場合のcurlコマンドと、それぞれのレスポンスを示します。

日本円で1100円を振り込む場合のcurlコマンド

curl https://api.stripe.com/v1/test_helpers/customers/cus_O03QsANmwch5Br/fund_cash_balance \
-X POST \
-u ""
-d "amount"="1100" \
-d "currency"="jpy"

振込金額がされた場合のレスポンス例(購入は成功していない):


{
"id": "ccsbtxn_1NE4k0FMXqr35gV6mks98Xq0",
"object": "customer_cash_balance_transaction",
"created": 1685599928,
"currency": "jpy",
"customer": "",
"ending_balance": 1050,
"funded": {
"bank_transfer": {
"jp_bank_transfer": {
"sender_bank": "",
"sender_branch": "",
"sender_name": "Test Sender"
},
"reference": "",
"type": "jp_bank_transfer"
}
},
"livemode": false,
"net_amount": 1050,
"type": "funded"
}

振り込みがされて購入が成功した(商品金額以上の振込があった)場合のレスポンス例:

{
"id": "ccsbtxn_1NE4TRFMXqr35gV6q8NIdb05",
"object": "customer_cash_balance_transaction",
"applied_to_payment": {
"payment_intent": "pi_3NE4NvFMXqr35gV61Vp1gLze"
},
"created": 1685598901,
"currency": "jpy",
"customer": "",
"ending_balance": 0,
"livemode": false,
"net_amount": -1150,
"type": "applied_to_payment"
}

この後の処理はウェブシステム側で行います。”funded”の場合、振り込みは完了したが購入は成功していない旨をメールで通知し、”applied_to_payment”の場合は商品やサービスの提供を許可します。なお振込は商品の購入時と関係なくいつでも可能なため、”funded”であったとしても”振込み金額が足りません”という判別はできない点に注意が必要です。

余剰金の扱い

商品価格以上の金額が振り込まれた場合(”applied_to_payment”のケース)、余剰金はStripe口座に保持されます。継続的な購入が見込まれる場合、この金額をプールしておくのも一つの方法です。一方、ポイントシステムを導入している場合などは、余剰金をポイントに変換するなどの仕組みも考えられます。

購入の優先順位

商品が2点以上購入対象になっている状態で振込を行った場合、購入の優先順位に注意が必要です。例えば、1200円の商品と1000円の商品が振込対象となっている状態で、1000円を振り込むと、購入対象となったタイミングは関係なく、1000円の商品が購入成功扱いとなります。この振込処理の優先順位は以下のように整理されます。

Stripeを使用する銀行振込みにはユーザー手数料が若干高いというデメリットがあります。しかし、1日数百件以上の銀行振込が行われるような規模の場合、入金確認を目視で行うのは非現実的です。そのような状況ではStripeを用いた銀行振込の自動化が非常に有効な手段となるでしょう。

本ブログ記事を参考に、Stripeの銀行振込フローを上手く活用していただければ幸いです。

スタッフ積極採用中

ジェイオンラインではスタッフを随時募集しております。
採用情報ページよりお気軽にお問い合わせください。

この記事を書いた人

ジョン
ジョン