決済を扱うシステムで、クレジットカードを扱うことがあるけど、カードの有効性チェックは
どの会社も、数円/1件とかで処理料がかかってしまう。
なので、ユーザーが入力したクレジットカード番号を、そのまま連携先の決済会社に
オーソリ ( 有効性チェック ) を流してしまうと、デタラメな (あるいは入力ミスした)番号分、
余計に処理料がかかるので、カード番号のチェックを入れたかったので、チェックした。
これで不正な番号は防げる!
ただし、有効期限切れとか、カードが停止してるとかは決済会社にオーソリ投げないとわからないので、
あくまでも、変なカード番号分の処理料を減らすためだけ。
クレジットカード番号は、Luhnアルゴリズムというチェックサム方式を利用しているので、
そのロジックを ruby でちぇっくするだけ。
これを使って無駄なお金を使わないようにしよう!
サンプルソース
def valid_credit_card_number?(card_number)
return false if card_number.blank?
even = false
sum = card_number.reverse.split(//).inject(0) do |s, d|
d = d.to_i
if even
d = d * 2
s -= 9 if d > 9
end
even = !even
s + d
end
sum % 10 == 0
end
ちなみに、@jnchito さんから教えていただきましたが、
自前でやらなくても、Gem があるみたいです。
かなりのスグレモノで、上記のクレジットカード番号のチェックだけでなく、カード番号からカード会社まで判別してくれます。
しかも CLI までついちゃってます。
DBにカード番号を登録するときに、一緒にカード会社も入れてたら後から使えるかも。
※ ただし、カードの仕向け先 ( 実際に決済処理を行う会社 ) は別なので注意
@jnchito さん、ありがとうございます。
参考URL
http://blog.panicblanket.com/archives/821
http://ja.wikipedia.org/wiki/Luhn%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
http://www.gizmodo.jp/2011/01/post_8367.html
テスト用のカード番号は下記で
http://www.webcreatorbox.com/tech/creditcard-test-numbers/