少しのRubyのコードでWebPayを導入する

本記事は少しのコードでWebPayを導入する - Qiitaの再録です。 Qiitaの方はWebPay Advent Calendar 2013のものであるため当時の状態を維持し こちらの記事では最新の情報に合わせて加筆、編集を加えております。

決済のコードを出来るだけ少なく

ウェブサービスのコードの中で決済に関わる部分に対する開発者の不安を拭うことはとても難しいです。ソフトウェアとして動くというのは勿論、ビジネス上の条件との整合性や 決済に限った話ではないですが、お金を払うお客さんという登場人物が増えるだけで「何か問題があったら…」と膨らむ緊張感は小さくありません。

テストを書くとかプライシングの責任者とのコミュニケーションを密にとか大事なことはいくらでもあるのですが、その中に「決済にまつわるコードを少なくする」というのもあっても良いかもしれません。シンプルで短いコードで無為なミスや変な勘違いの種を出来る限り排除出来るのではないでしょうか。

WebPayでは、APIの仕様をはじめ各言語向けのライブラリを公開しているため、それを利用すれば簡単な記述ですぐに決済を行う処理を記述できそうです。

SinatraアプリでWebPayを使う

今回は、トップページにあるボタンを押したらすぐに商品の購入が行えるようなGumroadのようなウェブアプリケーションをRuby向けのウェブアプリケーションフレームワーク、Sinatraを使って作ってみます。

利用するGemは次の通りです。私はhamlがとても好きです。

1
2
3
gem 'sinatra'
gem 'haml'
gem 'webpay'

実装

  • ’/‘で購入情報を入力して、’/purchase'にpost
  • ’/purchase'でWebPayを利用した課金処理と結果出力

を実現するSinatraアプリケーションをざっと書くとこんな感じでしょうか。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require 'bundler'
Bundler.require

webpay = WebPay.new('test_secret_eHn4TTgsGguBcW764a2KA8Yd')
WEBPAY_PUBLIC_KEY = 'test_public_19DdUs78k2lV8PO8ZCaYX3JT'
WEBDB_PRESS_PRICE = 1554

set :haml, format: :html5

get '/' do
  haml :index
end

post '/purchase' do
  begin
    @charge = webpay.charge.create(currency: 'jpy', amount: WEBDB_PRESS_PRICE, card: params['webpay-token'])
    haml :purchased
  rescue => e
    redirect to('/')
  end
end

WebPayでの課金の発生方法(on Ruby)についてはこちらをご参照ください。

これに加えてカード情報を入力して送信するためのviewであるindex.hamlで、CheckoutHelperを利用します。

CheckoutHelperは数行のHTMLを記述しておくだけで

  • クレジットカード情報のバリデート
  • クレジットカードの有効性チェック
  • 利用可能なカード種類の判別
  • クレジットカード情報の代替トークン化

をWebPayと直接通信をユーザインタフェースを含め全て行ってくれるWebPay.jsのヘルパーです。使い方については公式のドキュメントに譲ります。

1
2
%form{ action: '/purchase', method: 'post' }
  %script{ src: 'https://checkout.webpay.jp/v2/', class: 'webpay-button', :'data-text' => 'WEB+DB PRESS vol.76 を購入する', :'data-submit-text' => '代金1554円をカードで支払う', :'data-key' => WEBPAY_PUBLIC_KEY, :'data-lang' => 'ja' }

これらのコードは https://github.com/hmsk/webpay-sinatra-sample でも公開しています。すぐにお手元でお試しの際は

1
2
3
4
$ git clone git@github.com:hmsk/webpay-sinatra-sample.git
$ cd webpay-sinatra-sample
$ bundle install
$ bundle exec ruby app.rb

の上で http://localhost:4567 をブラウザで開いてみてください。バックナンバーではありますが WEB+DB PRESS vol.76 の想像購入をお手元で楽しめます。ご自身のアカウントのテスト環境を利用したいということでしたら、公開可能鍵(test_public_***)、非公開鍵(test_secret_***)を適宜書き換えてください。

このアプリケーションをHerokuでも触れるように公開しておきました。是非お試しください。

ちなみに、お試しする際のカード情報として、 番号はこの世に実在しても良さそうなもの(Luhnのチェックサムが通る)、未来にあたる有効期限、半角英字の名前、任意の数字3,4桁のCVCが揃っていれば、WebPayのテスト環境上で利用可能です。 カード番号にはテスト用のカード情報を入力すると良いでしょう。

ここまで10分もかかっていませんし、正味30行そこそこといったところでしょうか。それなりに短いコードで決済のロジックを含めてGumloadっぽいウェブアプリケーションになりました。

haml :purchasedにあたるviewもそうですが、あとはよしなに見映えや補助的なページ、例外ハンドリング等を加えていけばすぐに何かを売る事が出来そうです。