今回はStripeで作成したサブスクリプションが持つ、商品の個数情報を更新する方法についてご紹介します。
はじめに
StripeにはBillingと呼ばれるサービスが存在しており、サブスクリプションの仕組みを簡単に構築できます。
無料トライアルや、日割り計算など複雑な計算を担ってくれる頼もしいサービスですね。
今回はそんなサブスクリプションの内容を更新する方法についてご紹介します。
「そんなの簡単じゃないの?」って思われるかもしれないですが、少しはまってしまったので備忘録としてご紹介します。
想定されるユースケース
今回の実装がどういったユースケースの実現に役に立つかというと、例えば、
- お菓子を毎月届けてくれるサブスクリプションサービス
- 各お菓子毎に価格が異なる
- お菓子ごとに数量変更が可能
といった感じでしょうか。
このケースで、購入するお菓子の内容を変更したい!という場合の実装方法です。
結論
急いでる方向けに結論だけ言いますと
更新時にSubscription ItemのIdを指定して更新を行う
といった点がポイントです。
環境
今回の環境です
- Postman
- Stripe API(2022-08-01)
検証
事前準備
StripeのProductおよびPriceを3種類作成しておきます。せっかくので先ほどの商品モデルを使いまわしましょう
価格や、請求サイクルなどは何でもOKです。
- ポテチ 300円/月
- キャンディ400/月
- どら焼き 500/月
次にポテチとキャンディを含んだサブスクリプションを作成しておきます。
- サブスクリプション
- ポテチ(×2)
- キャンディ(×1)
更新処理
事前準備したサブスクリプションの内容を以下のような形に変更したいと思います。
- ポテチは数量変更
- キャンディは除外
- どら焼きは新規追加
といった感じですね。
※ここで各PriceIdや、SubscriptionIdはこの後利用するのでどこかに控えておいてください。
Update Subscription API
間違いパターン
さて、まず私が誤って行ったパターンを紹介します。
興味のない人は、この後の正解パターンをご確認ください。
商品情報を変更するので、Update Subscriptionのitems.priceのパラメータを使用します。
Postmanで実行するとこんな感じですね。
実行すると、400番エラーが返ってきてしまいました。
{
"error": {
"message": "Cannot add multiple subscription items with the same plan: price_{ポテチのpriceId}",
"param": "plan",
"request_log_url": "https://dashboard.stripe.com/test/logs/req_0R3OdGpBTXAjCE?t=1679275957",
"type": "invalid_request_error"
}
}
ポテチは既に登録されてるから登録できません。
といったニュアンスです。
数量変更ではなく、新規に2個を追加しようとしまっているようです。
ここでポイントなのが
- 既にポテチ2個はSubscription Itemのオブジェクトとして登録されている
- 既存のPriceに関しては、Subscription Itemを指定して更新する必要がある
- 削除に関しても同様にSubscription ItemのId情報を指定して、明示的にDeleteのパラメータを指定する
それでは、これを踏まえ正しい処理を実装していきます。
正しいパターン
まず始めに、各Subscription Item Idを取得します。
本来、Retrieve Subscription API等を使って取得しますが、今回はDashboardから取得してしまいましょう。
このSubscription Item Idを使ってAPIを実行していきます。
こんな感じです。
- 「数量変更」「削除」の場合はitems[number][id]にSubscription Item Idを指定
- 「新規追加」の場合はitems[number][price]にPrice Idを指定
しているのがポイントですね。
実行すると、今度は200番が返ってきました。
DashboardからSubscriptionの内容を見ると、無事更新されている事も確認できます。
まとめ
今回は、既存のサブスクリプションに登録されている商品情報を更新する内容をご紹介しました。
よくあるユースケースかと思うのですが、自分の場合少しハマってしまったので、同じような人の助けになれば幸いです!
最後までご覧いただきありがとうございました。