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; } }
|