246 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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;
 | 
						||
    }
 | 
						||
}
 |