ごく基本的なPAY.JPの使い方(Ruby編)

PAY.JPはREST APIを使ってクレジットカード決済ができるサービスです。

f:id:goofmint:20171108144034p:plain

PAY.JP - クレジットカード決済サービス

多数のプログラミング言語(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キー情報があります。

f:id:goofmint:20171108144053p:plain

今回はデモなのでテスト秘密鍵を使います。これを api_key として使います。

api_key = 'YOUR_API_KEY'

初期化

APIキーを使ってPayjpクラスを初期化します。

Payjp.api_key = api_key

カードトークンの取得

ここで処理の流れを紹介します。PAY.JPではクレジットカード番号を一旦トークン化し、そのトークンを使って決済処理を行います。通常、このトークンはテンポラリトークン(一回しか使えない有効期限付きトークン)ですが、顧客と紐付けを行うことで繰り返し使えるようになります。

このトークンの仕組みでは、クレジットカード番号自体、サービスサイト側で触らないようにするJavaScriptの仕組みを用意しております。トークンだけがサーバに送られるようになります。シーケンス図にすると次のようになります。

f:id:goofmint:20171108144122p:plain

本記事ではこちらを使った実装を紹介します。カード番号はテストカード | 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 を使うとダッシュボードで該当する取引を探せます。

f:id:goofmint:20171108144137p:plain


こんな感じでごく簡単に実装できます。なお、PAY.JPではクレジットカード情報をサーバから送信してトークン化することもできますが、その方式では経産省が2018年3月までにPCIDSSへ対応しなければならないと決定しており、PAY.JPでも非推奨の実装方法としております(via カード情報非保持化対応のお願い - PAY.JP Announcement)。これから実装される場合にはJavaScriptでトークンを生成する方法を採用いただくようご留意ください。