Stripeメモ

# 1つのsubscriptionで複数のsubscriptionをまとめることができる
ただし、priceはユニークなので同一のpriceを複数設定することはできない

```
{
  "error": {
    "message": "A new item with Price price_1P1L8ZCRXI2uG4x2oLfWbtd5 can't be added to this Subscription because an existing Subscription Item si_Pr70x82ZJRNzln is already using that Price. If you want to update the existing item (e.g., to adjust the quantity), pass the existing Subscription Item's `id` in your update request: https://stripe.com/docs/api/subscriptions/update#update_subscription-items-id",
    "param": "plan",
    "request_log_url": "https://dashboard.stripe.com/test/logs/req_aQULNGHsgFXu9b?t=1712131836",
    "type": "invalid_request_error"
  }
}
```

# invoiceItemsの生成時には1回限りのアイテムのみ設定することができる。
subscription, priceといったプロパティが設定できるがこれは、1回限りの設定をサブスクリプションとして登録するかという設定である。
そのため、すでにsubscriptionとして設定しているものinvoiceItemsとして生成することはできない

```
$ stripe invoice_items create --customer cus_Pr3Dz2tTB6PNow --subscription sub_1P1O17CRXI2uG4x2zxUgZhcf --price price_1P1L8ZCRXI2uG4x2oLfWbtd5  
{
  "error": {
    "message": "The price specified is set to `type=recurring` but this field only accepts prices with `type=one_time`.",
    "param": "price",
    "request_log_url": "https://dashboard.stripe.com/test/logs/req_OVeZNBPCJvhz11?t=1712138165",
    "type": "invalid_request_error"
  }
}
```
https://docs.stripe.com/billing/invoices/subscription?locale=ja-JP#adding-upcoming-invoice-items

# checkout sessionsとsubscription APIの使い分け
`Checkout Sessions`は、主にStripeを介した支払い処理を簡単に実装するために使用されます。特に、ウェブサイトやアプリケーションで商品やサービスの支払いを受け取るシナリオに適しています。`Checkout Sessions`を使用すると、セキュリティ対策が施された支払いページを自動的に生成し、クレジットカード情報の入力や支払い処理をStripeが代行してくれます。これにより、開発者は複雑な支払い処理の実装から解放され、セキュリティの担保された支払い体験を簡単に提供できます。

### `Checkout Sessions`の利用シナリオ

- **一回限りの支払い：** 物理的な商品の販売や、一度だけ提供されるサービスの支払いに使用します。
- **サブスクリプションの開始：** 定期的な課金を伴うサブスクリプションサービスの新規加入手続きに使用します。ユーザーがサブスクリプションを開始する際に、セキュリティ対策が施されたチェックアウトフローを提供できます。
- **追加の購入やアップセル：** 既存の顧客が追加の商品を購入したり、サブスクリプションプランをアップグレードしたりする際に使用します。

### サブスクリプションの更新における`Checkout Sessions`の利用

サブスクリプションの更新に`Checkout Sessions`を使用する場合は、通常、プランの変更や追加購入、アップセルなどのシナリオで考えられます。例えば、ユーザーが現在のサブスクリプションプランをアップグレードしたい場合、`Checkout Sessions`を使用して新しいプランへの移行を容易にする支払いフローを提供できます。しかし、既存のサブスクリプション内のアイテム数量の調整や細かい設定変更を行いたい場合は、直接サブスクリプションAPIを使用して更新する方が適切です。

`Checkout Sessions`は主に新しい支払いや顧客のオンボーディングプロセスを簡素化するために設計されています。既存のサブスクリプションの細かな変更や管理については、StripeのサブスクリプションAPIを直接使用することが推奨されます。


Stripeの`Checkout Sessions`と`Subscription API`は、異なるユースケースに対応するために設計されています。それぞれの使い分けについて解説します。

### Checkout Sessionsの利用シナリオ

- **新規サブスクリプションの開始：** ユーザーが新たにサブスクリプションサービスに加入する際に、セキュアな支払いフローを提供します。Stripeがホストするチェックアウトページへ誘導し、支払い情報の入力とサブスクリプションの登録を行います。
- **一回限りの支払い：** 商品販売や一時的なサービス提供に対する一回限りの支払い処理に使用します。Stripeが提供するチェックアウトフローを通じて、セキュアな支払い体験を提供できます。
- **追加購入やアップセル：** 既存の顧客が追加の商品を購入する場合や、サブスクリプションプランをアップグレードする場合に利用します。ユーザーをStripeのチェックアウトページへ誘導し、新たな支払いを簡単に処理できます。

### Subscription APIの利用シナリオ

- **サブスクリプションの詳細な管理：** 既存のサブスクリプションに対して、プランの変更、数量の調整、追加料金の適用など、細かなカスタマイズを行います。APIを直接操作することで、サーバーサイドから柔軟にサブスクリプションを管理できます。
- **自動更新の管理：** サブスクリプションの自動更新の有効・無効化、更新間隔の変更など、定期課金のサイクルを細かく制御します。
- **使用量ベースの課金：** 使用量に基づいて料金を計算し、課金するサブスクリプションモデルを実装します。APIを通じて使用量を報告し、課金額を動的に調整します。

### 使い分けのポイント

- **シンプルかつセキュアな支払いフローが必要な場合：** `Checkout Sessions`を利用します。Stripeがホストするチェックアウトページを通じて、セキュアで使いやすい支払い体験を提供できます。
- **サブスクリプションの細かな管理やカスタマイズが必要な場合：** `Subscription API`を直接利用します。APIを通じて、サブスクリプションに関する詳細な操作が可能となり、開発者はより柔軟にサブスクリプションを管理できます。

適切なツールの選択は、実装したい機能や提供したいユーザー体験に基づいて行うことが重要です。

# CheckoutSessionを通じて既存のサブスクリプションを更新しようとしていますが、これはサポートされていません。
https://stackoverflow.com/questions/70071318/how-to-pass-existing-subscription-details-on-stripe-during-checkout

# 支払い失敗時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242902/6c3caa9a-a41e-0a60-2690-e2475bc09953.png)

# 未払いの状態で決済処理のあるサブスクリプションの更新を行うと、サブスクリプションのステータスがactiveになってしまう。
その決済では、支払いをしていないインボイスは請求されない。
そのため、こちらから請求しないと支払いをしていないインボイスの請求ができない状態になる。
※インボイスがリトライ中の場合は、サブスクリプションの更新をしてもリトライが実行され請求される。

# サブスクリプション更新の際に決済失敗をした場合の挙動
・1回リトライされ（翌日の設定？）、リトライが失敗したらインボイスは無効になる
・リトライ時は同じ決済方法で実行されるため、決済方法を変更しても反映されない。

# 一度使用されたプランについては、価格の修正ができない
再度stripeのダッシュボードでプランの作成と、DB更新をする必要があります。
※価格を編集する を参照してください

# リンク一覧
https://zenn.dev/shingoirie/articles/6a294b81dc0880

https://labworks.digitalcube.jp/blog/technology_20201204_stripe-subscription/