Stripe Checkoutを使った定期課金をRailsアプリケーションに導入する

こんにちは、ラビーの K@zuki. です。
この記事では、Ruby on Railsで作成されているWebサービスに、Stripe Checkoutを使用した定期課金機能を導入する方法を簡単に紹介します。

前提

今回試す環境は以下のバージョンになっています。

  • Ruby … 3.3.0

  • Ruby on Rails …. 7.1.3.2

またStripeも事前に以下は準備しておいてください。

  • テスト用のアカウント作成

  • シークレットキーを控える

Stripe Checkoutとは

Stripe Checkoutは、Stripeが提供するホスティング型の決済ページです。Stripe Checkoutを使用することで、開発者は最小限のコードでセキュアな決済フォームを実装することができます

環境準備

Stripeを導入する前にサンプルのアプリケーションを作成しておきます。
今回作成するアプリケーションの画面構成は以下のようにしたいので、それを前提に作成していきます。

  • ホーム … トップページ。ログインしている場合はサブスク設定ページへのリンクを表示

  • サブスク設定 … サブスクの契約状態を表示するページ。契約状態に応じてサブスクの契約・解除リンクを表示

# アプリケーションの作成
rails new dummy --minimal -B -G -T --skip-docker
cd dummy

# deviseの導入とユーザモデルの作成
bundle add devise
bin/rails g devise:install
bin/rails g devise:views
bin/rails g devise user
bin/rails g migration AddSubscriptionToUser subscribed:boolean subscription_id:string
vim db/migrate/XYZ # マイグレーションファイルを書き換えてデフォルト値を設定(下記に例あり)
bin/rails db:create db:migrate

# 各種ページの作成
bin/rails g controller home index   
bin/rails g controller subscriptions show create_checkout_session cancel           

生成されたファイルは以下のように変更しておきます。

db/migrate/XYZ

class AddSubscriptionToUser < ActiveRecord::Migration[7.1]
  def change
    add_column :users, :subscribed, :boolean, default: false
    add_column :users, :subscription_id, :integer
  end
end

config/routes.rb ※1

Rails.application.routes.draw do
  root 'home#index'

  devise_for :users

  get '/subscription', to: 'subscriptions#show'
  get '/cancel', to: 'subscriptions#cancel'
  get '/create_checkout_session', to: 'subscriptions#create_checkout_session'
end

app/controllers/subscriptions_controller.rb

class SubscriptionsController < ApplicationController
  before_action :authenticate_user!

  def show
  end

  def cancel
    current_user.update(subscribed: false, subscription_id: nil)
    redirect_to subscription_path, notice: "Your subscription has been cancelled."
  end

  def create_checkout_session
    current_user.update(subscribed: true, subscription_id: SecureRandom.random_number(1_000))
    redirect_to subscription_path, notice: "Your subscription was successful!"
  end
end

app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>Guild</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application" %>
  </head>

  <body>
    <% flash.each do |key, value| %>
      <div class="alert alert-<%= key %>"><%= value %></div>
    <% end %>
    <%= yield %>
  </body>
</html>

app/views/home/index.html.erb

<h1>Home#index</h1>
<% if user_signed_in? %>
  <p>Hi, <%= current_user.email %>!</p>
  <%= link_to 'Subscription Settings', subscription_path, class: 'btn btn-primary' %>
  <%= link_to 'Log out', destroy_user_session_path, method: :delete, class: 'btn btn-secondary' %>
<% else %>
  <%= link_to 'Sign up', new_user_registration_path, class: 'btn btn-primary' %>
  <%= link_to 'Log in', new_user_session_path, class: 'btn btn-secondary' %>
<% end %>

app/views/subscriptions/show.html.erb

<h1>Subscriptions#show</h1>
<% if current_user.subscribed? %>
  <p>Status: Subscribed</p>
  <%= link_to 'Cancel Subscription', cancel_path, method: :post, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
<% else %>
  <p>Status: Not Subscribed</p>
  <%= link_to 'Subscribe', create_checkout_session_path, method: :post, class: 'btn btn-primary' %>
<% end %>

これでStripeとの決済画面以外でのサンプル実装ができました。
さて次は実際にStripeでの実装に移ります。

Stripeを使った決済機能実装

Stripeを使って決済機能を実装します。
まずはStripeをRailsアプリケーションで使えるようにしていきます。

ここから先は

3,511字 / 1画像

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?