【JSだけで完結】Stripeの決済機能は1時間で実装できる【簡単】

# はじめに
2020年のGW 6連休は某新型ウィルスのおかげで旅行にもいけないなぁ...ということでプロダクトを個人開発することにしました。

出来たものがコチラです
[![cover_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/2b23261c-0719-12f9-4607-4f6ee7c2df27.png)](https://liveslives.net)


僕は魚を観察するのが好きなので、水族館にいくのが好きなのですが、ここ最近はGWも含めて感染拡大防止の観点から開園ができていないそうです。

また、僕の周囲の人々も、引きこもり生活に日々閉塞感を感じているように見えます。

このように、

- 収入がないのに固定費が大幅にかかっていて倒産寸前な水族館（ひいてはそこにいる生き物たち）
- 外出できずに閉塞感を味わっている人々

の両者にニーズがあると予想して、「**おうちで楽しむ水族館|Lives:Lives**」を開発することにしました。

> Life(生命)の複数形のLivesと、Live(Streaming)の複数形のLivesを掛け合わせたネーミングです。

Lives:Livesのメイン機能は生き物の映像を閲覧する機能ですが、それに加えて、水族館に¥110("いい人"価格)から金銭的支援ができる機能を儲けようと思っています。

その際に決済の機能が必要になってくるというわけです。

決済のSaaSでは、stripeが有名です。料金も決済されたお金の3.6%にかかってくるだけなので、個人開発者には優しいですね。

また少し調べたところ、どうやらフロントエンドだけで実装ができるらしいぞ！ということで、早速試してみました。

# 実装
基本的には[公式のガイド](https://stripe.com/docs/payments/checkout/client)に沿って進めていきます。
一部、コードの実装だけはHTML用のサンプルしかないので、そこだけ置き換えていきます。

まずは[Checkout settings](https://dashboard.stripe.com/settings/checkout)から、`Checkout client-only integration`を`ENABLED`にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/46df5007-741d-e65e-781c-22676507d9e2.png)


次に`products`を作成します。[ここ](https://dashboard.stripe.com/test/products/create)から、必要情報を入力して何かテスト用のプロダクトを作成しましょう。

画像は512kb以内しかダメらしい💦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/007b12d4-1b51-aa37-954f-52b9ecafd0f4.png)


作成したproductsに`Use with Checkout`というボタンがあるので、それを押してみます。

<img width="895" alt="２スクリーンショット 2020-05-06 14.23.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/f7f9d8b8-903c-c7c4-f8a7-08c0bc4a34f9.png">


なるほど、このJSのスニペットをコピペで実行できるということですね！簡単だなぁ〜〜

とはいえ、JS on HTMLではなくReact.jsでの実装ということで、少し変更する必要がありそうですね。

探すと、[公式のサンプルコードらしきもの](https://github.com/stripe-samples/checkout-one-time-payments/blob/master/client-only/client/react-cra/src/components/Checkout.js)がありました。useReducerとか使ってて少し難しそうなので、アレンジして簡単にしてみました。

```bash
# 必要なパッケージをインストールする
yarn add @stripe/stripe-js
```

```tsx:src/PaymentButton.tsx
import React from 'react'
import { loadStripe, Stripe } from '@stripe/stripe-js'

const stripePromise: Promise<Stripe | null> = loadStripe("pk_test_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");//IDを書き換えてください

const handleClick = async (event: any) => {
    const stripe = await stripePromise
    await stripe?.redirectToCheckout({
        items: [{ sku: 'sku_XXXXXXXXXX', quantity: 1 }],//IDを書き換えてください
        successUrl: 'https://your-website.com/success',//ここには支払い成功時にリダイレクトされてほしいURLをセットする
        cancelUrl: 'https://your-website.com/canceled',//ここには支払いキャンセル時にリダイレクトされてほしいURLをセットする
    }).catch(err => console.log(err.message))//エラーはとりあえずコンソールに出力する
}

export default function PaymentButton() {
    return (
        <button onClick={handleClick} >Payment!!!</button>
    )
}
```
> 動くだけの適当なコードなので注意してくださいw

このようにして定義したコンポーネントを、App.tsxなどで呼び出してください。

```tsxsrc/App.tsx
import PaymentButton from './PaymentButton'
<PaymentButton />
```

できましたね。

それではいよいよ、`yarn start`して、ローカルホストに接続しましょう。
ボタンを押してみます。

・・・あれ？何も起きない。

そういえば、コードの中でエラーメッセージをconsole.log()していましたね。
Chrome Devtools を開いて、Consoleタブを見ながらもう一度ボタンを押してみましょう。

<img width="474" alt="スクリーンショット 2020-05-06 12.54.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/612e7154-b052-21bf-3889-5e67f4ebfafc.png">

なるほど、アカウントのセットアップをやってないよ、ということですね。

<img width="1087" alt="スクリーンショット 2020-05-06 12.53.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/aed902d8-6e3c-e113-2cc0-bd9aa4d70512.png">

ボタンを押すと自動でstripeの決済画面が開かれました！
無事成功してよかった〜

<img width="985" alt="スクリーンショット 2020-05-06 12.54.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/b4ff056e-5f35-7964-f52c-c4d90a13135a.png">

レスポンシブ対応も、当然バッチリ！イカすUIですね。

<img width="357" alt="スクリーンショット 2020-05-06 12.55.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/ea375d02-cdca-5dcb-aba8-2c37f4d1fd5c.png">

テスト用のカード情報は[ここ](https://stripe.com/docs/testing#cards)にあります。CVCやDATEやNAMEは適当で良いみたい

入力後、`Pay ¥500`ボタンを押すと、グルグル回ってSuccess！と表示されました。
そのあとは指定したページにリダイレクトされます。

本当に決済できたのかを確認してみましょう。
stripeの[ダッシュボード](https://dashboard.stripe.com/test/dashboard)に移動します。

<img width="1103" alt="スクリーンショット 2020-05-06 13.01.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131737/c3cd9c28-11d5-d1af-c558-a996c4edd0ab.png">

おお！記録されていますね、先ほどの¥500の決済が。
おめでとうございます、これであなたはStripeを完全に理解しました。
# おわりに
簡単に実装できるstripeは素敵ですね。

個人開発では、マネタイズを考えていないままリリースする方も多いイメージがあります。
でも、これだけ簡単に実装できるんですから軽率にマネタイズしていっていいんじゃないかなぁと僕は思うわけです。

自身が作ったプロダクトで収益を得て、それによりモチベーションや自信が生まれて、さらなるプロダクトが生まれる...

理想的なサイクルじゃぁないですか。

ついつい脇道に逸れてしまいましたがこちらのstripe、サブスクリプション機能も同じような方法で実装できるようなので、いずれ試してみようと思います。

それではみなさんも良い開発ライフを！