WebPayをRailsから利用するサンプルアプリケーション、WebPay Closetを配布しています

WebPayはわかりやすいAPI、各言語のライブラリを提供するなどして、開発者の皆様が簡単にペイメント機能を実装できるように努力してきました。 その一環として、実際にWebPayを利用する簡単なRailsアプリケーションを、WebPay Closetの名前で公開しています。

WebPay ClosetはWebPayが推奨するアプリケーションの構築方法を、実際のコードで示したものです。具体的には

  • CheckoutHelperを利用した直接カード番号を取り扱わないサーバサイドプログラミング
  • 顧客オブジェクトによる、カード番号を入力する手間の削減
  • 定期課金機能の利用
  • テスト環境とテスト用カード番号による開発・ステージ環境での動作チェック
  • WebPayのサーバとの通信をおこなわない自動テスト

の要素を盛り込んでいます。

WebPay Closetで実際にWebPayのテスト環境を利用して稼動しているアプリケーションを試すことができます。 試す場合にはテスト用のクレジットカード番号を使用することを推奨しています。

WebPay Closetはすべてのソースを公開しており、github:webpay/webpay_closetから参照、取得できます。 課金機能の利用はもちろんのこと、CheckoutHelperによる安全で簡単なカード番号のとりあつかい、顧客オブジェクトによる複数回の課金手続の簡易化などを実際にどう利用するか、Railsのコードとして確認できます。

商品購入のフォームは次のようになっています。住所、名前を入力したあとにCheckoutHelperを利用してカード情報を入力し、WebPayから取得したトークン情報をbuy_item_pathにPOSTする構成になっています。 CheckoutHelperを利用することで、サーバでカード情報を扱わなくて済むのみならず、素敵なデザインのカード情報入力フォームをワンラインでつかえます。

1
2
3
4
5
6
7
8
9
10
11
= form_tag buy_item_path(@item), html: { role: 'form' } do
  .form-group
    = label_tag 'address'
    %br
    = text_field_tag 'address', '', class: 'form-control'
  .form-group
    = label_tag 'name'
    %br
    = text_field_tag 'name', '', class: 'form-control'
  .form-group
    %script{'src' => 'https://checkout.webpay.jp/v1/', 'class' => 'webpay-button', 'data-key' => Rails.application.config.webpay_public_key, 'data-text' => 'カード情報を入力して購入'}

https://github.com/webpay/webpay_closet/blob/master/app/views/items/payment.html.haml

顧客の管理は著名なdevise gemを拡張して利用しています。

deviseのRegistrationsControllerを拡張し、登録時と情報更新時にCustomer#update_webpay_customer_idメソッドを呼び出します。 このメソッドの中では次のようにWebPayにある対応する顧客オブジェクトを作成・更新しています。

1
2
3
4
5
6
7
8
9
10
if self.webpay_customer_id
  req = { id: self.webpay_customer_id }
  req[:card] = self.webpay_token if webpay_token.present?
  req[:email] = self.email if self.email
  req[:description] = self.name if self.name
  webpay.customer.update(req)
else
  created = webpay.customer.create(card: webpay_token, email: self.email, description: self.name)
  update_attributes(webpay_customer_id: created.id)
end

https://github.com/webpay/webpay_closet/blob/master/app/models/customer.rb

ここでもトークンを利用してカード情報を適切に取り扱っています。

また、テストをモデルレベル、コントローラレベルで記述しています。 WebPayの提供しているテスト環境はステージング環境や開発時のわかりにくい動作の確認のために利用することを想定しており、自動テストから利用することは非推奨となっています。 WebPay ClosetではHTTPリクエストをモックすることでWebPayとの通信をおこなわずにテストを実行する例を提供しています。

たとえば上述の顧客の登録部分のテストは次のようになります。

1
2
3
4
5
6
7
it 'should create customer with webpay_token' do
  token_id = 'tok_XXXXXXXXX'
  params = { card: token_id, email: basic_params[:email], description: basic_params[:name] }
  dummy_response = webpay_stub(:customers, :create, params: params)
  expect { post :create, customer: basic_params.merge('webpay_token' => token_id) }.to change(Customer, :count).by(1)
  expect(Customer.last.webpay_customer_id).to eq dummy_response['id']
end

https://github.com/webpay/webpay_closet/blob/master/spec/controllers/customers/registrations_controller_spec.rb

webpay_stubWebPay::Mock gemの提供するメソッドです。 このgemは指定したパラメータに相当するレスポンスを返すよう、自動的にHTTPリクエストをモックします。

WebPayを利用したアプリケーションのテストにお悩み場合はぜひWebPay Closetのテストコードを参考にしてください。

この記事ではWebPay Closetを紹介しました。 Ruby、Rails開発者の皆様にWebPayをより身近に感じてもらえれば幸いです。