首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel reCaptcha集成

Laravel reCaptcha集成
EN

Stack Overflow用户
提问于 2017-05-30 09:21:35
回答 2查看 2.7K关注 0票数 3

我希望在我的Laravel项目中实现,而不需要使用包。我尝试过用经典的reCaptcha V2来工作,但是我想要实现不可见的reCaptcha。

所以我所做的是:

代码语言:javascript
复制
<form id="subscribeForm" class="form-inline" role="form" method="post" action="/subscribe" style="margin-bottom:70px;">
    ...
    ...
    <button type="submit" class="btn btn-default">{{trans('content.input_submit')}}</button>

    <div id="recaptcha" class="g-recaptcha" data-sitekey="---my---key---" data-size="invisible" data-callback="onSubmit"></div>

    <script> ...callback functions... </script>
</form>

右边的浮动reCaptcha条显示正确,但是当然,由于我需要一个按钮来执行实际提交,所以我有一个带有submit类型的按钮,并且reCaptcha div的回调函数都没有触发。当我返回请求时,g-recaptcha-response将为空。

为什么它不被提交独立于回调?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-30 11:08:03

reCaptcha的回调函数不会被触发,这取决于您在何处定义了回调函数。

它不应该在$(document).ready()window.onload范围内定义

若要向服务器提交captcha令牌,请在窗体中放置一个隐藏的输入字段。

代码语言:javascript
复制
<input type="hidden" name="reCaptchaToken" value="" id="reCaptchaToken">

将submit按钮替换为常规按钮,这样表单就不会提交,如果不需要,请删除captcha <div>

代码语言:javascript
复制
<button type="button" class="btn btn-default g-recaptcha" data-sitekey="your_site_key" data-callback='onSubmit'>{{trans('content.input_submit')}}</button>

并且可以使用回调函数填充值并提交表单。

代码语言:javascript
复制
// Google reCaptcha callback
function onSubmit (res) {
    document.getElementById("reCaptchaToken").value = res;
    document.getElementById("subscribeForm").submit();
}

并使用Input::get('reCaptchaToken')访问控制器中的captcha令牌。

票数 1
EN

Stack Overflow用户

发布于 2017-06-22 15:20:47

下面是如何通过扩展Validator来正确地完成这个任务,但是这个解决方案使用的是google/recaptcha包(这比使用CURL要优雅得多)。

代码语言:javascript
复制
composer require google/recaptcha "~1.1"

recaptcha_secret_key或其他自定义配置文件中为config/app.phprecaptcha_site_key创建一个新的配置值。

AppServiceProvider boot()方法中:

代码语言:javascript
复制
Validator::extend('recaptcha', function ($attribute, $value, $parameters, $validator) {
    $recaptcha = new ReCaptcha(config('app.recaptcha_secret_key'));
    $resp = $recaptcha->verify($value, request()->ip());

    return $resp->isSuccess();
});

resources/lang/validation.php中添加:

代码语言:javascript
复制
'recaptcha' => 'The :attribute answer is invalid.',

另外,将其添加到同一个文件中的attributes数组中,以使错误消息更好:

代码语言:javascript
复制
'g-recaptcha-response' => 'reCAPTCHA',

在视图文件中,要显示reCAPTCHA (例如,contact.blade.php )

代码语言:javascript
复制
<div class="g-recaptcha" data-sitekey="{{ config('app.recaptcha_site_key') }}"></div>
<script src="https://www.google.com/recaptcha/api.js"></script>

如果您想要将data-size="invisible"等添加到div中,它是不可见的。

最后,将新的验证规则添加到控制器中:

代码语言:javascript
复制
'g-recaptcha-response' => 'recaptcha'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44258290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档