Stripe APIを使って簡単に決済をやってみた(Node.js Express)
背景
Stripe使えるようになってみたい
決済系の勉強のため実装してみたい
Stripeとは
決済システムです。結構使われているらしい。決済手数料3.6%は普通ぐらい。
APIの開発とか結構行われてるから開発者は嬉しい
ドキュメントも豊富。ありがたい
https://stripe.com/jp
他の決済会社は?
- SBペイメントサービス https://www.sbpayment.jp/
- 日本企業向け 大企業向け コンビニ決済あり
- PayPal https://www.paypal.com/jp/home
- シンプルなんでStripeと似てる→どっちがいいかな?? 手数料(2.90%+40円)
- GMOペイメントゲートウェイ https://www.gmo-pg.com/
- 手数料(3.95%)・初期費用・月額どれもちょっとお高め→堅牢なセキュリティーなのか 大企業にはいいのかも、コンビニ決済あり
- PayPay https://paypay.ne.jp/
- 最近日本で覇権をとりつつある→持ってる人には便利だけど持ってない人は本当に使ってないので、あくまで+αかな
- 楽天ペイ
- 手数料が高い(4.00~8.00) 加盟店的には美味しくない 個人的には、PayPayと戦争してどちらかに統一してほしい
- Square https://squareup.com/jp/ja
- 手数料が変動する(3.25~3.95%) 端末方面でのセグメントで強そう 店舗に置くやつは最近AirPayとかもある
どの決済会社にするかは、お金だけじゃないとするとセキュリティ+ユーザーの要望とか、、、、
導入の際に今何を使っててどういう問題があって、価格帯はこのぐらいで、、みたいな議論も勿論必要ですね。
実装
-
Stripeにサインアップします。
-
適当に商品を作成します。
-
今回は2000円の商品を作りました。
-
-
適当なディレクトリを作成
-
npm i express stripe
を実行します -
server.jsを作成
server.js//テスト環境なので、Stripeのidを見せているが、本番では隠しましょう const stripe = require('stripe')('sk_test_51Lv96DDEKXzP1FvZEqMO1337mbw7GbIfGX6mtJsgIOSWufWjKO6lAqaAlqb0CkB4baSaFSZ4uUSbqR1YlSzU2fbS00KieKVF9T'); const express = require('express'); const app = express(); app.use(express.static('public')); const YOUR_DOMAIN = 'http://localhost:3000'; app.post('/create-checkout-session', async (req, res) => { const session = await stripe.checkout.sessions.create({ line_items: [ { price: 'price_1LvBezDEKXzP1FvZPHtQrzdC', quantity: 1, }, ], mode: 'payment', success_url: `${YOUR_DOMAIN}/success`, cancel_url: `${YOUR_DOMAIN}/cancel`, }); res.redirect(303, session.url) }) app.get('/success', (req,res) => { res.send('成功!!!') }) app.get('/cancel', (req,res) => { res.send('失敗!!') }) app.listen(3000, () => {console.log('Running on port 3000')});
-
public/index.htmlを作成
index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="/create-checkout-session" method="post"> <p>2000円の商品です</p> <button type="submit">Checkout</button> </form> </body> </html>
-
node server.js
でサーバーを立ち上げて確認する
解説&確認
-
サーバーを立ち上げるとindex.htmlが表示される
-
Checkoutボタンを押すとserver.jsが立ち上げたサーバーにpostリクエストを飛ばす。
serverはpostリクエストが飛んでくると、sessionを作成して、決済画面にリダイレクトするserver.jsapp.post('/create-checkout-session', async (req, res) => { const session = await stripe.checkout.sessions.create({ line_items: [ { price: 'price_1LvBezDEKXzP1FvZPHtQrzdC', quantity: 1, }, ], mode: 'payment', success_url: `${YOUR_DOMAIN}/success`, cancel_url: `${YOUR_DOMAIN}/cancel`, }); res.redirect(303, session.url) })
-
決済が完了するor決済せずに戻るで分岐して処理を書いている
server.jsapp.get('/success', (req,res) => { res.send('成功!!!') }) app.get('/cancel', (req,res) => { res.send('失敗!!') })
-
決済成功パターン
-
決済せずに戻ってくるパターン
結論
決済完了するだけならセッション作成してStripeが指定した場所に飛ばすだけで決済できましたね。
ちゃんとECサイトとして使おうと思うとなかなか考えることが多そうです。
・カートに入れた商品を合計する
・その商品全ての決済や税金、送料なども入れたい
・クレジットカードを登録したい
と要件によって複雑になります。
お客さんの情報や注文情報などをStripeじゃなくて別の場所で管理しようとするとそれも大変そうです。一筋縄ではいかないようです。とほほ
決済の流れが勉強できたので、よかったです。
Discussion