Rails5.2에서 Stripe 사용

Rails 5.2에서 다양한 시도 이라는 기사로 작성한 Rails 프로젝트에 덧붙여 Stripe 에 의한 신용카드 결제를 구현하고 있습니다. 보통 신규 프로젝트를 만든 이어로 읽어 주셔도 대체로 OK일 것입니다.



먼저 Gemfile에 gem을 추가하고 bundle install를 실행합니다 (gem 버전은 5.11이었습니다).

Gemfile
gem 'stripe'

Stripe의 대시보드 Developers -> API Keys를 방문하여 Publishable key와 Secret Key를 가져옵니다.

정액의 상품을 1개 구입하는 샘플로서, 구입 페이지(payment1)와 구입 완료 페이지(payment2)를 작성합니다.

config/routes.rb
  get '/payment1', to: 'pages#payment1'
  post '/payment2', to: 'pages#payment2'

pages_controller.rb가 없으면 다음 명령으로 작성하십시오. 마지막 기사 에서 컨트롤러를 만드는 경우에는 필요하지 않습니다.
rails g controller Pages payment1 payment2

컨트롤러의 코드는 다음과 같습니다. payment1은 버튼(JavaScript)을 두는 것만으로 payment2에서는 post되어 온 메일 주소와 토큰을 바탕으로 Customer(고객)를 작성해, 한층 더 그 ID를 사용해, 500엔의 Charge(결제)를 작성합니다 . 카드가 승인되지 않는 등의 오류가 발생하면 해당 메시지와 함께 payment1로 리디렉션합니다.

app/controllers/pages_controller.rb
  def payment1
  end

  def payment2
    customer = Stripe::Customer.create(
      :email => params[:stripeEmail],
      :source  => params[:stripeToken]
    )

    charge = Stripe::Charge.create(
      :customer    => customer.id,
      :amount      => 500,
      :description => 'From Rails Demo',
      :currency    => 'jpy'
    )
  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to payment1_path
  end

대응하는 뷰의 분은 이하와 같은 느낌. 가능한 한 간단하게 쓰고 있습니다. 방금 취득한 키 중 「Publishable」쪽을 버튼의 속성으로서 세트 하고 있습니다.

app/views/pages/payment1.html.erb
<%= form_tag payment2_path do %>
  <% if flash[:error].present? %>
    <div id="error_explanation">
      <p><%= flash[:error] %></p>
    </div>
  <% end %>
  <p>Total(tax included): ¥500 </p>
  <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
          data-key="pk_test_DfoKFBIrAGKhxBbDgP0G954e"
          data-description="テスト"
          data-amount="500"
          data-currency="jpy"
          data-locale="auto"></script>
<% end %>

app/views/pages/payment2.html.erb
<p>Thank you for purchasing!</p>
<p><%= link_to 'Back', payment1_path %></p>

"Secret"쪽의 API Key는 Rails의 credentials 안에 보관하기로 합니다. 다음 명령으로 파일을 열고,
EDITOR=vim rails credentials:edit

맨 아래 줄에 다음과 같이 정의합니다.
stripe_secret_key: sk_test_xxxxxx

(덤) docker-composer를 사용하는 경우에는 편집기를 설치해야 합니다.
docker-compose exec web apt install vim
docker-compose exec -e EDITOR=vim web rails credentials:edit

다음과 같이 initializers 에 기술해, credentials 에 보존한 키의 값을 Stripe 의 프레임워크에 세트 합니다.

config/initializers/stripe.rb
Stripe.api_key = Rails.application.credentials.stripe_secret_key

이상으로 로컬 환경에서는 동작하게 될 것입니다. Stripe 대시보드 Payments 목록에 결제가 등록되어 있는지 확인해 보세요.

(덤) Rails의 credentials를 참조하기 위해서는 config/master.key라는 파일이 필요하지만 Heroku에는 업로드 할 수 없기 때문에 master.key에 쓰여졌습니다 해시 값을 환경 변수로 설정합니다.
heroku config:set RAILS_MASTER_KEY=xxxxx

이제 로컬 환경과 마찬가지로 API Key가 로드됩니다.

참고 링크



  • Stripe가 Rails에서 움직이는 메커니즘
    거의 이쪽의 기사를 베이스로 했습니다. Rails5.2 이후의 사양에 맞추어 열쇠의 잡는 방법을 변경하고 있습니다.
  • 좋은 웹페이지 즐겨찾기