rails stripe 実装 忘備録

モデルは関係ない コントローラとViewをを作成 stripeでkeyを取得 JavaScriptに公開keyを入れる

gemも入れる

rubygems.org

gem 'stripe', '~> 4.7'

しかしルーティング問題

/payments/testで出るはず

routes.rb

 get '/payment/test', to: 'payment#test'

エラー

authorizationNotPerformed

このページを参考に修正 github.com

ApplicationController 全てに共通する処理はここに記載

//cancanの権限の動作をスキップできるようにする
//cancanをまだ実装していないため

 check_authorization :unless => :skip_authorize_controllers?

//デバイスやパラメーターで受け取ったコントローラーがpaymentだったら権限をスキップ
  def skip_authorize_controllers?
    respond_to?(:devise_controller?) || params[:controller] == "payment"
  end

####check_authorization定義

 def check_authorization(options = {})
        self.after_filter(options.slice(:only, :except)) do |controller|
          next if controller.instance_variable_defined?(:@_authorized)
          next if options[:if] && !controller.send(options[:if])
          next if options[:unless] && controller.send(options[:unless])
          raise AuthorizationNotPerformed, "This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check."
        end
      end

View

<%= form_with(url: :payment, method: :post) do |form| %>

  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="pk_test_9ShwqR3zdFlRpyTgSXvTgzHR"
    data-amount="100"
    data-currency="jpy"
    data-name="Stripe.com"
    data-description="Example charge"
    data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
    data-locale="auto"
    data-zip-code="true">
  </script>


  <%#= form.submit('保存', class: "btn btn-primary btn-lg my-1 mb-5 px-5") %>

<% end %>

コントローラーにreceiveアクションを作成

    def receive
        Stripe.api_key = "テストキー"
        token = params[:stripeToken]
        
        charge = Stripe::Charge.create({
            amount: 100,
            currency: 'jpy',
            description: 'Example charge',
            source: token,
            capture: false,
        })
               
        respond_to do |format|
            format.html { redirect_to :root, notice: '支払いしました' }
        end
        
    end