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

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

ただいまの
回答率

90.61%

  • Ruby

    7368questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7024questions

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

pay.jpを利用した決済のトークンの受け渡し

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 509

doit24

score 7

Ruby on railsで販売機能のあるアプリケーションを構築しています。
Pay.jpを利用した実装で苦心をしており、ご助言サポートをいただければ嬉しいです。

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

Please provide either a token, a set of card parameters or a customer ID with an active card.

カード情報入力してトークン化されて情報がうまくviewからcontrollerに渡せていないような気がしています。

※カード情報の入力後以下の形式でviewではhiddenとしてトークン情報は発行されています。
<input type="hidden" name="payjp-token" value="tok_....">

 ソースコード (new.html.erb)

<h2>決済のお手続き</h2>

<div class="row">
<%= form_for @order, :url => {:action => 'pay'} do |f| %>
  <div class="card mb-4">
    <div class="card-header">
      <p>購入者情報</p>
    </div>
    <div class="card-block">
      <table>
        <tbody>
          <tr>
            <th>購入者ID</th>
            <td class="px-2"><%= @user.id %><%= f.hidden_field :user_id, :value => @user.id %></td>
          </tr>
          <tr>
            <th scope="row">あなたのご注文</th>
            <td><%= @teacher.id %><%= f.hidden_field :teacher_id, :value => @teacher.id %></td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
</div>


<script type="text/javascript" src="https://checkout.pay.jp" class="payjp-button" data-partial="true" data-key="公開キー(pk...)" data-on-created="onCreated" ></script>

<div>
   <button type="submit" class="btn btn-primary">送信する</button>
</div>
<% end %>

  <br>
  <div>
    <%= link_to "トップへ", root_path %>
  </div>

 ソースコード(Order_controller.rb)

class OrdersController < ApplicationController

before_action :user_check!, only: :new

  def new
    @order = Order.new
    @teacher = Teacher.find_by(id: params[:format])
    @user = current_user
  end

  def create
  end

  def index
    @orders = Order.find_by(params[:id])
  end


  def pay
      Order.create(order_params)
      Payjp.api_key = '秘密キーsk...'
      charge = Payjp::Charge.create(
      :amount => 100,
      :card => order_params['payjp-token'],
      :currency => 'jpy',
  )
  end

private

  def order_params
    params.require(:order).permit(:user_id, :teacher_id)
    params.permit('payjp-token')
  end

  def user_check!
    unless user_signed_in?
        redirect_to users_path
    end
  end
end

 補足情報

ruby 2.4.0p0
Rails 5.0.5


時間をかけてもなかなか解決できず、困っています。もしよろしければ、アドバイスやサポートいただけないでしょうか。

内容を把握いただく上で他に必要な情報などあれば、ご教示ください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

当方はPay.jpは使っていませんし同じ環境を作るのは困難ですので(トークンやIDを共通にできない)その辺は差し引いて以下を参考にしてください。

def pay
  binding.pryまたはp order_params
  Order.create(order_params)


上記の例のように、binding.pryを仕掛けるなどして、パラメタが適切に渡っているのかを確かめてください。

order_paramsで所期の値が渡せているなら、controllerに問題があり、渡せていないならテンプレートerbに問題があると言えます。

要するに課題を切り分けること(コントローラの問題かビューの問題か)が最初の一歩になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 23:01

    コメントありがとうございます。渡せていないので、基本的にはview側の問題だと認識しています。bindind.pryでparamsを確かめても、渡したいpayjp-tokenのvalueが含まれていません。

    submitするデータとしてview側で拾えていないことが問題かとは思っているのですが、その原因解明にてこづっているのが現状です・・・

    jsで書かれたpayjp-tokenをsubmitの際に送信をしたいのですが、試行錯誤してうまくいっていません。何か考えられる原因などありますでしょうか

    キャンセル

  • 2017/09/06 23:18

    erbのソースを読むと:user_idと:teacher_idしか送られていないはずです。
    JSだろうとRailsだろうと原則的にはPOSTメソッドで送信されるのは、inputフィールドのnameとvalueのセットです。
    <%= f.hidden_field :user_id, :value => @user.id %>がinputフィールドに変換されます。
    ブラウザのソースでformタグ下に目的のフィールド<input type="hidden" name="payjp-token" value="tok_....">が含まれているか確かめることもデバッグの一つの方法です。
    必要なフィールドが<%= form_for @order, :url => {:action => 'pay'} do |f| %>のブロックの中に入るように編集し直してみてください。

    キャンセル

  • 2017/09/07 00:10

    ありがとうございます!!
    ご指摘いただいたとおり、formタグが正しく、目的のフィールド<input type="hidden" name="payjp-token" value="tok_....">を内包する形で記述されていませんでした。

    ruby,JS ではなく、viewのタグの構成のミスでした。

    サポートいただきましてありがとうございます。大変助かりました!

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7368questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7024questions

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