stripeの買い切り（one-time payments)の商品購入処理をFirebase ExtensionsのRun Subscription Payments with Stripeでコードを書かずに実装する

こんにちは。[もぐめっと](https://mogmet.com)です。

![mogmet.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/9212ad63-fdb6-93fd-3913-2ab44569169f.jpeg)

最近、おでこのシワとは仲が良いです。with Odekoな人生を歩んでます。

最近Run Subscription Payments with Stripeで買い切りタイプの商品が決済できるようになりましたね。

https://github.com/stripe/stripe-firebase-extensions/blob/next/firestore-stripe-subscriptions/CHANGELOG.md#version-0112---2021-04-29

本日はこれを試してみたので詳細を解説いたします。

## インストール

Extensionsを開いて更新してない人は更新しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/d8120850-c778-f1bb-bff0-d77e57f535a3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/bf09e01c-8af6-58cb-1a24-ba97ac827e59.png)

新規の人は下記の記事からExtensionインストールや設定をしてください。

https://qiita.com/mogmet/items/cddc182156028c928ecf

## 買い切りタイプの商品を設定する

stripeの管理画面で[商品](https://dashboard.stripe.com/test/products)のページにいき、「商品を追加」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/f3bdc9ec-5291-95fe-6e86-0c8d392afdda.png)

料金体系から一括を選択すると一回限り（one-time）の商品になります。「商品を保存」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6f626c82-03b9-a8e1-6ec3-d766c0a9c896.png)

[宣伝]スタミナ制度ではありますが、何度でも遊べるようにはできてるモバイル版ワンナイト人狼はオンラインでみんなで遊べます！よかったら遊んでね！そのうちスタミナ回復もいい感じにできるようになります！

https://online.1nite-jinro.com/link/blog



## 挙動を確認してみる

stripe公式サンプルでもすでに買い切りタイプの商品に対応してるので起動してみてみます。
（サンプルまでの起動の仕方は小生の記事を参照ください）

https://qiita.com/mogmet/items/cddc182156028c928ecf

ボタンは「Subscribe」のままですが、そのまま先程作った商品をSubscribeします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/338daaca-d2f1-2ca7-e5bd-436ffcde7ae8.png)

stripeの画面に遷移して購入ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/5ea037da-ece9-5e29-52d1-8d83329e2114.png)

購入が無事完了するとcustomers/{uid}/payments/{id}というのが生成されて、購入情報がfirestore上に保存されます。

![スクリーンショット 2021-05-04 9.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/c43cdaaa-f625-644f-8fb4-9f3ed157cf70.png)

ただ、このドキュメントには入力された住所なども入ってくるのでセキュリティルールは厳重にするように気をつけてください。

## 実装面な話

買い切りタイプの商品の値段は products/{id}/prices/{id}のドキュメントでtypeが**one_time**に設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/a0367026-b487-8cfc-14a5-6c891cbb66a0.png)

こちらを判定して、チェックアウトのセッションを生成する時に、modeに**payment**を指定してあげることで買い切りの処理をすることができます。
サンプルコードでいうと[このへんの処理](https://github.com/stripe-samples/firebase-subscription-payments/blob/master/public/javascript/app.js#L189)になります。

```javascript
  const checkoutSession = {
    collect_shipping_address: true,
    tax_rates: taxRates,
    allow_promotion_codes: true,
    line_items: [selectedPrice],
    success_url: window.location.origin,
    cancel_url: window.location.origin,
    metadata: {
      key: 'value',
    },
  };
  // For one time payments set mode to payment.
  if (prices[selectedPrice.price]?.type === 'one_time')
    checkoutSession.mode = 'payment'; // これをセットすると買い切り処理になる

  const docRef = await db
    .collection('customers')
    .doc(currentUser)
    .collection('checkout_sessions')
    .add(checkoutSession);
```

## まとめ

Run Subscription Payments with Stripeで買い切りの商品も対応できるようになりました！
これでサブスク以外にも追加で商品を購入みたいなことができるようになるのでビジネスの幅もより手軽に広げることができますね！

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

また、チームビルディングや技術顧問なお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/