もふもふ技術部

IT技術系mofmofメディア

【Rails】Stripeで決済したサブスクを解約する

Stripe決済第四弾です。
今回はいままで実装したサブスクの解約を実装します。
サブスクの実装は以下の記事を参考にしてみてください。

www.mof-mof.co.jp

実装

ルーティングを追加します。

config/routes.rb

resources :cancel, only: [:create]
viewsに追記します。

app/viewa/plans/index.html.erb

<%= button_to cancel_index_path, data: { turbo: false } do %>
  解約
<% end %>
コントローラーを作成します。

app/controllers/cancel_controller.rb

class CancelController < ApplicationController
  def create
    subscriptions = Stripe::Subscription.list(status: 'active', customer: current_user.customer_id)

    if subscriptions.blank?
      redirect_to plans_url, status: :see_other and return
    end

    subscription = Stripe::Subscription.cancel(subscriptions.first.id)
    if subscription.status == "canceled"
      current_user.update(plan_id: 1)
    end
    redirect_to plans_url, status: :see_other and return
  end
end

以下のようにStripeのAPIを使用して、契約中のサブスクデータを取得しています。
今までの実装で Payment にも決済情報を保存していますが、有効なサブスクデータを探すという意味合いでもAPIを使用してみました。

Stripe::Subscription.list(status: 'active', customer: current_user.customer_id)

もし、サービス内で複数のサブスクを契約できるようにしている場合は、以下のように price_id も用いて絞り込みをする必要があります。

Stripe::Subscription.list(status: 'active', customer: current_user.customer_id, price: "解約するサブスクのprice_id")

サブスク周りのAPIの詳細は以下を参考にしてみてください。

Subscriptions | Stripe API Reference

終わり

これで実装完了です。
サブスクを契約できるようにしたら、解約もできるようにしないといけませんね。
今回はWebhookを使用しませんでしたが、Webhookを使用することでさらに堅牢な実装ができるのではないでしょうか。