【问题标题】:Laravel reCaptcha integrationLaravel reCaptcha 集成
【发布时间】:2017-10-30 16:41:27
【问题描述】:

我想在我的 Laravel 项目中使用 Laravel 包实现 reCaptcha。我已经尝试过使用经典的 reCaptcha V2,它可以工作,但我想实现隐形 reCaptcha。

所以我做的是这样的:

<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 为空。

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

【问题讨论】:

标签: php laravel recaptcha


【解决方案1】:

reCaptcha 的回调函数不会被触发,这取决于你在哪里定义了你的回调函数。

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

要将验证码令牌提交到服务器,请在表单中放置一个隐藏的输入字段

<input type="hidden" name="reCaptchaToken" value="" id="reCaptchaToken">

将提交按钮替换为常规按钮,以便不提交表单,删除验证码&lt;div&gt;,因为它不需要。

<button type="button" class="btn btn-default g-recaptcha" data-sitekey="your_site_key" data-callback='onSubmit'>{{trans('content.input_submit')}}</button>

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

// Google reCaptcha callback
function onSubmit (res) {
    document.getElementById("reCaptchaToken").value = res;
    document.getElementById("subscribeForm").submit();
}

并使用Input::get('reCaptchaToken')访问控制器中的验证码

【讨论】:

  • 但是您的代码中没有data-sitekey。我应该如何以这种方式获得 Google 响应?这只是填充隐藏字段的通用方法,而不是让 reCaptcha 正常运行?
  • 你有data-sitekey 在你的recaptcha div 你需要添加这个隐藏的输入字段
  • 哦..现在我看到这只是输入。问题是data-callback 没有做任何事情。我不知道是否有一些特殊的方法来注册一个函数,因为脚本中的一个不会被调用。在我的 IDE 中它甚至是灰色的,好像没有使用过一样
  • 好吧,可能是因为您在调用数据回调之前提交了表单。
  • 如何避免?
【解决方案2】:

这里是如何通过扩展 Validator 来正确执行此操作,但是此解决方案使用 google/recaptcha 包(比使用 CURL 更优雅)。

composer require google/recaptcha "~1.1"

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

AppServiceProviderboot()方法中:

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 中添加:

'recaptcha' => 'The :attribute answer is invalid.',

此外,将其添加到同一文件内的 attributes 数组中,以使错误消息更清晰:

'g-recaptcha-response' => 'reCAPTCHA',

在您想要显示 reCAPTCHA 的视图文件中,例如contact.blade.php:

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

如果您希望 div 不可见,请将 data-size="invisible" 等添加到 div。

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

'g-recaptcha-response' => 'recaptcha'

【讨论】:

  • 你能详细说明最后一部分关于控制器中的验证规则吗?那条线到底应该去哪里?我正在通过 POST 网络路由提交我的联系表。我的 reCaptcha 显示在任何地方都没有最后一行 ('g-recaptcha-response' =&gt; 'recaptcha'),但是当未选中复选框时,不会阻止表单提交。
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2019-08-15
相关资源
最近更新 更多