配置(账号已注册认证前提下)

进入百度AI开放平台控制台登录,选择人脸识别-创建应用,获得API Key 和 Secret Key。

封装代码(TP框架为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
<?php

namespace app\common\logic;

class BaiduFace
{
private $secret = '';
private $appkey = '';
private $appid = '';
private $go_url = 'https://aip.baidubce.com';//访问地址

/**
* 刷新token
* @return \think\response\Json
*/
protected function refreshToken()
{
$param = [
'grant_type' => 'client_credentials',
'client_id' => $this->appkey,
'client_secret' => $this->secret,
];

$url = $this->go_url . '/oauth/2.0/token?' . http_build_query($param);

$o = '';
foreach ( $param as $k => $v )
{
$o.= "$k=" . urlencode( $v ). "&" ;
}
$param = substr($o,0,-1);

$result = $this->httpRequest($url, $param);

return $result;
}

/**
* 获取token (token有效期为30天,可用缓存储存,或者实时请求【这里暂时实时请求】)
* @return bool|mixed
*/
protected function getToken()
{
$res = $this->refreshToken();
$res = json_decode($res,true);
if (isset($res['access_token'])) {
return $res['access_token'];
}
return false;
}

/**
* 百度 实名认证
* 百度 公安验证 (收费)V3版本计费错误码:222350、222351、222354、222355
* @param $image 人脸照片
* @param $imageType 照片类型 URL 和 BASE64
* @param $idCardNumber 身份证号码
* @param $name 身份证的姓名
* @param quality_control 图片质量控制 NONE: 不进行控制 LOW:较低的质量要求 NORMAL: 一般的质量要求 HIGH: 较高的质量要求 默认 NONE
* @param liveness_control活体检测控制 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
* $param spoofing_control 合成图控制 NONE: 不进行控制 LOW:较低的合成图检测要求(高通过率 低攻击拒绝率) NORMAL: 一般的合成图检测要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
* @return bool|mixed
*/
public function realname($image,$imageType, $idCardNumber, $name,$options = array())
{
$token = $this->getToken();

$data = array();
$data['image'] = $image;
$data['image_type'] = $imageType;
$data['id_card_number'] = $idCardNumber;
$data['name'] = $name;
$data = array_merge($data, $options);

$url = $this->go_url . '/rest/2.0/face/v3/person/verify?access_token=' . $token;

$result = $this->request_post($url, json_encode($data));
return $result;
}

/**
* 百度 在线活体检测
* @param $image 检测的照片
* @param $imageType 照片类型 URL 和 BASE64
* @return bool|mixed
*/
public function imgcheck($image,$imageType)
{
$token = $this->getToken();
$param = [[
'image' => $image,
'image_type' => $imageType,
]];
$url = $this->go_url . '/rest/2.0/face/v3/faceverify?access_token=' . $token;
$result = $this->request_post($url, json_encode($param));
return $result;
}

/**
* 语音校验码接口
* @param int $min_code_length 生成的验证码最小长度 最大6 最小3 默认3 非必传
* @param int $max_code_length 生成的验证码最大长度 最大6 最小3 默认6 非必传
* @return bool|mixed
* @return session_id 语音校验码会话id,有效期5分钟,请提示用户在五分钟内完成全部操作
* @return code 语音验证码,数字形式,3~6位数字
*/
public function voiceCode()
{
$token = $this->getToken();
$param = [[
'min_code_length' => 3,
'max_code_length' => 6,
]];
$url = $this->go_url . '/rest/2.0/face/v1/faceliveness/sessioncode?access_token=' . $token;
$result = $this->request_post($url, json_encode($param));
return $result;
}

/**
* 视频活体检测接口
* @param string $video_base64 base64 编码的视频数据;建议视频大小控制在10M/1min以内
* @param string $session_id 会话ID (当此字段为空时,则跳过语音验证和唇语验证步骤)
* @param string $lip_identify 取值COMMON/STRICT/OFF, COMMON代表使用唇语识别,STRICT代表使用唇语识别并使用更加严格的策略判断是否通过 OFF代表关闭唇语识别,默认OFF
* @param string $face_field 需要使用合成图功能时, 此项传入spoofing
* @return bool|mixed
* @return session_id 语音校验码会话id,有效期5分钟,请提示用户在五分钟内完成全部操作
* @return code 语音验证码,数字形式,3~6位数字
*/
public function videocheck($video_base64,$session_id)
{
$token = $this->getToken();
$param = [[
'video_base64' => $video_base64,
'session_id' => $session_id,
'lip_identify' => 'COMMON',
'face_field' => 'spoofing',
]];
$url = $this->go_url . '/rest/2.0/face/v1/faceliveness/verify?access_token=' . $token;
$result = $this->request_post($url, json_encode($param));
return $result;
}

/**
* 图片base64转换
* @param $image_path //图片路径需要在服务器上,并在提前转换成绝对路径
* @return string
*/
private function base64EncodeImage($image_path) {
//判断服务器是否存在此人像照
if(!@fopen($data['personal_img'], 'r')) {
return false;
}
$base64_image = '';
$image_info = getimagesize($image_path);
$image_data = fread(fopen($image_path, 'r'), filesize(trim($image_path)));
app('log')->record('百度人脸识别base64照片:'.json_encode(filesize(trim($image_path))),'realauth');
$base64_image = chunk_split(base64_encode($image_data));
return $base64_image;
}

function httpRequest($url = '', $param = '') {
if (empty($url) || empty($param)) {
return false;
}

$postUrl = $url;
$curlPost = $param;
$curl = curl_init();//初始化curl
curl_setopt($curl, CURLOPT_URL,$postUrl);//抓取指定网页
curl_setopt($curl, CURLOPT_HEADER, 0);//设置header
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($curl, CURLOPT_POST, 1);//post提交方式
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($curl);//运行curl
curl_close($curl);

return $data;
}

function request_post($url = '', $param = '')
{
if (empty($url) || empty($param)) {
return false;
}

$postUrl = $url;
$curlPost = $param;
// 初始化curl
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $postUrl);
curl_setopt($curl, CURLOPT_HEADER, 0);
// 要求结果为字符串且输出到屏幕上
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// post提交方式
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 运行curl
$data = curl_exec($curl);
curl_close($curl);
$res = json_decode($data, true);
return $res;
}

function jcHttpDataPost($url, $data, $json_transfer = 1)
{
if ($json_transfer == 1) {
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
} else if ($json_transfer == 2) {
$data = urldecode(json_encode($data, JSON_UNESCAPED_UNICODE));
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$status = curl_exec($ch);
curl_close($ch);
$res = json_decode($status, true);
return $res;
}
#设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '0');
#禁止 cURL 验证对等证书(peer's certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, '0');

//======================================================== 错误码信息 =============================================
/**
* 百度人脸识别错误信息
* @param $code
* @return array|string
*/
public function faceErrorCode($code){
switch (isset($code)){
case $code === 0:
$res = ['code'=>200,'msg'=>'验证通过'];//是同一个人或者非同一个人,其后判断识别分数(推荐大于80)判为同一人
break;
case $code === 222350:
$res = ['code'=>500,'msg'=>'公安网图片不存在或质量过低,请重新上传'];
break;
case $code === 222351:
$res = ['code'=>500,'msg'=>'身份证号与姓名不匹配或该身份证号不存在,请重新上传'];
break;
case $code === 222352:
$res = ['code'=>500,'msg'=>'身份证名字格式错误,请重新上传'];
break;
case $code === 222353:
$res = ['code'=>500,'msg'=>'身份证号码格式错误,请重新上传'];
break;
case $code === 222354:
$res = ['code'=>500,'msg'=>'公安库里不存在此身份证号,请重新上传'];
break;
case $code === 222355:
$res = ['code'=>500,'msg'=>'身份证号码正确,公安库里没有对应的照片,请重新上传'];
break;
case $code === 222356:
$res = ['code'=>500,'msg'=>'验证的人脸图片质量不符合要求,请重新上传'];
break;
case $code === 222360:
$res = ['code'=>500,'msg'=>'身份证号码或名字非法(公安网校验不通过),请重新上传'];
break;
case $code === 222361:
$res = ['code'=>500,'msg'=>'公安服务连接失败,请重新上传'];
break;
case $code === 216600:
$res = ['code'=>500,'msg'=>'输入身份证格式错误,请重新上传'];
break;
case $code === 216601:
$res = ['code'=>500,'msg'=>'身份证号和名字匹配失败,请重新上传'];
break;
case $code === 222202:
$res = ['code'=>500,'msg'=>'图片中没有人脸'];
break;
case $code === 222203:
$res = ['code'=>500,'msg'=>'无法解析人脸'];
break;
case $code === 223113:
$res = ['code'=>500,'msg'=>'人脸有被遮挡'];
break;
case $code === 223114:
$res = ['code'=>500,'msg'=>'人脸模糊'];
break;
case $code === 223115:
$res = ['code'=>500,'msg'=>'人脸光照不好'];
break;
case $code === 223116:
$res = ['code'=>500,'msg'=>'人脸不完整'];
break;
case $code === 222304:
$res = ['code'=>500,'msg'=>'图片尺寸太大'];
break;
case $code === 222307:
$res = ['code'=>500,'msg'=>'请重新上传合法的图片'];//图片非法 鉴黄未通过
break;
case $code === 222308:
$res = ['code'=>500,'msg'=>'请重新上传合法的图片'];//图片非法 含有政治敏感人物
break;
case $code === 223129:
$res = ['code'=>500,'msg'=>'请使用面向正前方的人脸图片'];//人脸未面向正前方(人脸的角度信息大于30度)
break;
default:
$res = ['code'=>403,'msg'=>'其他错误'];
break;
}
return $res;
}
}