2025-08-01 11:39:06 +08:00

246 lines
8.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace addons\cardocr\library;
use fast\Http;
use think\Config;
use think\addons\Controller;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Ocr\V20181119\OcrClient;
use TencentCloud\Ocr\V20181119\Models\IDCardOCRRequest;
use TencentCloud\Faceid\V20180301\FaceidClient;
use TencentCloud\Faceid\V20180301\Models\IdCardOCRVerificationRequest;
use think\Session;
use app\common\model\User;
use think\Exception;
class Card
{
/**
* @param string $idnum 身份证id
* @param string $name 姓名
* @param string $ImageBase64 身份证正面base64
* @param string $ImageUrl 身份证正面绝对url,必须公网可访问的
* @return array|mixed
*/
public static function checkidcard($idnum="", $name="", $ImageBase64 = "", $ImageUrl = "")
{
$card_config = get_addon_config('cardocr');
$secretId = $card_config['secretid'];
$secretKey = $card_config['secretkey'];
$endpoint = $card_config['endpoint'];
$region = $card_config['region'];
try {
$data = array();
$data["IdCard"] = $idnum;
$data['Name'] = $name;
$data['ImageBase64'] = $ImageBase64;
$data['ImageUrl'] = $ImageUrl;
$cred = new Credential($secretId, $secretKey);
$httpProfile = new HttpProfile();
$httpProfile->setEndpoint($endpoint);
$clientProfile = new ClientProfile();
$clientProfile->setHttpProfile($httpProfile);
$client = new FaceidClient($cred, $region, $clientProfile);
$req = new IdCardOCRVerificationRequest();
$params = json_encode($data);
$req->fromJsonString($params);
$resp = $client->IdCardOCRVerification($req);
$params_data = json_decode($resp->toJsonString(), true);
return $params_data;
// var_dump( json_decode($resp->toJsonString(), true));
// print_r($resp->toJsonString());
} catch (TencentCloudSDKException $e) {
return array("code" => $e->getErrorCode(), "msg" => $e->getMessage(), "data" => "");
}
}
/**
* @param json $params ImageBase64格式
* @param string $status|'FRONT','BACK' 识别身份证正反
* @return array|mixed
*/
public static function checkcardocr($params, $status = 'FRONT')
{
$card_config = get_addon_config('cardocr');
$secretId = $card_config['secretid'];
$secretKey = $card_config['secretkey'];
$endpoint = $card_config['endpoint_ocr'];
$region = $card_config['region'];
$cardside['FRONT'] = "身份证正面";
$cardside['BACK'] = "身份证反面";
try {
$cred = new Credential($secretId, $secretKey);
$httpProfile = new HttpProfile();
$httpProfile->setEndpoint($endpoint);
$clientProfile = new ClientProfile();
$clientProfile->setHttpProfile($httpProfile);
$client = new OcrClient($cred, $region, $clientProfile);
$req = new IDCardOCRRequest();
$req->fromJsonString($params);
$resp = $client->IDCardOCR($req);
$params_data = json_decode($resp->toJsonString(), true);
// var_dump($params_data);
return $params_data;
} catch (TencentCloudSDKException $e) {
return array("code" => $e->getErrorCode(), "msg" => $cardside[$status] . $e->getMessage(), "data" => "");
}
}
/**
* @param $image_file 图片url绝对地址
* @return array|string
*/
public static function base64EncodeImage($image_file)
{
try {
$base64_image=self::geturlbase64($image_file, 2);
return !empty($base64_image['data']) ?$base64_image['data']:"";
} catch (Exception $exception) {
return array("code" => 0, "msg" => $exception->getMessage());
}
}
/**
* 将一个字符串部分字符用$re替代隐藏
* @param string $string 待处理的字符串
* @param int $start 规定在字符串的何处开始,
* 正数 - 在字符串的指定位置开始
* 负数 - 在从字符串结尾的指定位置开始
* 0 - 在字符串中的第一个字符处开始
* @param int $length 可选。规定要隐藏的字符串长度。默认是直到字符串的结尾。
* 正数 - 从 start 参数所在的位置隐藏
* 负数 - 从字符串末端隐藏
* @param string $re 替代符
* @return string 处理后的字符串
*/
public static function hidestr($string, $start = 0, $length = 0, $re = '*')
{
if (empty($string)) {
return false;
}
$strarr = array();
$mb_strlen = mb_strlen($string);
while ($mb_strlen) {//循环把字符串变为数组
$strarr[] = mb_substr($string, 0, 1, 'utf8');
$string = mb_substr($string, 1, $mb_strlen, 'utf8');
$mb_strlen = mb_strlen($string);
}
$strlen = count($strarr);
$begin = $start >= 0 ? $start : ($strlen - abs($start));
$end = $last = $strlen - 1;
;
if ($length > 0) {
$end = $begin + $length - 1;
} elseif ($length < 0) {
$end -= abs($length);
}
for ($i = $begin; $i <= $end; $i++) {
$strarr[$i] = $re;
}
// if ($begin >= $end || $begin >= $last || $end > $last) return false;
return implode('', $strarr);
}
/**
* @param $url
* @param int $type 0普通数据 2获取base64
* @param int $timeout
* @return array
*/
public static function geturlbase64($url, $type=0, $timeout=30)
{
$msg = ['code'=>2100,'status'=>'error','msg'=>'未知错误!'];
$imgs= ['image/jpeg'=>'jpeg',
'image/jpg'=>'jpg',
'image/gif'=>'gif',
'image/png'=>'png',
'text/html'=>'html',
'text/plain'=>'txt',
'image/pjpeg'=>'jpg',
'image/x-png'=>'png',
'image/x-icon'=>'ico'
];
if (!stristr($url, 'http')) {
$msg['code']= 2101;
$msg['msg'] = 'url地址不正确!';
return $msg;
}
$dir= pathinfo($url);
//var_dump($dir);
$host = $dir['dirname'];
$refer= $host.'/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_REFERER, $refer); //伪造来源地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回变量内容还是直接输出字符串,0输出,1返回内容
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);//在启用CURLOPT_RETURNTRANSFER的时候返回原生的Raw输出
curl_setopt($ch, CURLOPT_HEADER, 0); //是否输出HEADER头信息 0否1是
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //超时时间
$data = curl_exec($ch);
//$httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
//$httpContentType = curl_getinfo($ch,CURLINFO_CONTENT_TYPE);
$info = curl_getinfo($ch);
curl_close($ch);
$httpCode = intval($info['http_code']);
$httpContentType = $info['content_type'];
$httpSizeDownload= intval($info['size_download']);
if ($httpCode!='200') {
$msg['code']= 2102;
$msg['msg'] = 'url返回内容不正确';
return $msg;
}
if ($type>0 && !isset($imgs[$httpContentType])) {
$msg['code']= 2103;
$msg['msg'] = 'url资源类型未知';
return $msg;
}
if ($httpSizeDownload<1) {
$msg['code']= 2104;
$msg['msg'] = '内容大小不正确!';
return $msg;
}
$msg['code'] = 200;
$msg['status']='success';
$msg['msg'] = '资源获取成功';
if ($type==0 or $httpContentType=='text/html') {
$msg['data'] = $data;
}
$base_64 = base64_encode($data);
if ($type==1) {
$msg['data'] = $base_64;
} elseif ($type==2) {
$msg['data'] = "data:{$httpContentType};base64,{$base_64}";
} elseif ($type==3) {
$msg['data'] = "<img src='data:{$httpContentType};base64,{$base_64}' />";
} else {
$msg['msg'] = '未知返回需求!';
}
unset($info,$data,$base_64);
return $msg;
}
}