WebPayのCheckoutHelperを使いこなす

## 更新のおしらせ

この記事ではCheckoutHelperのversion 1を利用しています。
現在ではより新しいバージョンを公開し、セキュリティ、設定の容易さ、UXの点で改善を行っています。

この記事のほか、[CheckoutHelperのドキュメント](https://webpay.jp/docs/checkout)も参考に、ぜひ最新のバージョンをご利用ください。

## CheckoutHelperの概要

初週だというのに早々に2度目の投稿です。明日胃カメラを飲む状況ですが、
WebPayのクライアントサイドでのカード番号のトークン化を実現するWebPay.jsのヘルパであるCheckoutHelperの機能を網羅していきたいと思います。
CheckoutHelperは
- [少しのコードでWebPayを導入する](http://qiita.com/hmsk/items/744f9a7e37638340a992)
でも触れましたが

``` 少しのコードでWebPayを導入する
CheckoutHelperは数行のHTMLを記述しておくだけで

クレジットカード番号、有効期限のバリデート
クレジットカードの有効性チェック
クレジットカード情報の代替トークン化

をWebPayと直接通信をユーザインタフェースを含め全て行ってくれるWebPay.jsのヘルパーです。
```

HTML中に

```checkout.html
<form action="/purchase" method="post">
  <script src="https://checkout.webpay.jp/v1/" class="webpay-button" data-key="test_public_bMj6ai5NZbYSbNraz51jkf7j"></script>
</form>
```

と書けば

![Screenshot 2013-12-06 00.00.09.png](https://qiita-image-store.s3.amazonaws.com/0/48/154d78d8-d1f5-36b1-5497-b5861f28fe01.png "Screenshot 2013-12-06 00.00.09.png")

のようなボタンが表示され、クリックすると

![Screenshot 2013-12-06 00.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/48/0ce12fc7-ca9b-869c-9b80-bca5f276df43.png "Screenshot 2013-12-06 00.01.21.png")


が表示され、ユーザがカード情報を入力すると、フォームの情報をバリデートの上、トークンを取得してフォームが送信されます。（このコードだと`/purchase`に`POST`リクエストですね）

余談ではありますが、CheckoutHelperの元のコードはCoffeeScript, Haml, Sassで書かれています。

## 設定可能なパラメータ

ただ貼れてトークンを送信してくれるというだけでは、少し融通が利かない面もあるため、いくつか`<script>`タグに`data-*`なパラメータを設定しておくことで挙動を操ることも出来るようになっています。

ちなみに、`data-key`はWebPayの公開可能鍵（トークンの生成にしか使えないキー）をセットしておく必要があります。

### data-text / data-submit-text

`data-text`や`data-submit-text`は、
クリックするとカード情報の入力フォームが表示されるボタンや、入力フォームの「カードで支払う」という文字列を変更することが出来ます。

カード情報を登録しておきたいだけで、今すぐ支払うわけじゃなかったり、具体的なことを伝えたかったりする場合にこれらのデフォルトで設定されているテキストが不自然な場合に任意のテキストへ置き換えることが可能です。

[初日のAdvent Calendarの例](https://webpay-sinatra-sample.herokuapp.com/)では、

- data-text => WEB+DB PRESS vol.76 を購入する
- data-submit-text' => 代金1554円をカードで支払う

というように何だかカード情報が何に使われるかわかるようになっていて安心してWEB+DB PRESS vol.76を購入出来そうな感じが醸されていました。

### data-token-name

`data-token-name`を使うと取得したトークンがセットされるhiddenなフィールドのパラメータ名を変更することが出来ます。デフォルトでは`webpay-token`となっていますが、これが微妙に気に入らない場合に変えることが出来ます。

例えば、フォームの送信先がRuby on Railsで、送られて来たパラメータをハンドルする場合にハイフンが好ましくない方もいるでしょう。
シンボル派にとって`params[:"webpay-token"]`は何とも辛い（個人の見解）です。

というような場面や、処理上パラメータ名を何らかの規則に合わせたい場合のために準備しています。

### data-partial

`data-partial`は、フォームを自動送信するかどうかを制御出来ます。
例えば、ユーザのプロフィール画面でクレジットカードの情報も編集出来るようなページを想定すると、
名前やメールアドレスなど、他の情報も支払い用のカード情報と一緒にフォームで入力を要求する場合に勝手に送信されてしまうと、ユーザに入力の順番を強制してしまうことになってしまいます。

それを防ぐ為に

```partialized_checkout.html
<form action="/purchase" method="post">
  <script src="https://checkout.webpay.jp/v1/" class="webpay-button" data-key="test_public_bMj6ai5NZbYSbNraz51jkf7j" data-partial="true"></script>
  <input type="text" name="other" value="他の情報" />
  <input type="submit" value="ユーザが送信するボタン" />
</form>
```

のように、`data-partial="true"`を与えることで、カード情報が入力され、トークンが取得されると、カード情報の入力ボタンが

![Screenshot 2013-12-06 00.06.59.png](https://qiita-image-store.s3.amazonaws.com/0/48/6138e3b3-3ecf-526b-4a84-0ce960fa4e6b.png "Screenshot 2013-12-06 00.06.59.png")

のように変わり、フォーム自体の送信は行われません。
これを再度クリックするとカード情報を再度入力することも可能です（hiddenフィールド上の値は新しいものが発行されるまで削除されません）

[動作確認用のサンプルをHerokuで動くようにしている](https://webpay-sinatra-sample.herokuapp.com/partial)のでお試しください

### data-previous-token

`data-previous-token`は既に取得しているトークンを再度埋め込み、カード情報を入力後である「✔ カード情報入力済み」にボタンが変更され、hiddenフィールドにトークンが入れられた状態を再現する為のパラメータです。
（`data-partial="true"`なことが前提です）

既にトークンは取得したが、送信先で何らかの問題があり再度フォームを表示する場合に、ユーザに財布に戻したばかりのクレジットカードを舌打ちと共に取り出させ、再度カード情報を入力させるのは酷な話です。エラーハンドリングの際には是非ご活用ください。

## おわりに

CheckoutHelperの今持てる機能の全てを紹介しました。最初にIE8で全く動かなかった時は涙ものでしたが、ここで紹介する機会に巡り会えて良かったです。

まだまだリリースしたばかりのCheckoutHelperですが、もっと開発者のニーズに合わせて柔軟に機能を持たせていきたいところです。ご使用の際は是非フィードバックを頂けますと幸いです。

渡すはずのバトンは今日も宙を舞いますが、キャッチされることを願って明日6日目へ託します。またお会いしましょう。