需求是這樣的,客戶需要一個在觀看學習視頻前彈出人臉識別核驗真人的功能,客戶找了個APP作為參考,但是在微信上第三方人臉識別是無法直接調取到前置攝像頭的,都是通過用戶自己獲取用戶的身份信息或者照片,然后在上傳給接口,這樣就顯得很繁雜,也不符合需求,微信原生 H5 浮層模式和小程序是基於微信原生的體驗,客戶體驗好,但有明確的主體行業限制。但是騰訊雲慧眼因為都是騰訊的,所以可以接入更為友好的效果,只是最優的那個模式行業要求非常嚴格,所以放棄了這個選項,退一步,選擇普通模式

上圖就是最優方案的資質要求
普通模式則不用這些資質了。
在微信原生 H5 浮層模式之外,慧眼為無法使用浮層模式的客戶提供了備選方案,普通模式沒有行業限制。
人臉核身提供身份證 OCR、活體檢測、人臉比對三個功能組合使用:
- 身份證 OCR :該功能為非必選項,若不需要,可以選擇:手動輸入或調用時傳入身份信息。
- 活體檢測:
- 浮層模式:支持數字活體檢測、光線活體檢測、光線+數字活體檢測,三選一。
- 普通模式:支持讀數活體檢測、動作活體檢測、靜默活體檢測,三選一。
- 人臉比對,支持兩種方式:
(1)跟公安權威庫比對。
(2)跟上傳照片比對。 -
確認使用模式和功能后,需要創建業務流程,獲取 RuleId 用於調用。
創建入口: 人臉核身控制台-自助接入 。流程審核通過后,系統會配置對應流程並分配一個 RuleId,客戶可以使用 RuleId 調用 DetectAuth 接口,使用人臉核身服務。
其實,騰訊雲慧眼集成的相當的友好的,只要控制后台開通了服務,申請一個流程就行了,這個流程可自由組合搭配的,比較靈活
有了RuleId,還要去控制台生成一個密鑰對,SecretId和SecretKey,下面直接開始對接吧!
首先要去GitHub下載最新的sdk包,我是使用PHP對接的,因此去找到PHP的庫包,不過官方已經暫停提供直接下載庫包了,要通過composer下載,不過我下載好了一個,放網盤了,可以直接拿去用,全量的
鏈接: http://caiyun.feixin.10086.cn/dl/055CgRlGP1jKt 提取碼:p6zu 復制內容打開和彩雲手機APP,操作更方便哦
下載好類庫放到項目的文件夾中,位置一般都有個庫包文件夾,大家各自喜好
步驟:
根據官網的教程,先使用實名核身鑒權接口調起業務流程,然后根據流程結束后回調返回的BizToken去獲取本次認證的信息,比較簡單
官方的說法:
- 接入准備:
- 登錄 人臉核身控制台 ,申請 ruleid 參數,在自助接入中申請創建微信 H5(通用模式)或微信原生 H5(浮層模式)業務流程,ruleid 的申請,請參考 微信 HTML5 接入准備。
- 登錄官網控制台 創建 API 密鑰(SecretId 和 SecretKey)
- 接入方前端顯示核身入口,調用接入方服務端接口。
- 接入方服務端調用實名核身鑒權 DetectAuth 接口,傳入核身所需信息與業務回跳地址 RedirectUrl,獲取到核身流程標識(BizToken)及核身入口 URL 。在線調試。
- 接入方前端通過地址跳轉方式重定向至步驟3中獲取的核身入口 URL,進入核身流程。
- 用戶完成人臉核身后,頁面會跳轉到 RedirectUrl 上,地址中會帶上此次驗證流程使用的 BizToken,接入方服務端即可憑借 BizToken 參數調用獲取實名核身結果信息 GetDetectInfo 接口去獲取本次核身的詳細信息

其實這個圖片我看着感覺比較復雜,我簡單描述一下,准備好參數,傳參過去騰訊服務器,服務器返回數據,我們再拿數據去查數據,就是這樣子
關於接口的調用方式大家各有所好,我是把調用封裝在一個類中,供全局調用
第一步:創建一個類文件
QcloudFaceAuth.PHP
<?php
/**
* 騰訊雲慧眼
*/
require_once dirname(__FILE__).'/../../library/tencentcloud-sdk-php/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Faceid\V20180301\FaceidClient;
use TencentCloud\Faceid\V20180301\Models\DetectAuthRequest;
use TencentCloud\Faceid\V20180301\Models\GetDetectInfoEnhancedRequest;
class QcloudFaceAuth{
public $secretId;
public $secretKey;
function __construct($secretId, $secretKey) {
$this->secretId = $secretId;
$this->secretKey = $secretKey;
}
//調用鑒權認證流程方法
public function getDetectAuth($region,$params){
try {
$cred = new Credential($this->secretId, $this->secretKey);
$httpProfile = new HttpProfile();
$httpProfile->setEndpoint("faceid.tencentcloudapi.com");
$clientProfile = new ClientProfile();
$clientProfile->setHttpProfile($httpProfile);
$client = new FaceidClient($cred, $region, $clientProfile);
$req = new DetectAuthRequest();
$req->fromJsonString(json_encode($params));
$resp = $client->DetectAuth($req);
return ['code'=>1,'msg'=>'success','data'=>$resp->toJsonString()];
}catch (TencentCloudSDKException $e){
return ['code'=>0,'msg'=>$e->getMessage(),'data'=>''];
}
}
//獲取認證信息方法
public function getDetectInfoEnhanced($region,$params){
try {
$cred = new Credential($this->secretId, $this->secretKey);
$httpProfile = new HttpProfile();
$httpProfile->setEndpoint("faceid.tencentcloudapi.com");
$clientProfile = new ClientProfile();
$clientProfile->setHttpProfile($httpProfile);
$client = new FaceidClient($cred, $region, $clientProfile);
$req = new GetDetectInfoEnhancedRequest();
$req->fromJsonString(json_encode($params));
$resp = $client->GetDetectInfoEnhanced($req);
return ['code'=>1,'msg'=>'success','data'=>$resp->toJsonString()];
}
catch(TencentCloudSDKException $e) {
return ['code'=>0,'msg'=>$e->getMessage(),'data'=>''];
}
}
}
可以看到就兩個方法,一個是調起流程(getDetectAuth),一個是獲取信息(getDetectInfoEnhanced)
然后在你想使用的地方引入或者包含這個類文件就可以new一個對象調用方法了
include_once dirname(__FILE__).'/inc/common/QcloudFaceAuth.php';
調用位置:
$params=[
"RuleId" => "申請的業務流程id",
"IdCard" => '身份證號',
"Name" => '姓名',
"RedirectUrl"=>'回調地址,也就是認證流程完成之后跳轉的地址',
];
$SecretId='你的秘鑰id';
$SecretKey='你的秘鑰';
$faceAuth=new QcloudFaceAuth($SecretId,$SecretKey);
$region='地區';//ap-chengdu西南地區(成都),ap-guangzhou華南地區(廣州)
$resp=$faceAuth->getDetectAuth($region,$params);
$resp=json_decode($resp['data'],true);
if ($resp){
$this->resultJson(['code'=>200,'msg'=>'success','data'=>$resp]);
}else{
$this->resultJson(['code'=>0,'msg'=>$resp,'data'=>[]]);
}
這里返回的數據中,我們需要取到的是一個流程URL,也就是$resp['Url'],然后你可以讓程序調整訪問這個URL就可以進入認證流程了;
等流程結束后,會跳轉到剛才傳過去的 RedirectUrl地址上,然后你可以在這個地址獲取返回的BizToken,然后去請求獲取認證結果接口
$params = array(
"InfoType" => "0",
"BizToken" => $BizToken,
"RuleId" => "1"
);
$SecretId='你的秘鑰id';
$SecretKey='你的秘鑰';
$faceAuth=new QcloudFaceAuth($SecretId,$SecretKey);
$region='ap-chengdu';//同上接口解釋
$resp=$faceAuth->getDetectInfoEnhanced($region,$params);//獲取認證信息接口調用
//往下就是自己的業務代碼
load()->func('file');
$resp=json_decode($resp['data'],true);
if ($resp['Text']['ErrCode']===0){
$base64_image_content=$resp['BestFrame']['BestFrame'];
$path = '/images/shot';
$new_file = $path."/".date('Ymd',time())."/";
if(!file_exists(MODULE_ROOT.$new_file)){
//檢查是否有該文件夾,如果沒有就創建,並給予最高權限
mkdirs(MODULE_ROOT.$new_file);
}
$new_file = $new_file.time().".jpg";
if (file_put_contents(MODULE_ROOT.$new_file, base64_decode($base64_image_content))){
$data = array(
'uniacid' => $uniacid,
'uid' => $uid,
'lessonid' => $id,
'sectionid' => $sectionid,
'path' => $new_file,
'addtime' => time()
);
$r = pdo_insert($this->table_member_shot, $data);
if($r){
//$this->resultJson(['code'=>200,'msg'=>'success','data'=>$r]);
}else{
message('認證數據寫入失敗', $this->createMobileUrl('lesson', array('id'=>$id,'sectionid'=>$sectionid,'uid'=>$uid)), "warning");
}
}else{
message('認證取樣失敗', $this->createMobileUrl('lesson', array('id'=>$id,'sectionid'=>$sectionid,'uid'=>$uid)), "warning");
}
}else{
message('認證失敗,請重新認證', $this->createMobileUrl('lesson', array('id'=>$id,'sectionid'=>$sectionid,'uid'=>$uid)), "warning");
}
只要拿到了BizToken,通過接口獲取認證信息,然后做自己想要的業務判斷了,我這里獲取了視頻認證中返回的最佳幀圖片,存到本地來,他們接口返回的圖片是base64格式的,所以要轉換一下
其實接口不難,就是調試時候很多小毛病,需要細心注意

