2004年8月 4日
Java | Struts CreditCard Validator
眠れなかったので、Struts用のCreditCardValidatorクラスを作ってみた。
Strutsの標準Validatorでもクレジットカード番号はチェックできるけど、日本で普及しているJCB、そしてお金持ちが使うDinersはサポートされていない。まずは、この二つのカード会社もサポートしたvalidateCreditCard()メソッドを作成。
このvalidateCreditCard()メソッドでは、カード番号しかチェックしない。例えば、ECサイトの決済フォームで、カード会社にVISAを指定して、JCBカードの番号を入力しても、その番号がJCBのものとして正しいければ(チェックデジットが正しければ)、Validatorをすり抜けてしまう。
まあ実際は、クレジットカードの与信にはカード番号と有効期限だけが必要だから、カード会社の指定なんて必要ないのだけど。それにこのValidatorでチェックできることは文法的に正しいカード番号かどうかだけで、本当に有効なカード番号かどうかはチェックできないしね。
そうは言っても、カード決済網にアクセスする前の段階で一度、カード会社名も含め入力されたカード情報の妥当性はチェックしておきたい。そこで作ってみたのが、validateCreditCardNumberWithType()メソッド。Javadocコメントは以下。
指定されたカード会社に対応する正しいクレジットカード番号かどうかをチェックします。
type変数にカード会社が指定されるプロパティ名をセットします。
例えば、カード会社名入力フィールドのプロパティ名が「cardType」で、カード番号入力フィールドのプロパティ名が「cardNumber」の場合、
validationルールは次のようになります。
<field property="cardNumber" depends="required,strictCreditCard">
<arg0 key="typeForm.cardNumber.displayname"/>
<var>
<var-name>type</var-name>
<var-value>cardType</var-value>
</var>
</field>typeで指定されたプロパティからカード会社名が取得できない場合、validationは失敗します。
対応しているカード会社と、typeで指定されたプロパティで使用できる値は次の通りです。
| カード会社 | 認識できる値 (大文字・小文字は問いません) |
|---|---|
| VISA | visa |
| Master Card | master または mastercard |
| JCB | jcb |
| アメリカンエクスプレス | amex |
| ダイナースクラブ | diners または dinersclub |
あとは有効期限のチェックメソッドを作らないと。これは月と年で二つにフィールドが分かれるとちょっと面倒だけど、ルールそのものは今日の年月より後かどうかだけなのでシンプル。