国内身份证分为15位和18位,并且有百岁老人的996,997,998,999的特殊身份号
首先我们要把15位转为18位身份证号码
if (strlen($id) != 15) {
return $id;
} else {
// 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
if (array_search(substr($id, 12, 3), ['996', '997', '998', '999']) !== false) {
$id = substr($id, 0, 6) . '18' . substr($id, 6, 9);
} else {
$id = substr($id, 0, 6) . '19' . substr($id, 6, 9);
}
}
$id = $id . MethodIdCardVerifyNumber($id);
}
转换后是个17位的号码,然后我们需要根据17位号码根据国家标准GB 11643-1999生成最后一位因子
function MethodIdCardVerifyNumber($idbase) {
if (strlen($idbase) != 17) {
return false;
}
//加权因子
$factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
//校验码对应值
$verify_number_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
$checksum = 0;
for ($i = 0; $i < strlen($idbase); $i++) {
$checksum += substr($idbase, $i, 1) * $factor[$i];
}
$mod = $checksum % 11;
return $verify_number_list[$mod];
}
这样就会得到一个15位到18位的正确号码
然后分析
前2位代表省份
$province = array("11"=>"北京市","12"=>"天津市","13"=>"河北省","14"=>"山西省","15"=>"内蒙古自治区","21"=>"辽宁省","22"=>"吉林省","23"=>"黑龙江省","31"=>"上海市","32"=>"江苏省","33"=>"浙江省","34"=>"安徽省","35"=>"福建省","36"=>"江西省","37"=>"山东省","41"=>"河南省","42"=>"湖北省","43"=>"湖南省","44"=>"广东省","45"=>"广西壮族自治区","46"=>"海南省","50"=>"重庆市","51"=>"四川省","52"=>"贵州省","53"=>"云南省","54"=>"西藏自治区","61"=>"陕西省","62"=>"甘肃省","63"=>"青海省","64"=>"宁夏回族自治区","65"=>"新疆维吾尔自治区","71"=>"台湾省","81"=>"香港特别行政区","82"=>"澳门特别行政区","91"=>"国外");
前6位代表市县
$area = array("110000"=>"北京市","110101"=>"东城区","110102"=>"西城区",......太长了就不写了,可以去国家统计局网站下载
第7位开始往后8位代表出生年月日
第17位为性别,偶数=女,偶数=男
第18位上面说过是验证因子包含0-9和X
$check_code = substr($idcode, 17, 1);
// 计算权重因子
$weight_factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
// 计算校验码对应值
$check_codes = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
// 计算身份证号码前17位权重因子乘积和
$sum = 0;
for ($i = 0;$i < 17; $i++) {
$sum += substr($idcode, $i, 1) *$weight_factor[$i]; }
// 计算校验码
$check_code_result =$check_codes[$sum % 11];
// 判断校验码是否正确
if ($check_code !=$check_code_result) {
$data['code'] =0;
$data['msg'] = "身份证核验失败";
}else{
$data['msg'] = "身份证核验正确";
}
至此身份号验证程序完成
如果不会写,可以下载写好的
- THE END -
最后修改:2024年7月7日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.467664.com/view/41.html
共有 0 条评论