需求是這樣的,客戶需要一個在觀看學習視訊前彈出人臉識別核驗真人的功能,客戶找了個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格式的,所以要轉換一下
其實介面不難,就是除錯時候很多小毛病,需要細心注意