燉燉妈妈 發表於 2020-11-4 17:09:00

记一次微信公众号(微信H5)网页对接腾讯云慧眼人脸核验开发笔记

<p>需求是这样的,客户需要一个在观看学习视频前弹出人脸识别核验真人的功能,客户找了个APP作为参考,但是在微信上第三方人脸识别是无法直接调取到前置摄像头的,都是通过用户自己获取用户的身份信息或者照片,然后在上传给接口,这样就显得很繁杂,也不符合需求,微信原生 H5 浮层模式和小程序是基于微信原生的体验,客户体验好,但有明确的主体行业限制。但是腾讯云慧眼因为都是腾讯的,所以可以接入更为友好的效果,只是最优的那个模式行业要求非常严格,所以放弃了这个选项,退一步,选择普通模式</p>
<p><img src="https://img2020.cnblogs.com/blog/2164438/202011/2164438-20201104155651532-707449996.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;上图就是最优方案的资质要求</p>
<p>普通模式则不用这些资质了。</p>
<p>在微信原生 H5 浮层模式之外,慧眼为无法使用浮层模式的客户提供了备选方案,普通模式没有行业限制。</p>
<p>人脸核身提供身份证 OCR、活体检测、人脸比对三个功能组合使用:</p>
<ol><ol>
<li>身份证 OCR :该功能为非必选项,若不需要,可以选择:手动输入或调用时传入身份信息。</li>
<li>活体检测:
<ul>
<li>浮层模式:支持数字活体检测、光线活体检测、光线+数字活体检测,三选一。</li>
<li>普通模式:支持读数活体检测、动作活体检测、静默活体检测,三选一。</li>
</ul>
</li>
<li>人脸比对,支持两种方式:<br>(1)跟公安权威库比对。<br>(2)跟上传照片比对。</li>
<li>
<p>确认使用模式和功能后,需要创建业务流程,获取 RuleId 用于调用。<br>创建入口:&nbsp;人脸核身控制台-自助接入&nbsp;。</p>
<p>流程审核通过后,系统会配置对应流程并分配一个 RuleId,客户可以使用 RuleId 调用&nbsp;DetectAuth&nbsp;接口,使用人脸核身服务。</p>

</li>


</ol></ol>
<p>其实,腾讯云慧眼集成的相当的友好的,只要控制后台开通了服务,申请一个流程就行了,这个流程可自由组合搭配的,比较灵活</p>
<p>有了RuleId,还要去控制台生成一个密钥对,SecretId和SecretKey,下面直接开始对接吧!</p>
<p>首先要去GitHub下载最新的sdk包,我是使用PHP对接的,因此去找到PHP的库包,不过官方已经暂停提供直接下载库包了,要通过composer下载,不过我下载好了一个,放网盘了,可以直接拿去用,全量的</p>
<p>链接: http://caiyun.feixin.10086.cn/dl/055CgRlGP1jKt&nbsp; 提取码:p6zu&nbsp; 复制内容打开和彩云手机APP,操作更方便哦</p>
<p>下载好类库放到项目的文件夹中,位置一般都有个库包文件夹,大家各自喜好</p>
<p>步骤:</p>
<p>根据官网的教程,先使用实名核身鉴权接口调起业务流程,然后根据流程结束后回调返回的BizToken去获取本次认证的信息,比较简单</p>
<p>官方的说法:</p>
<ol>
<li>接入准备:
<ul>
<li>登录&nbsp;人脸核身控制台&nbsp;,申请 ruleid 参数,在自助接入中申请创建微信 H5(通用模式)或微信原生 H5(浮层模式)业务流程,ruleid 的申请,请参考&nbsp;微信 HTML5 接入准备。</li>
<li>登录官网控制台&nbsp;创建 API 密钥(SecretId 和 SecretKey)</li>

</ul>

</li>
<li>接入方前端显示核身入口,调用接入方服务端接口。</li>
<li>接入方服务端调用实名核身鉴权&nbsp;DetectAuth&nbsp;接口,传入核身所需信息与业务回跳地址 RedirectUrl,获取到核身流程标识(BizToken)及核身入口 URL 。在线调试。</li>
<li>接入方前端通过地址跳转方式重定向至步骤3中获取的核身入口 URL,进入核身流程。</li>
<li>用户完成人脸核身后,页面会跳转到 RedirectUrl 上,地址中会带上此次验证流程使用的 BizToken,接入方服务端即可凭借 BizToken 参数调用获取实名核身结果信息&nbsp;GetDetectInfo&nbsp;接口去获取本次核身的详细信息</li>

</ol>
<p><img src="https://img2020.cnblogs.com/blog/2164438/202011/2164438-20201104162851868-334648610.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;其实这个图片我看着感觉比较复杂,我简单描述一下,准备好参数,传参过去腾讯服务器,服务器返回数据,我们再拿数据去查数据,就是这样子</p>
<p>关于接口的调用方式大家各有所好,我是把调用封装在一个类中,供全局调用</p>
<p>第一步:创建一个类文件</p>
<pre>QcloudFaceAuth.PHP</pre>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;">&lt;?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-&gt;secretId = $secretId;
      $this-&gt;secretKey = $secretKey;
    }<br>//调用鉴权认证流程方法
    public function getDetectAuth($region,$params){
      try {
            $cred = new Credential($this-&gt;secretId, $this-&gt;secretKey);
            $httpProfile = new HttpProfile();
            $httpProfile-&gt;setEndpoint("faceid.tencentcloudapi.com");

            $clientProfile = new ClientProfile();
            $clientProfile-&gt;setHttpProfile($httpProfile);
            $client = new FaceidClient($cred, $region, $clientProfile);

            $req = new DetectAuthRequest();

            $req-&gt;fromJsonString(json_encode($params));

            $resp = $client-&gt;DetectAuth($req);

            return ['code'=&gt;1,'msg'=&gt;'success','data'=&gt;$resp-&gt;toJsonString()];
      }catch (TencentCloudSDKException $e){
            return ['code'=&gt;0,'msg'=&gt;$e-&gt;getMessage(),'data'=&gt;''];
      }

    }<br>//获取认证信息方法
    public function getDetectInfoEnhanced($region,$params){
      try {

            $cred = new Credential($this-&gt;secretId, $this-&gt;secretKey);
            $httpProfile = new HttpProfile();
            $httpProfile-&gt;setEndpoint("faceid.tencentcloudapi.com");

            $clientProfile = new ClientProfile();
            $clientProfile-&gt;setHttpProfile($httpProfile);
            $client = new FaceidClient($cred, $region, $clientProfile);

            $req = new GetDetectInfoEnhancedRequest();

            $req-&gt;fromJsonString(json_encode($params));

            $resp = $client-&gt;GetDetectInfoEnhanced($req);

            return ['code'=&gt;1,'msg'=&gt;'success','data'=&gt;$resp-&gt;toJsonString()];
      }
      catch(TencentCloudSDKException $e) {
            return ['code'=&gt;0,'msg'=&gt;$e-&gt;getMessage(),'data'=&gt;''];
      }
    }

}
</pre>
</div>
<p>  可以看到就两个方法,一个是调起流程(getDetectAuth),一个是获取信息(getDetectInfoEnhanced)</p>
<p>然后在你想使用的地方引入或者包含这个类文件就可以new一个对象调用方法了</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;">include_once dirname(__FILE__).'/inc/common/QcloudFaceAuth.php';
</pre>
</div>
<p>  调用位置:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;"> $params=[
      "RuleId" =&gt; "申请的业务流程id",
      "IdCard" =&gt; '身份证号',
      "Name" =&gt; '姓名',
      "RedirectUrl"=&gt;'回调地址,也就是认证流程完成之后跳转的地址',
    ];

    $SecretId='你的秘钥id';
    $SecretKey='你的秘钥';
    $faceAuth=new QcloudFaceAuth($SecretId,$SecretKey);
    $region='地区';//ap-chengdu西南地区(成都),ap-guangzhou华南地区(广州)
    $resp=$faceAuth-&gt;getDetectAuth($region,$params);
    $resp=json_decode($resp['data'],true);
    if ($resp){
      $this-&gt;resultJson(['code'=&gt;200,'msg'=&gt;'success','data'=&gt;$resp]);
    }else{
      $this-&gt;resultJson(['code'=&gt;0,'msg'=&gt;$resp,'data'=&gt;[]]);
    }
</pre>
</div>
<p>  这里返回的数据中,我们需要取到的是一个流程URL,也就是$resp['Url'],然后你可以让程序调整访问这个URL就可以进入认证流程了;</p>
<p>等流程结束后,会跳转到刚才传过去的&nbsp;RedirectUrl地址上,然后你可以在这个地址获取返回的BizToken,然后去请求获取认证结果接口</p>
<div class="cnblogs_Highlighter">
<pre class="brush:php;gutter:true;">$params = array(
            "InfoType" =&gt; "0",
            "BizToken" =&gt; $BizToken,
            "RuleId" =&gt; "1"
      );
      $SecretId='你的秘钥id';
      $SecretKey='你的秘钥';
      $faceAuth=new QcloudFaceAuth($SecretId,$SecretKey);
      $region='ap-chengdu';//同上接口解释

      $resp=$faceAuth-&gt;getDetectInfoEnhanced($region,$params);//获取认证信息接口调用<br>//往下就是自己的业务代码
      load()-&gt;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'       =&gt; $uniacid,
                  'uid'               =&gt; $uid,
                  'lessonid'   =&gt; $id,
                  'sectionid'=&gt; $sectionid,
                  'path'       =&gt; $new_file,
                  'addtime'       =&gt; time()
                );
                $r = pdo_insert($this-&gt;table_member_shot, $data);
                if($r){
                  //$this-&gt;resultJson(['code'=&gt;200,'msg'=&gt;'success','data'=&gt;$r]);
                }else{
                  message('认证数据写入失败', $this-&gt;createMobileUrl('lesson', array('id'=&gt;$id,'sectionid'=&gt;$sectionid,'uid'=&gt;$uid)), "warning");
                }
            }else{
                message('认证取样失败', $this-&gt;createMobileUrl('lesson', array('id'=&gt;$id,'sectionid'=&gt;$sectionid,'uid'=&gt;$uid)), "warning");
            }
      }else{
            message('认证失败,请重新认证', $this-&gt;createMobileUrl('lesson', array('id'=&gt;$id,'sectionid'=&gt;$sectionid,'uid'=&gt;$uid)), "warning");
      }
</pre>
</div>
<p>  只要拿到了BizToken,通过接口获取认证信息,然后做自己想要的业务判断了,我这里获取了视频认证中返回的最佳帧图片,存到本地来,他们接口返回的图片是base64格式的,所以要转换一下</p>
<p>其实接口不难,就是调试时候很多小毛病,需要细心注意</p>
<p><img src="https://img2020.cnblogs.com/blog/2164438/202011/2164438-20201104170648262-519965090.png"></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    代码改变世界<br><br>
来源:https://www.cnblogs.com/yonny/p/13926867.html
頁: [1]
查看完整版本: 记一次微信公众号(微信H5)网页对接腾讯云慧眼人脸核验开发笔记