ThinkPHP接入腾讯云天御验证码 腾讯云验证码

释放双眼,带上耳机,听听看~!

腾讯官方提供的SDK比较多 这边业务只需要验证码 所以才有以下内容

首先还是建议详细阅读官方文档 文档地址
首先是前端接入
快速接入
以下为 Web 端快速接入流程,适用于每次都需要进行人机验证的场景(登录、注册、下发短信、活动等)。

在 Head 标签的最后加入以下代码,引入验证 JS 文件(建议直接在 HTML 中引入)。

<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>

在您需要激活验证码的 DOM 元素(button、div、span)内加入以下 ID 及属性。

<!--点击此元素会自动激活验证码-->
<!--id : 元素的 ID (必须)-->
<!--data-appid : AppID(必须)-->
<!--data-cbfn : 回调函数名(必须)-->
<!--data-biz-state : 业务自定义透传参数(可选)-->
<button id="TencentCaptcha"
     data-appid="appId"
     data-cbfn="callback"
     type="button"
>验证</button>

为验证码创建回调函数
注意:
函数名要与 data-cbfn 相同。

window.callback = function(res){
 console.log(res)
 // res(用户主动关闭验证码)= {ret: 2, ticket: null}
 // res(验证成功) = {ret: 0, ticket: "String", randstr: "String"}
 if(res.ret === 0){
     alert(res.ticket)   // 票据
 }
}

完成以上操作后,单击激活验证码的 DOM 元素,即可弹出验证码。至此,验证码客户端接入已完成
最后获得到的是 ticket 和 randstr 用于后续操作

后面主要说后端部分

首先在thinkphp的.env文件加入配置 配置格式如下

https://console.cloud.tencent.com/cam/capi 这里可以取到app_secret_id和app_secret_key

https://console.cloud.tencent.com/captcha 这里可以取到
ThinkPHP接入腾讯云天御验证码  腾讯云验证码

[qcloud]
captcha_app_id = ******
captcha_secret_key =******
app_secret_id = ******
app_secret_key = *******

以下是我自己简单封装的类

<?php
namespace  自己选个地方
use think\Env;
class TencentCaptcha
{
    const BASE_API_URL = "https://captcha.tencentcloudapi.com";
    const VERSION = "2019-07-22";

    /**
     * 检查验证码结果
     * @param $ticket 前端传递的票据
     * @param $randstr  前端传递的随机字符串
     * @param $ip      用户端ip
     * @return mixed|string
     */
    public static function checkCaptchaResult($ticket,$randstr,$ip)
    {
        $qcloud = new TencentCaptcha();
        $params = [
            'Action'      =>'DescribeCaptchaResult',
            'CaptchaType' => 9,
            'Ticket'      =>$ticket,
            'UserIp'      =>$ip,
            'Randstr'     =>$randstr,
            'CaptchaAppId'=>Env::get('qcloud.captcha_app_id'),
            'AppSecretKey'=>Env::get('qcloud.captcha_secret_key'),
            'SecretId'    =>Env::get('qcloud.app_secret_id'),
            'Nonce'       => $qcloud->getRandom(),
            'Timestamp'   => time(),
            'Version'     => self::VERSION
        ];
        $signature =  $qcloud->calculateSig($params);
        $params['Signature'] = $signature;
        $result = $qcloud->post_request(self::BASE_API_URL,$params);
        return $result;
    }
    /**
     * 参数加签名
     *
     */
    public function calculateSig($params)
    {
        //第一步排序
        ksort($params);
        //第二步拼接参数
        $signStr = "POSTcaptcha.tencentcloudapi.com/?";
        foreach ( $params as $key => $value ) {
            $signStr = $signStr . $key . "=" . $value . "&";
        }
        $signStr = substr($signStr, 0, -1);
        //第三部HMAC-SHA1加密
        $signature = base64_encode(hash_hmac("sha1", $signStr,Env::get('qcloud.app_secret_key'), true));
        return  $signature;
    }
    /**
     * 生成随机数
     *
     * @return int 随机数结果
     */
    public function getRandom()
    {
        return rand(100000, 999999);
    }
    /**
     *
     * @param       $url
     * @param string $postdata
     * @return mixed|string
     */
    private function post_request($url, $postdata = '')
    {
        if (!$postdata) {
            return false;
        }

        $data = http_build_query($postdata);
        if (function_exists('curl_exec')) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
            curl_setopt($ch, CURLOPT_TIMEOUT, 60);

            //不可能执行到的代码
            if (!$postdata) {
                curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            } else {
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            }
            $data = curl_exec($ch);

            if (curl_errno($ch)) {
                $err = sprintf("curl[%s] error[%s]", $url, curl_errno($ch) . ':' . curl_error($ch));
                $this->triggerError($err);
            }

            curl_close($ch);
        } else {
            if ($postdata) {
                $opts = array(
                    'http' => array(
                        'method'  => 'POST',
                        'header'  => "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n",
                        'content' => $data,
                        'timeout' => 60
                    )
                );
                $context = stream_context_create($opts);
                $data = file_get_contents($url, false, $context);
            }
        }

        return $data;
    }
}

实际简单调用,可以根据文档中的错误码做错误判断,这里仅展示简单逻辑

            $result =TencentCaptcha::checkCaptchaResult($ticket,$randstr,$ip);
            $ret = json_decode($result);
            if($ret->Response->CaptchaCode != 1){
                $this->error('验证失败');
            }

给TA打赏
共{{data.count}}人
人已打赏
php笔记

用PHP实现常见的算法

2020-5-7 3:32:47

php笔记

通过Apache和Nginx解决跨域问题

2020-7-20 10:16:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索