質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1815閲覧

Stripe: stripeTokenが作成されない

YutaTanikawa

総合スコア8

Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/11/01 09:37

前提・実現したいこと

初めまして。Railsを独学で学んでおり、今回ECサイトのようなものの構築を試みています。
最終的に実現したいこととして、@product.priceをstripeのdata-amountとしてcharges controllerのcreateアクションに渡したいです。

一旦、data-amountをコントローラ側に渡す方法として、https://stripe.com/docs/recipes/variable-amount-checkoutを元に、まずはそれ通り実装を試みているのですが、stripeTokenが作成されず、先に進めません。

発生している問題・エラーメッセージ

Donateボタンを押したあと、決済画面にならず、下記エラーが発生します。

Stripe::InvalidRequestError in ChargesController#create Invalid source object: must be a dictionary or a non-empty string. See API docs at https://stripe.com/docs'

app/views/products/show.html.erb

ruby

1<p id="notice"><%= notice %></p> 2 3<p> 4 <strong>Name:</strong> 5 <%= @product.name %> 6</p> 7 8<p> 9 <strong>Price:</strong> 10 <%= @product.price %> 11</p> 12 13<p> 14 <strong>Stock:</strong> 15 <%= @product.stock %> 16</p> 17 18 19<%= form_tag charges_path do %> 20 <div id="error_explanation"> 21 <% if flash[:error].present? %> 22 <p><%= flash[:error] %></p> 23 <% end %> 24 </div> 25 <article> 26 <%= label_tag(:amount, 'Donation Amount:') %> 27 <%= text_field_tag(:amount) %> 28 </article> 29 <article> 30 <%= hidden_field_tag(:stripeToken) %> 31 </article> 32 <button id='donateButton'>Donate</button> 33<% end %> 34 35<script src="https://checkout.stripe.com/checkout.js"></script> 36 37<script> 38var handler = StripeCheckout.configure({ 39 key: '<%= Rails.configuration.stripe[:publishable_key] %>', 40 locale: 'auto', 41 name: 'Sand Castles United', 42 description: 'One-time donation', 43 token: function(token) { 44 $('input#stripeToken').val(token.id); 45 $('form').submit(); 46 } 47}); 48 49$('#donateButton').on('click', function(e) { 50 e.preventDefault(); 51 52 $('#error_explanation').html(''); 53 54 var amount = $('input#amount').val(); 55 amount = amount.replace(/$/g, '').replace(/\,/g, '') 56 57 amount = parseFloat(amount); 58 59 if (isNaN(amount)) { 60 $('#error_explanation').html('<p>Please enter a valid amount in USD ($).</p>'); 61 } 62 else if (amount < 5.00) { 63 $('#error_explanation').html('<p>Donation amount must be at least $5.</p>'); 64 } 65 else { 66 amount = amount * 100; // Needs to be an integer! 67 handler.open({ 68 amount: Math.round(amount) 69 }) 70 } 71}); 72 73// Close Checkout on page navigation 74$(window).on('popstate', function() { 75 handler.close(); 76}); 77</script> 78 79<%= link_to 'Edit', edit_product_path(@product) %> | 80<%= link_to 'Back', products_path %> 81

app/controllers/charges_controller.rb

ruby

1class ChargesController < ApplicationController 2 def new 3 end 4 5 def create 6 @amount = params[:amount] 7 8 @amount = @amount.gsub('$', '').gsub(',', '') 9 10 begin 11 @amount = Float(@amount).round(2) 12 rescue 13 flash[:error] = 'Charge not completed. Please enter a valid amount in USD ($).' 14 redirect_to new_charge_path 15 return 16 end 17 18 @amount = (@amount * 100).to_i # Must be an integer! 19 20 if @amount < 500 21 flash[:error] = 'Charge not completed. Donation amount must be at least $5.' 22 redirect_to new_charge_path 23 return 24 end 25 26 Stripe::Charge.create( 27 :amount => @amount, 28 :currency => 'usd', 29 :source => params[:stripeToken], 30 :description => 'Custom donation' 31 ) 32 33 rescue Stripe::CardError => e 34 flash[:error] = e.message 35 redirect_to new_charge_path 36 end 37 end

###config/initializer/stripe.rb

Rails.configuration.stripe = { publishable_key: Rails.application.secrets.stripe_publishable_key, secret_key: Rails.application.secrets.stripe_secret_key } Stripe.api_key = Rails.application.secrets.stripe_secret_key

config/routes.rb

Rails.application.routes.draw do resources :products resources :charges end

試したこと

rails sしたログには、

Started POST "/charges" for 127.0.0.1 at 2018-11-01 18:02:41 +0900
Processing by ChargesController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"JQv6bhiP+tO+gC9+s+hY1Av+No57+CW1u1e3dOtlfWNnfnaq8lrueqxkHE98aI2+D0JqZ4eOd/nG+MxNsGPwEg==", "amount"=>"1200", "stripeToken"=>""}
Completed 500 Internal Server Error in 1655ms (ActiveRecord: 0.0ms)

と表示されていることを確認しています。

Stripeのdocsを一応読みましたが、英語なのと今回の内容に対してどのあたりを見ればいいかの勘所がわからないため、ご質問させていただいています。

補足情報

Rails 5.1.6
ruby 2.5.0
Stripeのkeyはconfig/secret.ymlに記載しています

今回初めて質問させていただくため、必要な情報が全然足りないかもしれないです。他に必要なソースコードがあれば教えていただきたいです。確認取れ次第追記します。
どなたかヒントでもいいのでいただければと思います。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問