hibikousinnkibouのブログ

駆け出しプログラマーによる足跡ブログ

PAY.JPについて

PAY.JPはクレジット決済代行会社の一つ。(その他 paypal 等)

<クレジットカード決済代行サービス導入のメリット>

 ・カード会社ごとの個別対応不要。(visa,jcb,アメックス等)

 ・セキュリティ対策を講じなくても安全に運用できる。

 

セキュリティ面においては、クライアントサイドから決済代行会社にカード情報が送信され、そのトークンが発行される。トークンは一度限りのものなので、漏洩しても安全。このトークンをサーバーサイドに送信し、サーバーサイドから決済代行会社にトークンの送信がされることにより、資金決済がされる。

 

システム導入のために JavaScript のライブラリ( Ruby でいう Gem )を利用。

<script type="text/javascript" src="https://js.pay.jp/v1/">
</script>

をビューファイルに指定することでブラウザでアプリケーションを開いたときに、payjp.jsが読み込まれる。

その際、 turbolinks が作動しないように、

ビューファイル及び、

app/javascript/packs/application.js にて
// 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と入力して保存して終了

を実行し、代入(秘密鍵と公開鍵で方法が異なる)をすることで安全に利用できる。