payjp를 사용하여 신용 카드 기능을 도입하면 (카드 등록편)
최근에는 슈퍼 드라이가 능숙하기 때문에 매일 1병 마시는군요.
하지만 역시 생맥주가 제일군요.
자! ! ! 이번은 신용 카드 등록 편입니다! ! !
우선 대전제로서 프리마 어플을 작성하고 있다고 상정하고 있는 것을 알고 받음! !
payjp를 모르는 분은 우선 도입편을 체케랏! !
도입편
자, 가자! ! !
1 payjp와 통신하기 위한 키 등록
우선은 payjp의 API를 체케라!
(테스트도 프로덕션도 비밀키는 공개해서는 안 되므로 공개해서 후회하지 말아라!!)
(너무 지루하고 절망)
(지우는 잡이지만, 마지막 분은 다케다 쌍운 선생님 같다....)
현 단계에서 필요한 것은 테스트의 비밀키와 공개키.
rails5.2는 credentials에 등록! !
등록 방법을 모르는 분은 괜찮 아타이의 기사를 보지! !
credentials 등록 방법
이름은 뭐든지 좋지만 프라이빗 키라든지?
그건 그렇고, 아타이는
credentials :payjp
:PAYJP_PRIVATE_KEY = 'sk_test~'
:PAYJP_KEY = 'pk_test~'
라고 느꼈습니다.
2 계속해서 Rails!!
우선 카드 모델 작성하겠습니다.
models/card.rb class Card < ApplicationRecord
belongs_to :user
#バリデーションはお好みで。
이어 ぇ 마이그레이션 파일 ぅ
db/migrate/create_cards.rbclass CreateCards < ActiveRecord::Migration[5.2]
def change
create_table :cards do |t|
t.string :customer_id, null:false
#customer_idはその名の通り顧客ID.
t.string :card_id, null:false
t.references :user, null:false, foreign_key:true
t.timestamps
end
end
end
왜 이런 느낌? 라고 생각하고 있을지도 모릅니다만 payjp라고 이런 느낌으로 표시되는 것입니다.
카드 정보를 이해하기 어렵고 저장 한 값이 card_id
그래서 그 card_id를 가지고 있는 것이 customer_id.
그래서 card_id와 customer_id를 가지고 DB에 저장하고 user_id를 연결하면 좋다.
오케이? ?
3 그런데 컨트롤러! !
cards_controller.rbclass CardsController < ApplicationController
require "payjp"
# これでpayjpを読み込むわよ
def new # カードの登録画面。送信ボタンを押すとcreateアクションへ。
card = Card.where(user_id: current_user.id).first
redirect_to card_path(@card.id) if card.present?
end
def create #PayjpとCardのデータベースを作成
Payjp.api_key = Rails.application.credentials[:payjp][:PAYJP_PRIVATE_KEY]
# ここで秘密鍵をセット!!
if params['payjp-token'].blank?
redirect_to action: "new"
else
# トークンが正常に発行されていたら、顧客情報をPAY.JPに登録します。
customer = Payjp::Customer.create(
description: 'test', # 無くてもOK。PAY.JPの顧客情報に表示する概要です。
email: current_user.email,# これも無くてOK
card: params['payjp-token'], # 直前のnewアクションで発行され、送られてくるトークンをここで顧客に紐付けて永久保存します。
metadata: {user_id: current_user.id} # 無くてもOK。
)
@card = Card.new(user_id: current_user.id, customer_id: customer.id, card_id: customer.default_card)
if @card.save
redirect_to card_path(@card.id)
else
redirect_to action: "create"
end
end
end
private
#user_idが外部キーとしてあるので、まずユーザーがないといけません。
def set_card
@card = Card.where(user_id: current_user.id).first if Card.where(user_id: current_user.id).present?
end
end
이어 JS!!
payjp.jsdocument.addEventListener(
"DOMContentLoaded", (e) => {
Payjp.setPublicKey("pk_test_0df3d3eb150a3f3dd0f2fc3e");
const btn = document.getElementById('token_submit'); //IDがtoken_submitの場合に取得されます
btn.addEventListener("click", (e) => { //ボタンが押されたときに作動します
e.preventDefault(); //ボタンを一旦無効化します
//カード情報生成
const card = {
number: document.getElementById("card_number").value,
cvc: document.getElementById("cvc").value,
exp_month: document.getElementById("exp_month").value,
exp_year: document.getElementById("exp_year").value
}; //入力されたデータを取得します。
//トークン生成
Payjp.createToken(card, (status, response) => {
if (status === 200) { //成功した場合
$("#card_number").removeAttr("name");
$("#cvc").removeAttr("name");
$("#exp_month").removeAttr("name");
$("#exp_year").removeAttr("name"); //カード情報を自分のサーバにpostせず削除します
$("#card_token").append(
$('<input hidden name="payjp-token">').val(response.id)
); //トークンを送信できるように隠しタグを生成
document.inputForm.submit();
alert("登録が完了しました");
} else {
alert("カード情報が正しくありません。");
}
});
});
},false);
이것으로 움직이지 않으면 여기를 살펴 보겠습니다.
app/views/layouts/application.html.haml%html
%head
%meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
%title payjptest
%script{src: "https://js.pay.jp/", type: "text/javascript"}
-# ↑このscriptを記載
= csrf_meta_tags
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
%body
= yield
조금 잡담해 버렸습니다만, 이런 느낌.
보충편이라든지 신경이 쓰이면 뷰 파일도 함께다고 할까.
다음 번은 구입 실장편으로 만나요! !
Reference
이 문제에 관하여(payjp를 사용하여 신용 카드 기능을 도입하면 (카드 등록편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rockettetsu/items/0bc062909a6ce3904506
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
:payjp
:PAYJP_PRIVATE_KEY = 'sk_test~'
:PAYJP_KEY = 'pk_test~'
우선 카드 모델 작성하겠습니다.
models/card.rb
class Card < ApplicationRecord
belongs_to :user
#バリデーションはお好みで。
이어 ぇ 마이그레이션 파일 ぅ
db/migrate/create_cards.rb
class CreateCards < ActiveRecord::Migration[5.2]
def change
create_table :cards do |t|
t.string :customer_id, null:false
#customer_idはその名の通り顧客ID.
t.string :card_id, null:false
t.references :user, null:false, foreign_key:true
t.timestamps
end
end
end
왜 이런 느낌? 라고 생각하고 있을지도 모릅니다만 payjp라고 이런 느낌으로 표시되는 것입니다.
카드 정보를 이해하기 어렵고 저장 한 값이 card_id
그래서 그 card_id를 가지고 있는 것이 customer_id.
그래서 card_id와 customer_id를 가지고 DB에 저장하고 user_id를 연결하면 좋다.
오케이? ?
3 그런데 컨트롤러! !
cards_controller.rbclass CardsController < ApplicationController
require "payjp"
# これでpayjpを読み込むわよ
def new # カードの登録画面。送信ボタンを押すとcreateアクションへ。
card = Card.where(user_id: current_user.id).first
redirect_to card_path(@card.id) if card.present?
end
def create #PayjpとCardのデータベースを作成
Payjp.api_key = Rails.application.credentials[:payjp][:PAYJP_PRIVATE_KEY]
# ここで秘密鍵をセット!!
if params['payjp-token'].blank?
redirect_to action: "new"
else
# トークンが正常に発行されていたら、顧客情報をPAY.JPに登録します。
customer = Payjp::Customer.create(
description: 'test', # 無くてもOK。PAY.JPの顧客情報に表示する概要です。
email: current_user.email,# これも無くてOK
card: params['payjp-token'], # 直前のnewアクションで発行され、送られてくるトークンをここで顧客に紐付けて永久保存します。
metadata: {user_id: current_user.id} # 無くてもOK。
)
@card = Card.new(user_id: current_user.id, customer_id: customer.id, card_id: customer.default_card)
if @card.save
redirect_to card_path(@card.id)
else
redirect_to action: "create"
end
end
end
private
#user_idが外部キーとしてあるので、まずユーザーがないといけません。
def set_card
@card = Card.where(user_id: current_user.id).first if Card.where(user_id: current_user.id).present?
end
end
이어 JS!!
payjp.jsdocument.addEventListener(
"DOMContentLoaded", (e) => {
Payjp.setPublicKey("pk_test_0df3d3eb150a3f3dd0f2fc3e");
const btn = document.getElementById('token_submit'); //IDがtoken_submitの場合に取得されます
btn.addEventListener("click", (e) => { //ボタンが押されたときに作動します
e.preventDefault(); //ボタンを一旦無効化します
//カード情報生成
const card = {
number: document.getElementById("card_number").value,
cvc: document.getElementById("cvc").value,
exp_month: document.getElementById("exp_month").value,
exp_year: document.getElementById("exp_year").value
}; //入力されたデータを取得します。
//トークン生成
Payjp.createToken(card, (status, response) => {
if (status === 200) { //成功した場合
$("#card_number").removeAttr("name");
$("#cvc").removeAttr("name");
$("#exp_month").removeAttr("name");
$("#exp_year").removeAttr("name"); //カード情報を自分のサーバにpostせず削除します
$("#card_token").append(
$('<input hidden name="payjp-token">').val(response.id)
); //トークンを送信できるように隠しタグを生成
document.inputForm.submit();
alert("登録が完了しました");
} else {
alert("カード情報が正しくありません。");
}
});
});
},false);
이것으로 움직이지 않으면 여기를 살펴 보겠습니다.
app/views/layouts/application.html.haml%html
%head
%meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
%title payjptest
%script{src: "https://js.pay.jp/", type: "text/javascript"}
-# ↑このscriptを記載
= csrf_meta_tags
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
%body
= yield
조금 잡담해 버렸습니다만, 이런 느낌.
보충편이라든지 신경이 쓰이면 뷰 파일도 함께다고 할까.
다음 번은 구입 실장편으로 만나요! !
Reference
이 문제에 관하여(payjp를 사용하여 신용 카드 기능을 도입하면 (카드 등록편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rockettetsu/items/0bc062909a6ce3904506
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class CardsController < ApplicationController
require "payjp"
# これでpayjpを読み込むわよ
def new # カードの登録画面。送信ボタンを押すとcreateアクションへ。
card = Card.where(user_id: current_user.id).first
redirect_to card_path(@card.id) if card.present?
end
def create #PayjpとCardのデータベースを作成
Payjp.api_key = Rails.application.credentials[:payjp][:PAYJP_PRIVATE_KEY]
# ここで秘密鍵をセット!!
if params['payjp-token'].blank?
redirect_to action: "new"
else
# トークンが正常に発行されていたら、顧客情報をPAY.JPに登録します。
customer = Payjp::Customer.create(
description: 'test', # 無くてもOK。PAY.JPの顧客情報に表示する概要です。
email: current_user.email,# これも無くてOK
card: params['payjp-token'], # 直前のnewアクションで発行され、送られてくるトークンをここで顧客に紐付けて永久保存します。
metadata: {user_id: current_user.id} # 無くてもOK。
)
@card = Card.new(user_id: current_user.id, customer_id: customer.id, card_id: customer.default_card)
if @card.save
redirect_to card_path(@card.id)
else
redirect_to action: "create"
end
end
end
private
#user_idが外部キーとしてあるので、まずユーザーがないといけません。
def set_card
@card = Card.where(user_id: current_user.id).first if Card.where(user_id: current_user.id).present?
end
end
document.addEventListener(
"DOMContentLoaded", (e) => {
Payjp.setPublicKey("pk_test_0df3d3eb150a3f3dd0f2fc3e");
const btn = document.getElementById('token_submit'); //IDがtoken_submitの場合に取得されます
btn.addEventListener("click", (e) => { //ボタンが押されたときに作動します
e.preventDefault(); //ボタンを一旦無効化します
//カード情報生成
const card = {
number: document.getElementById("card_number").value,
cvc: document.getElementById("cvc").value,
exp_month: document.getElementById("exp_month").value,
exp_year: document.getElementById("exp_year").value
}; //入力されたデータを取得します。
//トークン生成
Payjp.createToken(card, (status, response) => {
if (status === 200) { //成功した場合
$("#card_number").removeAttr("name");
$("#cvc").removeAttr("name");
$("#exp_month").removeAttr("name");
$("#exp_year").removeAttr("name"); //カード情報を自分のサーバにpostせず削除します
$("#card_token").append(
$('<input hidden name="payjp-token">').val(response.id)
); //トークンを送信できるように隠しタグを生成
document.inputForm.submit();
alert("登録が完了しました");
} else {
alert("カード情報が正しくありません。");
}
});
});
},false);
%html
%head
%meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
%title payjptest
%script{src: "https://js.pay.jp/", type: "text/javascript"}
-# ↑このscriptを記載
= csrf_meta_tags
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
%body
= yield
Reference
이 문제에 관하여(payjp를 사용하여 신용 카드 기능을 도입하면 (카드 등록편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rockettetsu/items/0bc062909a6ce3904506텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)