PAY.JPについて
PAY.JPはクレジット決済代行会社の一つ。(その他 paypal 等)
<クレジットカード決済代行サービス導入のメリット>
・カード会社ごとの個別対応不要。(visa,jcb,アメックス等)
・セキュリティ対策を講じなくても安全に運用できる。
セキュリティ面においては、クライアントサイドから決済代行会社にカード情報が送信され、そのトークンが発行される。トークンは一度限りのものなので、漏洩しても安全。このトークンをサーバーサイドに送信し、サーバーサイドから決済代行会社にトークンの送信がされることにより、資金決済がされる。
システム導入のために JavaScript のライブラリ( Ruby でいう Gem )を利用。
<script type="text/javascript" src="https://js.pay.jp/v1/">
</script>
をビューファイルに指定することでブラウザでアプリケーションを開いたときに、payjp.jsが読み込まれる。
その際、 turbolinks が作動しないように、
ビューファイル及び、
// require("turbolinks").start()
と記述する。
カード情報をPAY.JP側に送りトークン化するためには、pay.jsが提供するPayjp.createToken(card, callback)
というオブジェクトとメソッドを使用。
第一引数のcardは、PAY.JP側に送るカードの情報。
第二引数のcallbackには、PAY.JP側からトークンが送付された後に実行する処理。
上記オブジェクトとメソッドを使用し、app/javascript/card.jsにて
const tokenObj=`<input value=${token} name='token' type="hidden"> `;と
とトークンを取得するが、 hidden により非表示にする。
document.getElementById("order_number").removeAttribute("name"); document.getElementById("order_cvc").removeAttribute("name"); document.getElementById("order_exp_month").removeAttribute("name"); document.getElementById("order_exp_year").removeAttribute("name");
document.getElementById("charge-form").submit();
上記4行にてカード情報をサーバーサイドに送られないように消去。
最後の行でデータを送信。
toke モデルを使用できるように、 Order モデルに
attr_accessor :token
を追加することで token を定義づけすることができた。
決済機能を導入するために
gem 'payjp'
|
を追加し、 bundle install 。
コントローラーに
def create @order = Order.new(order_params) if @order.valid? Payjp.api_key = "sk_test_***********" # 自身のPAY.JPテスト秘密鍵を記述しましょう Payjp::Charge.create( amount: order_params[:price], # 商品の値段 card: order_params[:token], # カードトークン currency: 'jpy' # 通貨の種類(日本円) ) @order.save return redirect_to root_path else render 'index' end end
を記述し、決済できるようにするが、鍵の環境変数化をしなければならない。
ターミナルで
% vim ~/.zshrc
# iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。
export PAYJP_SECRET_KEY='sk_test_*************'
export PAYJP_PUBLIC_KEY='pk_test_*************'
# 編集が終わったらescキーを押してから:wqと入力して保存して終了
を実行し、代入(秘密鍵と公開鍵で方法が異なる)をすることで安全に利用できる。