<?php
namespace app\common\service;
class CheckIDCardService
{
//验证身份证是否有效
public function validateIDCard($IDCard) {
$len = strlen($IDCard);
if($len != 18 && $len != 15) return false;
if($len == 15) $IDCard = $this -> convertIDCard15to18($IDCard);
return $this -> check18IDCard($IDCard);
}
//计算身份证的最后一位验证码,根据国家标准GB 11643-1999
private function calcIDCardCode($IDCardBody) {
if (strlen($IDCardBody) != 17) {
return false;
}
//加权因子
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
//校验码对应值
$code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$checksum = 0;
for ($i = 0; $i < strlen($IDCardBody); $i++) {
$checksum += substr($IDCardBody, $i, 1) * $factor[$i];
}
return $code[$checksum % 11];
}
// 将15位身份证升级到18位
private function convertIDCard15to18($IDCard) {
if (strlen($IDCard) != 15) {
return false;
} else {
// 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
if (array_search(substr($IDCard, 12, 3), array('996', '997', '998', '999')) !== false) {
$IDCard = substr($IDCard, 0, 6) . '18' . substr($IDCard, 6, 9);
} else {
$IDCard = substr($IDCard, 0, 6) . '19' . substr($IDCard, 6, 9);
}
}
$IDCard = $IDCard . $this -> calcIDCardCode($IDCard);
return $IDCard;
}
// 18位身份证校验码有效性检查
private function check18IDCard($IDCard) {
if (strlen($IDCard) != 18) {
return false;
}
$IDCardBody = substr($IDCard, 0, 17); //身份证主体
$IDCardCode = strtoupper(substr($IDCard, 17, 1)); //身份证最后一位的验证码
if ($this -> calcIDCardCode($IDCardBody) != $IDCardCode) {
return false;
} else {
return true;
}
}
}
php 验证身份证有效性
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...