腾讯云基础版人脸核身APP端请求时获取sign签名及faceid--PHP版

902 阅读1分钟

参考腾讯云文档:

https://cloud.tencent.com/document/product/1007/35875

image.png

sign生成参考文档:

https://cloud.tencent.com/document/product/1007/63359

获取方法中需要的参数:

image.png

image.png

image.png

image.png

公共方法:

注意:想要正确使用获取AccessToken,需要将服务器的ip地址联系腾讯客服人员加入白名单,否则接口会报错

    /**
     * 获取腾讯云人脸核身AccessToken
     * 参考文档:https://cloud.tencent.com/document/product/1007/37304
     * */
    function getTxAccessToken(){
    	$rs=array('code'=>0,'msg'=>'','info'=>array());

    	$key='tx_rlhs_accesstoken';
        //redis缓存获取,getcache()方法可以根据自己实际项目替换或更改,此处只做演示功能
    	$access_token=getcache($key);

    	if($access_token){
    		$rs['info'][0]['access_token']=$access_token;
    		return $rs;	
    	}

        $app_id=''; //替换为自己腾讯云人脸核身WBappid
        $secret=''; //替换为自己腾讯云人脸核身secret

        if(!$app_id || !$secret){
        	$rs['code']=1001;
        	$rs['msg']='请检查配置信息';
        	return $rs;
        }

        $grant_type='client_credential';
        $version='1.0.0';
        $url='https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/access_token?app_id='.$app_id.'&secret='.$secret.'&grant_type='.$grant_type.'&version='.$version;


        //初始化
        $ch = curl_init();
        //设置选项,包括URL
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //执行并获取HTML文档内容
        $output = curl_exec($ch);
        //释放curl句柄
        curl_close($ch);
        //打印获得的数据

        $result=json_decode($output,true);

        if($result['code']!=0){
        	$rs['code']=1002;
        	$rs['msg']=$result['msg'];
        	return $rs;
        }

        $access_token=$result['access_token'];
        //redis缓存存储,setcaches()方法可以根据自己实际项目替换或更改,此处只做演示功能
        setcaches($key,$access_token,60*20);

        $rs['info'][0]['access_token']=$access_token;
        return $rs;

    }
    /**
     * 获取腾讯云人脸核身NONCE ticket
     * 参考文档:https://cloud.tencent.com/document/product/1007/37306
     * 参考文档:https://cloud.tencent.com/document/product/1007/37305
     * */
    function getTxTicket($uid,$access_token,$type){
    	$rs=array('code'=>0,'msg'=>'','info'=>array());

        $app_id=''; //替换为自己腾讯云人脸核身WBappid

        if(!$app_id){
        	$rs['code']=1001;
        	$rs['msg']='请检查配置信息';
        	return $rs;
        }

        $version='1.0.0';

        if($type=='SIGN'){
        	$url='https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket?app_id='.$app_id.'&access_token='.$access_token.'&type='.$type.'&version='.$version;

        }else{
        	$url='https://miniprogram-kyc.tencentcloudapi.com/api/oauth2/api_ticket?app_id='.$app_id.'&access_token='.$access_token.'&type='.$type.'&version='.$version.'&user_id='.$uid;
        }


        //初始化
        $ch = curl_init();
        //设置选项,包括URL
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //执行并获取HTML文档内容
        $output = curl_exec($ch);
        //释放curl句柄
        curl_close($ch);
        //打印获得的数据

        $result=json_decode($output,true);

        if($result['code']!=0){
        	$rs['code']=1002;
        	$rs['msg']=$result['msg'];
        	return $rs;
        }

        $ticket=$result['tickets'][0]['value'];

        $rs['info'][0]['ticket']=$ticket;
        return $rs;
    }
    /**
     * 获取腾讯云人脸核身sign
     * 参考文档:https://cloud.tencent.com/document/product/1007/63359
     * $uid为自己项目中用户唯一标识,如:数据库用户表中自增id【根据自己项目实际情况定义】,跟上一个方法中的$uid保持一致
     * $ticket 上一个方法生成
     * $nonce 32位随机数
     * */
    function getTxRlhsSign($uid,$ticket,$nonce){
    	$rs=array('code'=>0,'msg'=>'','info'=>array());

        $app_id=''; //替换为自己腾讯云人脸核身WBappid

        if(!$app_id){
        	$rs['code']=1001;
        	$rs['msg']='请检查配置信息';
        	return $rs;
        }

        $version='1.0.0';

        $arr=array(
        	'appId'=>$app_id,
        	'userId'=>$uid,
        	'nonce'=>$nonce,
        	'version'=>$version,
        	'ticket'=>$ticket
        );

        sort($arr);
        $str='';
        foreach ($arr as $k => $v) {
        	$str.=$v;
        }

        $sign=sha1($str);
        if(!$sign){
        	$rs['code']=1002;
        	$rs['msg']='签名生成失败';
        	return $rs;
        }

        $rs['info'][0]['sign']=$sign;
        $rs['info'][0]['appid']=$app_id;
        $rs['info'][0]['licence']=''; //替换为自己腾讯云人脸核身Licence
        return $rs;

    }
    /**
     * 获取腾讯云人脸核身faceid
     * 参考文档:https://cloud.tencent.com/document/product/1007/35866
     * */
    function getTxFaceid($uid,$name,$cardno,$nonce,$sign){
    	$rs=array('code'=>0,'msg'=>'','info'=>array());

        $app_id=''; //替换为自己腾讯云人脸核身WBappid

        if(!$app_id){
        	$rs['code']=1001;
        	$rs['msg']='请检查配置信息';
        	return $rs;
        }

        $version='1.0.0';

        $url='https://miniprogram-kyc.tencentcloudapi.com/api/server/getfaceid';

        $data=array(
        	'webankAppId'=>$app_id,
        	'name'=>$name,
        	'idNo'=>$cardno,
        	'userId'=>$uid,
        	'version'=>$version,
        	'sign'=>$sign,
        	'nonce'=>$nonce,
        	'orderNo'=>$nonce
        );

        $data=json_encode($data);

        $ch = curl_init();
      	curl_setopt($ch, CURLOPT_POST, 1);
      	curl_setopt($ch, CURLOPT_URL, $url);
     	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
			'Content-Type: application/json',
			"Accept: application/json"
		));
      	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
     	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
     	$result = curl_exec($ch);
     	curl_close($ch);

     	$result_arr=json_decode($result,true);


        if($result_arr['code']!=0){
        	$rs['code']=1002;
        	$rs['msg']=$result_arr['msg'];
        	return $rs;
        }


        $faceid=$result_arr['result']['faceId'];

        $rs['info'][0]['faceid']=$faceid;
        return $rs;
    }
/* 随机数 */
	function random($length = 6 , $numeric = 0) {
		PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
		if($numeric) {
			$hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
		} else {
			$hash = '';
			$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';
			$max = strlen($chars) - 1;
			for($i = 0; $i < $length; $i++) {
				$hash .= $chars[mt_rand(0, $max)];
			}
		}
		return $hash;
	}
    /**
	 * 判断是否为合法的身份证号码
	 * @param $mobile
	 * @return int
	 */
	function isCreditNo($vStr){

		
		$vCity = array(
		  	'11','12','13','14','15','21','22',
		  	'23','31','32','33','34','35','36',
		  	'37','41','42','43','44','45','46',
		  	'50','51','52','53','54','61','62',
		  	'63','64','65','71','81','82','91'
		);
		
		if (!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/', $vStr)){
		 	return false;
		}

	 	if (!in_array(substr($vStr, 0, 2), $vCity)){
	 		return false;
	 	}
	 
	 	$vStr = preg_replace('/[xX]$/i', 'a', $vStr);
	 	$vLength = strlen($vStr);

	 	if($vLength == 18){
	  		$vBirthday = substr($vStr, 6, 4) . '-' . substr($vStr, 10, 2) . '-' . substr($vStr, 12, 2);
	 	}else{
	  		$vBirthday = '19' . substr($vStr, 6, 2) . '-' . substr($vStr, 8, 2) . '-' . substr($vStr, 10, 2);
	 	}

		if(date('Y-m-d', strtotime($vBirthday)) != $vBirthday){
		 	return false;
		}

	 	if ($vLength == 18) {
	  		$vSum = 0;
	  		for ($i = 17 ; $i >= 0 ; $i--) {
	   			$vSubStr = substr($vStr, 17 - $i, 1);
	   			$vSum += (pow(2, $i) % 11) * (($vSubStr == 'a') ? 10 : intval($vSubStr , 11));
	  		}
	  		if($vSum % 11 != 1){
	  			return false;
	  		}
	 	}

	 	return true;
	}

调用上面的公共方法生成sign,并将app端使用的参数一并返回。

/**
     * 获取人脸核身签名及faceid
     * @desc 获取人脸核身签名及faceid
     * @return int code 状态码,0表示成功
     * @return string msg 提示信息
     * @return array info 返回信息
     * */
    public function getRlhsSign(){
        $rs=array('code'=>0,'msg'=>'','info'=>array());
        $uid=''; //用户id
        $name=''; //姓名
        $cardno=''; //身份证号

        if($name==''){
            $rs['code']=1001;
            $rs['msg']="请填写真实姓名";
            return $rs;
        }

        if(mb_strlen($name)>6){
            $rs['code']=1002;
            $rs['msg']="真实姓名不能超过6个字";
            return $rs;
        }

        if(!$cardno){
            $rs['code']=1003;
            $rs['msg']="请输入身份证号";
            return $rs;
        }

        $check_cardno=isCreditNo($cardno);
        if(!$check_cardno){
            $rs['code']=1004;
            $rs['msg']="身份证号不合法";
            return $rs;
        }

        //获取AccessToken
        $acc_result=getTxAccessToken();
        if($acc_result['code']!=0){
            return $acc_result;
        }

        $access_token=$acc_result['info']['0']['access_token'];

        if(!$access_token){
            $rs['code']=1005;
            $rs['msg']='access_token获取失败';
            return $rs;
        }
        
        //获取NONCE ticket
        $type='NONCE';
        $ticket_result=getTxTicket($uid,$access_token,$type);
        if($ticket_result['code']!=0){
            return $ticket_result;
        }

        $nonce_ticket=$ticket_result['info']['0']['ticket'];

        if(!$nonce_ticket){
            $rs['code']=1006;
            $rs['msg']='nonce ticket获取失败';
            return $rs;
        }

        //获取SIGN ticket
        $type='SIGN';
        $ticket_result1=getTxTicket($uid,$access_token,$type);

        if($ticket_result1['code']!=0){
            return $ticket_result1;
        }


        $sign_ticket=$ticket_result1['info']['0']['ticket'];

        if(!$sign_ticket){
            $rs['code']=1007;
            $rs['msg']='sign ticket获取失败';
            return $rs;
        }

        //生成随机数
        $nonce=random(32);
        $sign_result=getTxRlhsSign($uid,$nonce_ticket,$nonce);
        if($sign_result['code']!=0){
             return $sign_result;
        }

        $face_sign_result=getTxRlhsSign($uid,$sign_ticket,$nonce);
        if($face_sign_result['code']!=0){
             return $face_sign_result;
        }

        $face_sign=$face_sign_result['info']['0']['sign'];

        if(!$face_sign){
            $rs['code']=1008;
            $rs['msg']='face_sign获取失败';
            return $rs;
        }

        $faceid_result=getTxFaceid($uid,$name,$cardno,$nonce,$face_sign);

        if($faceid_result['code']!=0){
            return $faceid_result;
        }

        $faceid=$faceid_result['info'][0]['faceid'];

        if(!$faceid){
            $rs['code']=1009;
            $rs['msg']='faceid获取失败';
            return $rs;
        }

        $sign=$sign_result['info']['0']['sign'];
        $appid=$sign_result['info']['0']['appid'];
        $licence=$sign_result['info']['0']['licence'];



        $result=array(
            'nonce'=>$nonce,
            'sign'=>$sign,
            'appid'=>$appid,
            'orderno'=>$nonce,
            'licence'=>$licence,
            'faceid'=>$faceid,

        );

        $rs['info'][0]=$result;

        return $rs;

    }