php 对接腾讯云人脸核身接口
php对接腾讯云人脸核身接口
控制器端代码【Customer.php】
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @desc 人脸核身
*/
public function checkFace(Request $request)
{
try {
$params = $request->post();
$token = $request->header('token');
$userInfo = getUserInfo($token);
$id = $userInfo['user_id'];
$validateFields = ['face_img'];
ValidationHelper::validateRequiredFields($params, $validateFields);
//人脸照片
$faceImage = $params['face_img'] ?? '';
if ($faceImage) {
$faceImage = file_get_contents($faceImage);
$faceImage = base64_encode($faceImage);
}
$accessTokenFile = storage_path('access_token.txt');
$signTicketFile = storage_path('sign_ticket.txt');
//todo 验证token是否过期,并获取token
$accessTokenExpired = true;
if (is_file($accessTokenFile)) {
$accessTokenExpired = false;
$filetime = filemtime($accessTokenFile);
if (time() - $filetime > 60 * 20) $accessTokenExpired = true;
}
if ($accessTokenExpired) {
$access_token = IdentifyTencentService::getInstance()->getAccessToken();
file_put_contents($accessTokenFile, $access_token);
}
$access_token = file_get_contents($accessTokenFile);
//todo 验证sign类型ticket是否过期,并获取ticket
$signTicketExpired = true;
if (is_file($signTicketFile)) {
$signTicketExpired = false;
$filetime = filemtime($signTicketFile);
if (time() - $filetime > 60 * 20) $signTicketExpired = true;
}
if ($signTicketExpired) {
$sign_ticket = IdentifyTencentService::getInstance()->getTicketBySign($access_token);
file_put_contents($signTicketFile, $sign_ticket);
}
$sign_ticket = file_get_contents($signTicketFile);
//todo 验证nonce类型ticket是否过期,并获取ticket
//用户ID
$userId = 'userID_' . $id . '_time_' . microtime(true);
//生成一个32位的随机字符串 nonce
$nonce = bin2hex(random_bytes(16));
$noticeTicket = IdentifyTencentService::getInstance()->getTicketByNonce($access_token, $userId);
//订单号
$orderNo = uniqid('orderno_', true);
$appId = '你的应用key';
//人脸识别参数
$h5FaceIdParams = [
'appId' => $appId,
'userId' => $userId,
'nonce' => $nonce,
'version' => '1.0.0',
'ticket' => $sign_ticket
];
//进行值排序
uasort($h5FaceIdParams, function ($a, $b) {
return $a <=> $b;
});
$signParams = array_values($h5FaceIdParams);
$sha1ParamsString = join('', $signParams);
$sha1Sign = sha1($sha1ParamsString);
$h5FaceIdParams['sign'] = $sha1Sign;
$h5FaceIdParams['orderNo'] = $orderNo;
$h5FaceIdParams['sourcePhotoStr'] = $faceImage;
$h5FaceIdParams['sourcePhotoType'] = 2;//高清正脸照重要提示
$faceId = IdentifyTencentService::getInstance()->getAdvFaceId($h5FaceIdParams, $orderNo);
//todo 登录跳转
$loginParams = [
'appId' => $appId,
'userId' => $userId,
'nonce' => $nonce,
'version' => '1.0.0',
'faceId' => $faceId,
'orderNo' => $orderNo,
'ticket' => $noticeTicket
];
uasort($loginParams, function ($a, $b) {
return $a <=> $b;
});
$faceSignArray = array_values($loginParams);
$faceSignString = join('', $faceSignArray);
$faceSha1SignStr = sha1($faceSignString);
$faceUrl = "https://kyc1.qcloud.com/api/web/login?appId=" . $appId . "&version=1.0.0&nonce=" . $nonce
. "&orderNo=" . $orderNo . "&faceId=" . $faceId . "&url=https://test.com/app/callback/txface/customer_id/" . enAes($id)
. "/userinfo/" . enAes(enjson($params)) . "&from=browser&userId=" . $userId . "&sign=" . $faceSha1SignStr . "&redirectType=";
return response()->json(['code' => CodeStatus::SUCCESS, 'msg' => trans('messages.success'), 'data' => ['url' => $faceUrl]]);
} catch (\Exception $e) {
addLog('人脸核身', $request, $e);
return response()->json(['code' => $e->getCode(), 'msg' => $e->getMessage()]);
}
}
服务端代码【IdentifyTencentService.php】
/**
* @param string $accessToken
* @return mixed
* @throws \Exception
* @desc 通过sign获取ticket
*/
public function getTicketBySign($accessToken = '')
{
$apiParams = [
'appId' => $this->authAppId,
'access_token' => $accessToken,
'type' => 'SIGN',
'version' => '1.0.0'
];
$apiParamsStr = http_build_query($apiParams);
$signTicketUrl = $this->ticketUrl . $apiParamsStr;
$resp = curlRequest($signTicketUrl);
$resp = json_decode($resp, true);
$resp = $resp['tickets'][0]['value'];
return $resp;
}
/**
* @param string $accessToken
* @param string $userId
* @return mixed
* @throws \Exception
* @desc 通过nonce获取ticket
*/
public function getTicketByNonce($accessToken = '', $userId = '')
{
$apiParams = [
'appId' => $this->authAppId,
'access_token' => $accessToken,
'type' => 'NONCE',
'version' => '1.0.0',
'user_id' => $userId
];
$apiParamsStr = http_build_query($apiParams);
$signTicketUrl = $this->ticketUrl . $apiParamsStr;
$resp = curlRequest($signTicketUrl);
$resp = json_decode($resp, true);
$resp = $resp['tickets'][0]['value'];
return $resp;
}
/**
* @param $h5FaceIdParams
* @param $orderNo
* @return mixed
* @throws \Exception
* @desc 获取识别人脸的ID
*/
public function getAdvFaceId($h5FaceIdParams, $orderNo)
{
$header = [
'Content-Type' => ' application/json'
];
$h5faceIdInfo = curlRequest($this->checkFaceUrl . 'orderNo=' . $orderNo, 'POST', enJson($h5FaceIdParams), $header);
if (strpos($h5faceIdInfo, "\r\n") !== false) {
$h5faceIdInfo = substr($h5faceIdInfo, strrpos($h5faceIdInfo, "\r\n") + 2);
}
$h5faceIdInfo = json_decode($h5faceIdInfo, true);
if ($h5faceIdInfo['code']) {
throw new \Exception($h5faceIdInfo['msg'], $h5faceIdInfo['code']);
}
return $h5faceIdInfo['result']['faceId'];
}
本文来自博客园,作者:Carvers,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18829024

浙公网安备 33010602011771号