专栏首页技术拓展与说明基于(PHP)人脸核身微信H5页面(普通模式)搭建
原创

基于(PHP)人脸核身微信H5页面(普通模式)搭建

前言区分

独立h5: 数字、 眨眼

pc h5 : 眨眼

app: 光线、 数字、 动作

普通H5: 数字、 动作、 静默

微信H5: 数字、 光线、 光线 + 数字

小程序: 数字、 光线、 光线 + 数字

API:活体人脸比对、活体人脸核身: 数字、 动作、 静默

一、准备工作

(1)开通腾讯云 https://cloud.tencent.com/

(2)腾讯云控制台开通人脸核身权限 https://console.cloud.tencent.com/faceid/access

(3)控制台设置秘钥 https://console.cloud.tencent.com/cam/capi

温馨提示:

注册腾讯云账号且实名认证: https://cloud.tencent.com/

注意:子账号与子账号, 主账号与主账号之间创建的 `ruleid` 及秘钥不互通, 不可互相查看, 不可互相调用, 简单来说就是 A 账号创建的 `ruleid` 只能由 A 账号的秘钥来调用, 常见问题表现于 `ruleid `不存在, `ruleid is not exist`**

计费会统一计算在主账号, 主账号统一结算, 调用量可以用子账号区分

`API `密钥是构建腾讯云 `API `请求的重要凭证,您的 `API `密钥代表您的账号身份和所拥有的权限,等同于您的登录密码,请勿通过任何方式(如 `GitHub`)上传或者分享您的密钥信息,一旦泄露至外部渠道,可能造成您的云上资产重大损失

二、公众号流程准备

公众平台:https://mp.weixin.qq.com/ (仅支持认证过的公众号,订阅号不支持,当前项目以订阅号方式申请测试公众号进行请求)

注册后,进入平台后台->开发者工具

申请测试账号
关注测试号

生成测试公众号菜单

在线测试工具

获取access_token,生成菜单需要access_token入参,access_token有效期2小时

获取access_token

生成菜单

请求生成菜单
#菜单Json数据
{
    "button": [
        {
            "type": "view", 
            "name": "人脸核身", 
            "url": "http://xxxxx" #说明:你的入口地址
        }
    ]
}

具体效果

具体效果

三、普通 H5 接入流程准备工作

选择接入模式
默认设置,根据自身要求调整
选择静默模式

四、入口文件发起人脸核身请求

注意:人脸核身鉴权是收费的,此代码未做缓存,发起一次后不管是否继续鉴权,都会计一次调用费用,请谨慎使用

计费规则:https://cloud.tencent.com/document/product/1007/31005

PHP入口执行文件

(1)V3自主鉴权方式获取实名核身鉴权(DetectAuth)中用于发起核身流程的URL,仅微信H5场景使用。

(2)获取结构,URL执行跳转,跳转到相应H5执行

(3)参考文档:https://cloud.tencent.com/document/api/1007/31816

{
  "Response": {
    "BizToken": "CE661F1A-0F1E-45BD-BE13-34C05CEA7681",
    "Url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2cca36a86d5035ae&redirect_uri=http%3A%2F%2Fopen.faceid.qq.com%2Fv1%2Fapi%2FgetCode%3FbizRedirect%3Dhttp%253A%252F%252Ffaceid.qq.com%252Fapi%252Fauth%252FgetOpenidAndSaveToken%253Ftoken%253DCE661F1A-0F1E-45BD-BE13-34C05CEA7681&response_type=code&scope=snsapi_base&state=&component_appid=wx9802ee81e68d6dee#wechat_redirect",
    "RequestId": "f904f4cf-75db-4f8f-a5ec-dc4f942c7f7a"
  }
}

<?php
class Face
{
    const SecretId = "请填入秘钥";
    const SecretKey = "请填写秘钥";
    const Url = "https://faceid.tencentcloudapi.com";

    //算法
    const Algo = "sha256";
    //规范请求串
    const HTTPRequestMethod = "POST";
    const CanonicalURI = "/";
    const CanonicalQueryString = "";
    const CanonicalHeaders = "content-type:application/json; charset=utf-8\nhost:faceid.tencentcloudapi.com\n";
    const SignedHeaders = "content-type;host";//参与签名的头部信息

    //签名字符串
    const Algorithm = "TC3-HMAC-SHA256";
    const Service = "faceid";
    const Stop = "tc3_request";

    /**
     * 实名核身鉴权
     */
    public function getDetectAuth()
    {
        $param = [
            'RuleId' => "1",//用于细分客户使用场景,申请开通服务后,可以在腾讯云慧眼人脸核身控制台(https://console.cloud.tencent.com/faceid) 自助接入里面创建,审核通过后即可调用
        ];
        return self::getCommonPostRequest("DetectAuth", $param);
    }


    /**
     * 鉴权
     * @param string $action 方法
     * @param array $param 参数
     * @param string $version 版本号
     * @return array
     */
    private static function getCommonPostRequest($action, array $param = [], $version = "2018-03-01")
    {
        //时间戳
        $timeStamp = time();
        //$timeStamp       =   1586333773;
        //参数转化Json
        $paramJson = json_encode($param);
        //规范请求串
        $hashedRequestPayload = self::HashEncryption($paramJson);
        $canonicalRequest = self::HTTPRequestMethod . "\n" .
            self::CanonicalURI . "\n" .
            self::CanonicalQueryString . "\n" .
            self::CanonicalHeaders . "\n" .
            self::SignedHeaders . "\n" .
            $hashedRequestPayload;
        //签名字符串
        $date            =   gmdate("Y-m-d", $timeStamp);//UTC 0时区的值
        $credentialScope = $date . "/" . self::Service . "/" . self::Stop;
        $hashedCanonicalRequest = self::HashEncryption($canonicalRequest);
        $stringToSign = self::Algorithm . "\n" .
            $timeStamp . "\n" .
            $credentialScope . "\n" .
            $hashedCanonicalRequest;


        //计算签名
        $secretDate = self::HashHmacSha256Encryption($date, 'TC3' . self::SecretKey);
        $secretService = self::HashHmacSha256Encryption(self::Service, $secretDate);
        $secretSigning = self::HashHmacSha256Encryption(self::Stop, $secretService);

        //签名
        $signature = self::HashHmacSha256Encryption($stringToSign, $secretSigning, false);
        echo $signature . " \n";
        $authorization = self::Algorithm . ' ' .
            'Credential=' . self::SecretId . '/' . $credentialScope . ', ' .
            'SignedHeaders=' . self::SignedHeaders . ', ' .
            'Signature=' . $signature;
        //Header头部
        $headers = [
            "Authorization: $authorization",
            "Host: faceid.tencentcloudapi.com",
            "Content-Type: application/json; charset=utf-8",
            "X-TC-Action: $action",
            "X-TC-Version: $version",
            "X-TC-Timestamp: $timeStamp",
            "X-TC-Region: ap-beijing"
        ];
        //请求
        $response = self::get_curl_request(self::Url, $paramJson, self::HTTPRequestMethod, $headers);
        //解析
        if (!$response) {
            return ['code' => 0, 'codeError' => '1002', 'msg' => 'Interface request failed'];
        }
        $response = json_decode($response, true);
        if (!isset($response['Response'])) {
            return ['code' => 0, 'codeError' => '1003', 'msg' => 'Response error'];
        }
        if (isset($response['Response']['Error'])) {
            return [
                'code' => 0
                , 'codeError' => $response['Response']['Error']['Code']
                , 'msg' => $response['Response']['Error']['Message']
                , 'RequestId' => $response['Response']['RequestId']
            ];
        } else {
            return ['code' => 1, 'msg' => 'ok', 'data' => $response['Response']];
        }
    }

    private static function HashEncryption($sign)
    {
        return strtolower(hash(self::Algo, $sign));
    }

    private static function HashHmacSha256Encryption($sign, $key, $flag = true)
    {
        return hash_hmac(self::Algo, $sign, $key, $flag);
    }

    /**
     * @param $url
     * @param array $param
     * @param string $mothod
     * @param array $headers
     * @param int $return_status
     * @param int $flag
     * @return array|bool|string
     */
    public static function get_curl_request($url, $param = [], $mothod = 'POST', $headers = [], $return_status = 0, $flag = 0)
    {
        $ch = curl_init();
        if (!$flag) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        }
        curl_setopt($ch, CURLOPT_TIMEOUT, 6);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if (strtolower($mothod) == 'post') {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
        } else {
            $url = $url . "?" . http_build_query($param);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 2);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        #curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1"); //代理服务器地址
        #curl_setopt($ch, CURLOPT_PROXYPORT, 12639); //代理服务器端口
        $ret = curl_exec($ch);
        $code = curl_getinfo($ch);
        curl_close($ch);
        if ($return_status == "1") {
            return array($ret, $code);
        }
        return $ret;
    }
}

//执行
$model = new Face();
$response = $model->getDetectAuth();
if ($response["code"] == 1) {
    //获取到鉴权URL进行跳转
    $url = $response["data"]["Url"];
    //鉴权并且调用人脸核身
    header("Location: {$url}");
} else {
    var_dump($response);
}

五、执行效果

搭建成功,记得给小编点个赞!!!!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信普通H5接入腾讯云慧眼活体人脸核身SAAS服务

    腾讯云慧眼人脸核身(原金融级身份认证升级版)是一组对用户身份信息真实性进行验证审核的服务套件,提供各类认证功能模块,包含证件 OCR 识别、活体检测、人脸1:1...

    周朋伟
  • 人脸核身微信普通H5接入流程演示

    在使用创建的流程前,我们需要知道该流程的逻辑结构是什么,通过查阅官方文档,可以知道微信H5流程的逻辑结构如下:

    张世强
  • 人脸核身iOS静默验证模式搭建

    (2)腾讯云控制台开通人脸核身权限 https://console.cloud.tencent.com/faceid/access

    许岳操
  • 增强版人脸核身产品上线,新增设备风险识别、智能分级认证能力,去了解 >>

    增强版人脸核身服务在基础版人脸核身的基础上,通过设备安全增强、活体安全增强、智能分级认证增强,全面升级核身安全能力,能够在刷脸核身的同时实时检测当前设备的风险,...

    TCS-F
  • Android 搭建人脸核身静默验证模式

    (2)腾讯云控制台开通人脸核身权限 https://console.cloud.tencent.com/faceid/access

    袁伦桥
  • 实验列表

    1.Linux 基础入门 https://cloud.tencent.com/developer/labs/lab/10000

    蒋小爱
  • 简单几步,让微信小程序变身 H5 网页? | 云开发实战

    我是 盛瀚钦,沪江 CCtalk 前端开发工程师,Taro 框架的 issue 维护志愿者,主要侧重于前端 UI 编写和团队文档建设。

    腾讯云开发TCB
  • web前端开发入门,学习路径以及具体的学习内容

    在本阶段,我们需要掌握 HTML 与 CSS 基础,当然,也包含 H5 和 C3 的新特性。这 个部分内容非常简单,而且非常容易掌握。相信你也更愿意学习这个部分...

    用户5827212
  • h5调用底层接口的一些知识

    王小婷
  • ThinkSNS Plus 2.0 产品体验报告

    一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案。

    ThinkSNS
  • h5调用底层接口的一些知识

          之前接触过这方面的知识,一直想写一些关于代码的文字,但考虑到浪费时间,又不具备大神的实力,也不想去把别人的代码照搬过来,所以一直都是空白着的,今天...

    王小婷
  • 9102年,你已经是个大春节了,你要自己学会用AI了

    2019 年,AI 为我们「渐渐无趣」的春节增色不少……它不仅可以帮助人们送出新年祝福,也能为人高效传递信息。在繁忙的春运期间,人工智能也能帮助人们更快地回到家...

    机器之心
  • web前端与手机应用的这些重点和知识点,你知道多少呢

    随着互联网、移动互联网的发展,HTML5成为了客户端软件开发的主流技术,HTML5实际上是由:HTML5语言、CSS3、JAVASCRIPT语言组成。

    用户5827212
  • 传统校服企业数字化转型,他们用微搭这样做

    利华校服的创始人高利华扎根教育行业多年,在一次印度的旅行中,她看到即使在一些生活环境恶劣的地区,校园里的孩子们依然穿着校服打着领带,散发着自信与阳光,内心受到强...

    腾讯云开发TCB
  • 慧眼人脸核身 | 新年超值钜惠,实名认证最低2折属你最牛

    ? 2020年是黑天鹅事件频发的一年 疫情从年初开始重挫各行业的发展 企业纷纷转战线上开拓破局 虽然目前全球形势依旧严峻 可缓慢复苏的迹象给2021年开了个...

    腾讯云AI
  • 最新HTML5学习路线整合

    HTML5是万维网的核心语言,标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改,一方面提升了用户体验,另一方面HTML5技术跨平台,适配多...

    wangxl
  • H5玩法知多少

    腾讯ISUX
  • 史上最明了的编程语言琅琊榜介绍:JavaScript是剪刀?

    小时候经常看局座的节目,得知局座掌握中、英、日、阿拉伯等多门语言 时羡慕不已,当时就许下一个心愿「我一定要成为掌握多门语言的男人」。今天,我的梦想终于实现了,我...

    前朝楚水
  • AI营销库 | 低成本精准引流:21世纪AI流量小花

    基于AI人脸定位与风水命理,对照片人物进行眼口鼻关键点定位,为人脸标记分析,准确识别多种面相特征,输出面相占卜结果。适用各种营销互动活动,引流等。

    极视角科技

扫码关注云+社区

领取腾讯云代金券