💪

Stripe APIを使って簡単に決済をやってみた(Node.js Express)

2022/11/02に公開

背景

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とかもある

どの決済会社にするかは、お金だけじゃないとするとセキュリティ+ユーザーの要望とか、、、、
導入の際に今何を使っててどういう問題があって、価格帯はこのぐらいで、、みたいな議論も勿論必要ですね。

実装

  1. Stripeにサインアップします。

  2. 適当に商品を作成します。

    1. 今回は2000円の商品を作りました。

  3. 適当なディレクトリを作成

  4. npm i express stripe を実行します

  5. 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')});
    
  6. 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>
    
  7. node server.js でサーバーを立ち上げて確認する

解説&確認

  1. サーバーを立ち上げるとindex.htmlが表示される

  2. Checkoutボタンを押すとserver.jsが立ち上げたサーバーにpostリクエストを飛ばす。
    serverはpostリクエストが飛んでくると、sessionを作成して、決済画面にリダイレクトする

    server.js
    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)
    })
    

  3. 決済が完了するor決済せずに戻るで分岐して処理を書いている

    server.js
    app.get('/success', (req,res) => {
        res.send('成功!!!')
    })
    app.get('/cancel', (req,res) => {
        res.send('失敗!!')
    })
    
  4. 決済成功パターン

  5. 決済せずに戻ってくるパターン

結論

決済完了するだけならセッション作成してStripeが指定した場所に飛ばすだけで決済できましたね。
ちゃんとECサイトとして使おうと思うとなかなか考えることが多そうです。
・カートに入れた商品を合計する
・その商品全ての決済や税金、送料なども入れたい
・クレジットカードを登録したい
と要件によって複雑になります。

お客さんの情報や注文情報などをStripeじゃなくて別の場所で管理しようとするとそれも大変そうです。一筋縄ではいかないようです。とほほ

決済の流れが勉強できたので、よかったです。

Discussion