PAY.JPはREST APIを使ってクレジットカード決済ができるサービスです。
多数のプログラミング言語(Ruby/Java/PHP/Python/Perl/Go/Swift/Node.js)などに対してSDKを提供しています。
そんなPAY.JPのごくごく基本的なコードをRubyで書いてみます。
インストール
まずSDKをインストールします。 gem
コマンドまたはGemfileを使います。ライブラリはGitHubにて公開されています(ライセンスはMIT Licenseです)。
$ gem install payjp
インストールが終わったらRubyスクリプト(今回は test.rb としています)で読み込みます。
require 'payjp'
APIキーの取得
PAY.JPでユーザ登録して、ダッシュボードに入ると設定の中にAPIキー情報があります。
今回はデモなのでテスト秘密鍵を使います。これを api_key として使います。
api_key = 'YOUR_API_KEY'
初期化
APIキーを使ってPayjpクラスを初期化します。
Payjp.api_key = api_key
カードトークンの取得
ここで処理の流れを紹介します。PAY.JPではクレジットカード番号を一旦トークン化し、そのトークンを使って決済処理を行います。通常、このトークンはテンポラリトークン(一回しか使えない有効期限付きトークン)ですが、顧客と紐付けを行うことで繰り返し使えるようになります。
このトークンの仕組みでは、クレジットカード番号自体、サービスサイト側で触らないようにするJavaScriptの仕組みを用意しております。トークンだけがサーバに送られるようになります。シーケンス図にすると次のようになります。
本記事ではこちらを使った実装を紹介します。カード番号はテストカード | PAY.JPよりピックアップしています。CVC(セキュリティコード)や有効期限は適当です。
まずHTMLのフォームに対して script タグを追加します。 YOUR_PUBLIC_KEY
には公開鍵を指定してください。
<form action="/pay" method="post"> <!-- 注文情報などの情報ここから --> : <!-- 注文情報などの情報ここまで --> <script src="https://checkout.pay.jp/" class="payjp-button" data-key="YOUR_PUBLIC_KEY"></script> </form>
そしてボタンを押すとクレジットカード番号を入力するモーダルウィンドウが表示されます。
入力を完了すると、元々のフォームの送信先である /pay
に対して payjp-token
という名前でテンポラリトークンが送信されます。
決済処理の実行
続いてこの取得したトークンを使って決済処理を行います。これは簡単で、金額とトークンを渡すだけです。
charge = Payjp::Charge.create( :amount => 3500, :card => payjp_token, // 先ほど送られてきたテンポラリトークン :currency => 'jpy', )
結果は次のように返ってきます。
{ "id": "ch_feb4b38692995e28859c5d0c21004", "amount": 5000, "amount_refunded": 0, "captured": true, "captured_at": 1508198383, "card": { /*(トークン取得時のカード情報と同じ) */ }, "created": 1508198383, "currency": "jpy", "customer": null, "description": null, "expired_at": null, "failure_code": null, "failure_message": null, "livemode": false, "metadata": {}, "object": "charge", "paid": true, "refund_reason": null, "refunded": false, "subscription": null }
このレスポンスの id を使うとダッシュボードで該当する取引を探せます。
こんな感じでごく簡単に実装できます。なお、PAY.JPではクレジットカード情報をサーバから送信してトークン化することもできますが、その方式では経産省が2018年3月までにPCIDSSへ対応しなければならないと決定しており、PAY.JPでも非推奨の実装方法としております(via カード情報非保持化対応のお願い - PAY.JP Announcement)。これから実装される場合にはJavaScriptでトークンを生成する方法を採用いただくようご留意ください。