PHP 实现身份证号实名认证功能

实名认证牵涉公安备案系统,需想公安机关申请接口进行验证。当然,调用其他已向公安机关申请了接口的第三方接口一样可行。否则,只能用身份证生成规则进行验证,不完全正确,身份证号和姓名也不匹配。如下:

/*/
# CopyRight: zxing
# Document: 检查符合 GB11643-1999 标准的身份证号码的正确性
# File:gb11643_1999.func.php Fri Mar 28 09:42:41 CST 2008 zxing
# Updated:Fri Mar 28 09:42:41 CST 2008
# Note: 调用函数 check_id();
#/*///
$id =array();
$id[] = '370882198601064774';
$id[] = '420502198611281126';
$id[] = '370882198601064770';
$id[] = '370882860106477';
$id[] = '63212519850703214x';
$id[] = '429021198203221006';
$id[] = '429036198203211023';
foreach ($id as $key => $value){
echo check_id($value)?$value.' 是真的!': $value.' 是假的!';
}
#/*/
/*/
# 函数功能:计算身份证号码中的检校码
# 函数名称:idcard_verify_number
# 参数表 :string $idcard_base 身份证号码的前十七位
# 返回值 :string 检校码
# 更新时间:Fri Mar 28 09:50:19 CST 2008
/*/
function idcard_verify_number($idcard_base){
if (strlen($idcard_base) != 17){
   return false;
}
    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); //debug 加权因子
    $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); //debug 校验码对应值
    $checksum = 0;
    for ($i = 0; $i < strlen($idcard_base); $i++){
        $checksum += substr($idcard_base, $i, 1) * $factor[$i];
    }
    $mod = $checksum % 11;
    $verify_number = $verify_number_list[$mod];
    return $verify_number;
}
/*/
# 函数功能:将15位身份证升级到18位
# 函数名称:idcard_15to18
# 参数表 :string $idcard 十五位身份证号码
# 返回值 :string
# 更新时间:Fri Mar 28 09:49:13 CST 2008
/*/
function idcard_15to18($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 . idcard_verify_number($idcard);
    return $idcard;
}
/*/
# 函数功能:18位身份证校验码有效性检查
# 函数名称:idcard_checksum18
# 参数表 :string $idcard 十八位身份证号码
# 返回值 :bool
# 更新时间:Fri Mar 28 09:48:36 CST 2008
/*/
function idcard_checksum18($idcard){
    if (strlen($idcard) != 18){ return false; }
    $idcard_base = substr($idcard, 0, 17);
    if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))){
        return false;
    }else{
        return true;
    }
}
/*/
# 函数功能:身份证号码检查接口函数
# 函数名称:check_id
# 参数表 :string $idcard 身份证号码
# 返回值 :bool 是否正确
# 更新时间:Fri Mar 28 09:47:43 CST 2008
/*/
function check_id($idcard) {
if(strlen($idcard) == 15 || strlen($idcard) == 18){
   if(strlen($idcard) == 15){
    $idcard = idcard_15to18($idcard);
   }
   if(idcard_checksum18($idcard)){
    return true;
   }else{
    return false;
   }
}else{
   return false;
}
}

网上很多关于实名认证的参考文章,多数用的是聚合数据的认证接口:https://www.juhe.cn/docs/api/id/103

参考文章:https://blog.csdn.net/maxianshi/article/details/80127610

而我今天要介绍的是阿里云的实名认证接口调用,优势在于:简单、快捷、实惠

接口申请地址:https://market.aliyun.com/products/56928004/cmapi014760.html?spm=5176.730005.0.0.aeWVBT


调用地址:http://idcard.market.alicloudapi.com/lianzhuo/idcard

请求方式:GET

返回类型:JSON

请求参数:

名称 类型 是否必须 描述
cardno STRING 必选 身份证号码
name STRING 必选 姓名
请求示例:
<?php
    $host = "http://idcard.market.alicloudapi.com";
    $path = "/lianzhuo/idcard";
    $method = "GET";
    $appcode = "你自己的AppCode";    //支付成功之后点击跳转至阿里云管控中心,可看到AppCode,如下图
    $headers = array();
    array_push($headers, "Authorization:APPCODE " . $appcode);
    $querys = "cardno=370703198111300338&name=%E9%83%AD%E5%BE%B7%E6%98%8C";
    $bodys = "";
    $url = $host . $path . "?" . $querys;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_FAILONERROR, false); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);    //此处设置返回头信息
    curl_setopt($curl, CURLOPT_HEADER, false);    //是否显示头信息,false为不显示
    if (1 == strpos("$".$host, "https://"))
    {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    $response = curl_exec( $curl );
  var_dump(curl_exec($curl));

  curl_close( $curl );
  $result_json = json_decode($response,true);
?>

返回示例:

{
  "resp": {
    "code": 0,
    "desc": "匹配"
  },
  "data": {
    "sex": "男",
    "address": "广东省清远市清新县",
    "birthday": "1989-05-25"
  }
}



猜你喜欢

转载自blog.csdn.net/u012717614/article/details/80566927