記一次微信公眾號(微信H5)網頁對接騰訊雲慧眼人臉核驗開發筆記

零塵發表於2020-11-04

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

 

 

 上圖就是最優方案的資質要求

普通模式則不用這些資質了。

在微信原生 H5 浮層模式之外,慧眼為無法使用浮層模式的客戶提供了備選方案,普通模式沒有行業限制。

人臉核身提供身份證 OCR、活體檢測、人臉比對三個功能組合使用:

    1. 身份證 OCR :該功能為非必選項,若不需要,可以選擇:手動輸入或呼叫時傳入身份資訊。
    2. 活體檢測:
      • 浮層模式:支援數字活體檢測、光線活體檢測、光線+數字活體檢測,三選一。
      • 普通模式:支援讀數活體檢測、動作活體檢測、靜默活體檢測,三選一。
    3. 人臉比對,支援兩種方式:
      (1)跟公安權威庫比對。
      (2)跟上傳照片比對。
    4. 確認使用模式和功能後,需要建立業務流程,獲取 RuleId 用於呼叫。
      建立入口: 人臉核身控制檯-自助接入 。

      流程稽核通過後,系統會配置對應流程並分配一個 RuleId,客戶可以使用 RuleId 呼叫 DetectAuth 介面,使用人臉核身服務。

其實,騰訊雲慧眼整合的相當的友好的,只要控制後臺開通了服務,申請一個流程就行了,這個流程可自由組合搭配的,比較靈活

有了RuleId,還要去控制檯生成一個金鑰對,SecretId和SecretKey,下面直接開始對接吧!

首先要去GitHub下載最新的sdk包,我是使用PHP對接的,因此去找到PHP的庫包,不過官方已經暫停提供直接下載庫包了,要通過composer下載,不過我下載好了一個,放網盤了,可以直接拿去用,全量的

連結: http://caiyun.feixin.10086.cn/dl/055CgRlGP1jKt  提取碼:p6zu  複製內容開啟和彩雲手機APP,操作更方便哦

下載好類庫放到專案的資料夾中,位置一般都有個庫包資料夾,大家各自喜好

步驟:

根據官網的教程,先使用實名核身鑑權介面調起業務流程,然後根據流程結束後回撥返回的BizToken去獲取本次認證的資訊,比較簡單

官方的說法:

  1. 接入準備:
    • 登入 人臉核身控制檯 ,申請 ruleid 引數,在自助接入中申請建立微信 H5(通用模式)或微信原生 H5(浮層模式)業務流程,ruleid 的申請,請參考 微信 HTML5 接入準備。
    • 登入官網控制檯 建立 API 金鑰(SecretId 和 SecretKey)
  2. 接入方前端顯示核身入口,呼叫接入方服務端介面。
  3. 接入方服務端呼叫實名核身鑑權 DetectAuth 介面,傳入核身所需資訊與業務回跳地址 RedirectUrl,獲取到核身流程標識(BizToken)及核身入口 URL 。線上除錯。
  4. 接入方前端通過地址跳轉方式重定向至步驟3中獲取的核身入口 URL,進入核身流程。
  5. 使用者完成人臉核身後,頁面會跳轉到 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格式的,所以要轉換一下

其實介面不難,就是除錯時候很多小毛病,需要細心注意

 

相關文章