php身份证号解析认证本地版,验证身份证号码是否正确

laoniu 2024-7-7 106 7/7

国内身份证分为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'] = "身份证核验正确";
    }

至此身份号验证程序完成

如果不会写,可以下载写好的

 

 

资源下载此资源仅限注册用户下载,请先
客服QQ:467664
- THE END -
最后修改:2024年7月7日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论