reCAPTCHA是Google拥有的人工验证系统。
reCAPTCHA目前下载量是12 105 196,php开发网站验证码使用量第一的位置,作为行为验证,免费开源无疑是最大的亮点
但是国内一般使用不了。但是本教程已解决此问题
本教程基于laravel5.8 完成的开发和使用,php版本为7.0,具体环境要求参考
需要科学上网,具体教程参考
composer require google/recaptcha
site/routes/web.php
//前端路由
Route::group(['prefix' => 'front'], function ($router) {
Route::get('captcha', "Front\SourceController@captcha");//发送谷歌验证
Route::get('checkCaptcha', "Front\SourceController@checkCaptcha");//发送谷歌验证
});
site/app/Http/Controllers/Front/SourceController.php
//控制器代码
/**
* Notes:测试谷歌验证码
* Created by PhpStorm.
* User: guofu
* Date: 2020/5/14
* Time: 下午5:06
*/
public function captcha(Request $request)
{
return view('front/captcha');
}
site/resources/views/front/captcha.blade.php
//前台页面代码
<!DOCTYPE html>
<html>
<head>
<title>google验证码V2</title>
<meta charset="UTF-8">
</head>
<body>
<div id="google-reCaptcha"></div>
<button>验证后提交</button>
</body>
{{--注意此处的js换成国内地址--}}
<script src="https://www.recaptcha.net/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer> </script>
<script type="text/javascript">
var verifyCallback = function(token) {
document.querySelector('button').addEventListener('click', () => {
console.log('客户端token:' + token);
fetch('/front/checkCaptcha?code=' + token, {
method: 'GET'
}).then(response => {
if (response.ok){
response.json().then(message => {
console.log('服务端验证');
console.log(message);
alert(message);
});
}
});
});
};
var onloadCallback = function() {
grecaptcha.render('google-reCaptcha', {
'sitekey' : '你的网站密钥',
'callback' : verifyCallback,
'theme' : 'light'
});
};
</script>
</html>
/**
* Notes:检查验证码
* Created by PhpStorm.
* User: guofu
* Date: 2020/5/18
* Time: 上午11:29
* @param Request $request
*/
public function checkCaptcha(Request $request)
{
$url='https://www.recaptcha.net/recaptcha/api/siteverify';//国内的js
$code=$request->get("code");
$data=[
'secret' =>'你的密钥,注意:和网站密钥不一样' ,
'response' => $code,
];
$query = http_build_query($data);
$options['http'] = array(
'timeout'=>60,
'method' => 'POST',
'header' => 'Content-type:application/x-www-form-urlencoded',
'content' => $query
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
}
{
"success": true,
"challenge_ts": "2020-05-19T08:21:06Z",
"hostname": "www.imitao1.tech"
}
# 附相关错误码
Error code Description
missing-input-secret The secret parameter is missing.
invalid-input-secret The secret parameter is invalid or malformed.
missing-input-response The response parameter is missing.
invalid-input-response The response parameter is invalid or malformed.
bad-request The request is invalid or malformed.
timeout-or-duplicate The response is no longer valid: either is too old or has been used previously.
POST Parameter Description
secret Required. The shared key between your site and reCAPTCHA.
response Required. The user response token provided by the reCAPTCHA client-side integration on your site.
remoteip Optional. The user's IP address
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<button onclick="sent()">点击验证</button>
</head>
<body>
</body>
</html>
<script src="/common/js/jquery.js"></script> <!-- 你必须先引入jQuery1.8或以上版本 -->
<script src="https://www.google.com/recaptcha/api.js?render=6Le85PgUAAAAADGSMnwBg0pzm1efnsWanOnJt8DI"></script>
<script>
function sent(){
grecaptcha.ready(function() {
grecaptcha.execute('网站密钥', {action: 'homepage'}).then(function(token) {
$.get("/front/checkCaptcha?code="+token, function(result){
});
console.log(token);
});
});
}
</script>
{
"success": true,
"challenge_ts": "2020-05-19T08:35:22Z",
"hostname": "www.imitao1.tech",
"score": 0.9,
"action": "homepage"
}