林中侠客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言
银行金卡,维萨和万事达、银联品牌,如果是贷记卡或准贷记卡,一定为16位卡号。而借记卡可以16-19位不等。
美国运通卡则不论金卡或是白金卡、普通卡,都是15位卡号。
16-19 位卡号校验位采用 Luhm 校验方法计算

银行卡的校验方式

Luhm校验

  1. 将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
  2. 将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
  3. 将加法和加上校验位能被 10 整除。
 1 <?php
 2 /*
 3   16-19 位卡号校验位采用 Luhm 校验方法计算:
 4     1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
 5     2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
 6     3,将加法和加上校验位能被 10 整除。
 7 */
 8 function luhm($s) {
 9     $n = 0;
10     for ($i = strlen($s); $i >= 1; $i--) {
11         $index=$i-1;
12         //偶数位
13         if ($i % 2==0) {
14             $n += $s{$index};
15         } else {//奇数位
16             $t = $s{$index} * 2;
17             if ($t > 9) {
18                 $t = (int)($t/10)+ $t%10;
19             }
20             $n += $t;
21         }
22     }
23     return ($n % 10) == 0;
24 }
25 
26 $r = luhm('6225881414207430');
27 var_dump($r);
28 ?>

 

posted on 2015-09-28 14:19  林中侠客  阅读(1064)  评论(0编辑  收藏  举报