腾讯官方提供的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 用于后续操作
后面主要说后端部分
https://console.cloud.tencent.com/cam/capi 这里可以取到app_secret_id和app_secret_key
https://console.cloud.tencent.com/captcha 这里可以取到
[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('验证失败');
}