Loading

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'];
}
posted @ 2025-04-16 16:37  Carvers  阅读(52)  评论(0)    收藏  举报