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

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

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

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2764閲覧

payjpのカード登録や支払処理の定義に使うオブジェクトについて

ringo_000

総合スコア7

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/02/16 13:37

開発言語:rails

payjpを使って、クレジットカード登録や支払処理の機能の実装を行いました。
参考記事:https://qiita.com/takachan_coding/items/f7e70794b9ca03b559dd

コードの記述の部分で意味がわからない箇所があります。

[payjpjsの全体]

payjpjs

1$(function(){ 2 3 var submit = document.getElementById("token_submit"); 4 console.log(submit) 5 6 if ( submit != null) { 7 submit.addEventListener('click', function(e){ // 追加するボタンが押されたらイベント発火 8 e.preventDefault(); // ボタンを一旦無効化 9 Payjp.setPublicKey("pk_test_***********************"); //パブリックキーを直書き 10 var card = { // 入力されたカード情報を取得 11 number: document.getElementById("card_number").value, 12 exp_month: document.getElementById("exp_month").value, 13 exp_year: document.getElementById("exp_year").value, 14 cvc: document.getElementById("cvc").value 15 }; 16 if (card.number == "", card.exp_month == "1", card.exp_year == "2019", card.cvc == "") { 17 alert("カード情報が入力されていません。"); // 送られた値がデフォルト値だった場合 18 } else { // デフォルト値以外の値が送られてきた場合 19 Payjp.createToken(card, function(status, response) { // トークンを生成 20 if (status === 200) { 21 $("#card_number").removeAttr("name"); 22 $("#exp_month").removeAttr("name"); 23 $("#exp_year").removeAttr("name"); 24 $("#cvc").removeAttr("name"); 25 $("#card_token").append( 26 $('<input type="hidden" name="payjp-token">').val(response.id) 27 ); 28 document.inputForm.submit(); // 生成したトークンを送信する準備を整える 29 alert("登録が完了しました"); 30 } else { 31 alert("正しいカード情報を入力してください。"); 32 } 33 }); 34 } 35 false 36 }); 37 } 38});
Payjp.createToken(card, function(status, response) { // トークンを生成 if (status === 200) { $("#card_number").removeAttr("name"); $("#exp_month").removeAttr("name"); $("#exp_year").removeAttr("name"); $("#cvc").removeAttr("name"); $("#card_token").append( $('<input type="hidden" name="payjp-token">').val(response.id)

responseがここでどういう働きをしているのかがわかりません。
response.idというのも出てきます。
またif (status === 200) {の部分はレスポンスステータスコードが200(成功)ならという意味だと思っているんですが、合ってますでしょか。

[makeの全体]

controller

1 def make #payjpとCardのデータベース作成を実施します。 2 Payjp.api_key = ENV["PAYJP_SECRET_KEY"] 3 if params['payjp-token'].blank? 4 redirect_to action: "new" 5 else 6 customer = Payjp::Customer.create( 7 description: '登録テスト', #なくてもOK 8 card: params['payjp-token'], 9 metadata: {user_id: current_user.id} 10 ) #念の為metadataにuser_idを入れましたがなくてもOK 11 @card = Card.new(user_id: current_user.id, customer_id: customer.id, card_id: customer.default_card) 12 @card.save #保存 13 end 14 end
customer = Payjp::Customer.create(

payjpのcustomerオブジェクトが使用されているのはわかりますが、なぜこのような書き方になっているのかがわかりません。
payjpのオブジェクトについて

[showの全体]

controller

1def show #Cardのデータをpayjpに送り情報を取り出します 2 @card = Card.where(user_id: current_user.id).first #テーブルからpayjpの顧客ID(アクセスキー)を検索 3 if @card.blank? 4 redirect_to action: "new" 5 else 6 Payjp.api_key = ENV["PAYJP_SECRET_KEY"] 7 customer = Payjp::Customer.retrieve(@card.customer_id) #保管した顧客ID(アクセスキー)でpayjpから情報取得 8 @default_card_information = customer.cards.retrieve(@card.card_id) #保管したカードIDでpayjpからカード情報取得、カード情報表示のためインスタンス変数に代入 9 end 10 end
customer = Payjp::Customer.retrieve(@card.customer_id)

.retrieveというメソッド?は初めて見て調べてみましたが、それらしき記事が見つかりませんでした。
和訳すると「取り戻す」「検索する」という意味なので、DBにある@cardのcustomer_idを検索するという意味でしょうか?

どなたかご教授頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問が3点あると思うので、順番に回答します。

response.id

Pay.jpの公式ドキュメント にありますが、Payjp.createTokenメソッドは第一引数でわたされたカード情報を受け取って、コールバック関数の第2引数(今のコードだとresponseという変数)にトークン情報をを返します。

トークンについてはこちらのドキュメントにある通り、以下のようなオブジェクトです。

js

1{ 2 "card": { 3 "address_city": null, 4 "address_line1": null, 5 "address_line2": null, 6 "address_state": null, 7 "address_zip": null, 8 "address_zip_check": "unchecked", 9 "brand": "Visa", 10 "country": null, 11 "created": 1442290383, 12 "customer": null, 13 "cvc_check": "passed", 14 "exp_month": 2, 15 "exp_year": 2020, 16 "fingerprint": "e1d8225886e3a7211127df751c86787f", 17 "id": "car_e3ccd4e0959f45e7c75bacc4be90", 18 "livemode": false, 19 "metadata": {}, 20 "last4": "4242", 21 "name": null, 22 "object": "card" 23 }, 24 "created": 1442290383, 25 "id": "tok_5ca06b51685e001723a2c3b4aeb4", 26 "livemode": false, 27 "object": "token", 28 "used": false 29}

つまり、response.idというのは、このトークンオブジェクトのidを参照していることになります。

また、if (status === 200)の部分は。おっしゃるようにレスポンスステータスコードが200(成功)という理解でいいと思います。

Payjp::Customer.create

おそらく、RubyでPayjpのAPIを叩く際にこちらのGemを使っていると思うですが、それを前提に回答します。
https://github.com/payjp/payjp-ruby

Payjp::Customer.createというメソッドは、このGemに定義されています。
ドキュメントにもありますが、「メールアドレスやIDなどを指定して顧客を作成」するメソッドです。
このように書くことでPayJPに顧客データを作成しています。

.retrieveというメソッド

こちらも上記回答と同様に、PayJPに定義されている顧客情報を取得するメソッドです。
ドキュメントにありますが、引数に指定したidで顧客情報を取得してくれるようです。
つまり、以下のように書くと、PayJPのデータベースからカードの顧客IDで顧客を検索しているものだと思います。

rb

1Payjp::Customer.retrieve(@card.customer_id)

投稿2020/02/17 07:05

編集2020/02/17 07:06
shgtkshruch

総合スコア665

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

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

ringo_000

2020/02/17 07:26

大変わかりやすかったです、勉強になりました! 公式ドキュメントに記載あったんですね、読み込みが甘かったです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問