学习身份证图像识别
前言: 实名认证是互联网的大趋势.越来越多的地方需要用户实名认证了.我目前所在的公司网站也有这个需求.可是公司之前一直使用的是人工后台审核.这样做有几个不好的地方 绝大多数用户还是会上传真实有效的身份信息,所以审查结果往往都是通过 用户在上传后认证需要等待,可是等待的过程往往就是失去用户的过程. 加大了我们网站工作人员的工作量,不利于后期发展 通过分析这些问题.我决定使用百度的人工智能提供的接口,来完成智能实名认证. 目录: 申请应用 获取accessToken 调用识别接口,获取数据 对比数据 业务逻辑介绍 1. 申请应用 image.png 在百度云的控制台中找到,人工智能部分,选择你需要的服务 image.png 然后创建你需要的应用,创建好了就可以获得app_key 和app_secret(好像不叫这个名字,不过是什么东西.大家都懂) 看到这两个熟悉的东西.大家一定会想到第三方登录是吧.没错这里的应用也是基于Oauth2.0协议.比较关注我的朋友应该看过,我之前写的关于第三方登录的博客.这里就过多介绍原理了.直接讲用法 2. 获取access_token 拿到app_key和app_secret这两个参数之后,我们就可以来获取access_token了. 和其他Oauth2.0协议的应用相同,都是用curl的方式去请求这个token class BaiduAiController extends Controller { //公共的成员变量 public $accessToken; /** * 在类成员变量中没有accessToken,或者accessToken过期则调这个方法 */ public function getAccessToken() { //获取配置参数 $config=C('BAIDUAI'); //百度ai的token请求地址 $url='https://aip.baidubce.com/oauth/2.0/token'; $post_data = []; //这个是参数是固定写法 $post_data['grant_type'] = 'client_credentials'; //依次填入我们在配置中设置好的参数 $post_data['client_id'] = $config['app_id']; $post_data['client_secret'] = $config['app_secret']; //调用公共的curl方法,第一个参数是url,第二个参数是请求类型,第三个参数是携带的数据 $result=http($url,'POST',$post_data); //状态无误 if ($result[0]==200) { //将返回的json数据转换为数组,并取出token存入类成员变量中 $this->accessToken=json_decode($result[1],true)['access_token']; //返回token return $this->accessToken; } } } 我将获取token单独写了一个控制器,其实也可以不用写,看个人习惯.通过这个方法,我们就能获取到token,用于我们调用其它接口 3.调用识别身份证照片的接口 百度身份证识别可以识别身份证的正面,背面上面的文字.也就是说可以获取到用户的姓名,性别,生日,住址,身份证号,发证机关,有效期. 调用接口,需要传入的数据有 base64加密后的二进制的图片流 //没懂没关系,我们看代码 //获取图片的2进制流$imgUrl是图片的url $img = file_get_contents($imgUrl); //将字符串进行base64加密 $img = base64_encode($img); 传入图片的正面或则背面的信息 其实就是你要检测正面就传入正面参数,背面就传入背面参数 当前还有更多更高级的应用,需要传入其他数据.由于本次应用没有用到,就不展开了说了 image.png 下面看完整的代码 /** * 调用身份证识别接口,返回识别后的数据 * @param $imgUrl * @return array */ private function checkID($imgUrl) { //实例化baiduai控制器对象 $baiduObj = new BaiduAiController(); //获取到accesstoken $accessToken = isset($baiduObj->accessToken) ? $baiduObj->accessToken : $baiduObj->getAccessToken(); $url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=' . $accessToken; //获取图片的2进制流$imgUrl是图片的url $img = file_get_contents($imgUrl); //将字符串进行base64加密 $img = base64_encode($img); $bodys = array( //这个代表的是,识别身份证的正面 'id_card_side' => 'front', "image" => $img ); //使用curl方法 获取接口返回的数据 $res = http($url, 'POST', $bodys); //访问状态没问题 if ($res[0] == 200) { //access过期 if (isset($res[1]['error_code'])==11) { //重新赋值,递归,返回数据 $baiduObj->accessToken=null; return $this->checkID($imgUrl); } //将返回的数据,转换为数组 $res = json_decode($res[1], true); //提取数组中的身份证号码 $ID = $res['words_result']['公民身份号码']['words']; //提取数组中的姓名 $realname = $res['words_result']['姓名']['words']; $result = []; //在两个数据都识别出的情况下,存入返回数组 if (isset($ID) && isset($realname)) { $result['status'] = 1; $result['ID'] = $ID; $result['realname'] = $realname; } else { //没有获取到完整数据,返回状态码 $result['status'] = 0; } //返回数据 return $result; } } 下面是返回数据的示例,每个参数的定义,欢迎查看官方手册 { "log_id": 2648325511,//唯一id,方便定位错误 "direction": 0, "image_status": "normal", "idcard_type": "normal", "edit_tool": "Adobe Photoshop CS3 Windows", "words_result": { "住址": { "location": { "left": 267, "top": 453, "width": 459, "height": 99 }, "words": "南京市江宁区弘景大道3889号" }, "公民身份号码": { "location": { "left": 443, "top": 681, "width": 589, "height": 45 }, "words": "330881199904173914" }, "出生": { "location": { "left": 270, "top": 355, "width": 357, "height": 45 }, "words": "19990417" }, "姓名": { "location": { "left": 267, "top": 176, "width": 152, "height": 50 }, "words": "伍云龙" }, "性别": { "location": { "left": 269, "top": 262, "width": 33, "height": 52 }, "words": "男" }, "民族": { "location": { "left": 492, "top": 279, "width": 30, "height": 37 }, "words": "汉" } }, "words_result_num": 6 } 4. 对比识别出的数据和 用户的输入的数据是否一致 这个就太简单了 就不过多介绍了 /** * 对比识别出的数据,和用户填写的数据是否一致 * @param $idData * @param $userData * @return bool */ private function comparisonID($idData, $userData) { if ($idData['realname'] == $userData['realname'] && $idData['ID'] == $userData['ID']) { return true; } else { return false; } } 注意,返回的数据,并不只有身份证号和姓名.大家可以按照自己的需求来获取数据.还有就是那个acess_token过期部分,并没有验证.希望大神指正 5.下面介绍下我所经手的网站的业务流程 自动认证身份证.png 注意:这个接口并非免费使用,每日免费500次调用.对于我现在所经手的网站那是搓搓有余了.具体价格感兴趣的朋友的到官网了解 好了,本次身份证图像识别的介绍了就写到这里了,如果有什么地方不对,希望大神指正.谢谢