参考腾讯云文档:
https://cloud.tencent.com/document/product/1007/35875
sign生成参考文档:
https://cloud.tencent.com/document/product/1007/63359
获取方法中需要的参数:
公共方法:
注意:想要正确使用获取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;
}