前言:
实名认证是互联网的大趋势.越来越多的地方需要用户实名认证了.我目前所在的公司网站也有这个需求.可是公司之前一直使用的是人工后台审核.这样做有几个不好的地方
- 绝大多数用户还是会上传真实有效的身份信息,所以审查结果往往都是通过
- 用户在上传后认证需要等待,可是等待的过程往往就是失去用户的过程.
- 加大了我们网站工作人员的工作量,不利于后期发展
通过分析这些问题.我决定使用百度的人工智能提供的接口,来完成智能实名认证.
目录:
- 申请应用
- 获取accessToken
- 调用识别接口,获取数据
- 对比数据
- 业务逻辑介绍
1. 申请应用
在百度云的控制台中找到,人工智能部分,选择你需要的服务
然后创建你需要的应用,创建好了就可以获得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);
- 传入图片的正面或则背面的信息
其实就是你要检测正面就传入正面参数,背面就传入背面参数
当前还有更多更高级的应用,需要传入其他数据.由于本次应用没有用到,就不展开了说了
下面看完整的代码
/**
* 调用身份证识别接口,返回识别后的数据
* @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.下面介绍下我所经手的网站的业务流程
注意:这个接口并非免费使用,每日免费500次调用.对于我现在所经手的网站那是搓搓有余了.具体价格感兴趣的朋友的到官网了解
好了,本次身份证图像识别的介绍了就写到这里了,如果有什么地方不对,希望大神指正.谢谢