我正在使用PHP开发一个网站,我想在其中一个会话中进行人工验证。对于开发,我最初在本地运行系统,当它准备好时,我将把它放在某个域中。

在reCAPTCHA网站上说插件只能在给定的域(和子域)上工作。

有没有办法在本地主机上使用reCAPTCHA插件?


当前回答

很简单:

转到谷歌reCAPTCHA管理面板 将localhost & 127.0.0.1添加到新站点的域,如下图所示。


更新:

如果你的问题是如何在谷歌网站上设置reCAPTCHA,以便在localhost中使用它,那么它就像我上面写的那样,但如果你好奇如何在localhost和网站主机上使用reCAPTCHA,只需在控制器中使用最少的代码,并防止一些代码,如ConfigurationManager。AppSettings["ReCaptcha:SiteKey"]在里面,然后我在我的回答中帮助你这个额外的描述和代码。

您喜欢下面的GET和POST操作吗?

下面的代码支持reCAPTCHA,不需要任何其他代码来处理reCAPTCHA。

[HttpGet]
[Recaptcha]
public ActionResult Register()
{
    // Your code in the GET action
}

[HttpPost]
[Recaptcha]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterViewModel model, string reCaptcha_SecretKey){
   // Your code in the POST action
   if (!ModelState.IsValid || !ReCaptcha.Validate(reCaptcha_SecretKey))
   {
       // Your code
   }
   // Your code
}

In View:(参考)

@ReCaptcha.GetHtml(@ViewBag.publicKey)

@if (ViewBag.RecaptchaLastErrors != null)
{
    <div>Oops! Invalid reCAPTCHA =(</div>
}

使用它

A)在您的Web项目中添加以下ActionFilter:

public class RecaptchaAttribute : FilterAttribute, IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var setting_Key = filterContext.HttpContext.Request.IsLocal ? "ReCaptcha_Local" : "ReCaptcha";
        filterContext.ActionParameters["ReCaptcha_SecretKey"] = ConfigurationManager.AppSettings[$"{setting_Key}:SecretKey"];
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var setting_Key = filterContext.HttpContext.Request.IsLocal ? "ReCaptcha_Local" : "ReCaptcha";
        filterContext.Controller.ViewBag.Recaptcha = ReCaptcha.GetHtml(publicKey: ConfigurationManager.AppSettings[$"{setting_Key}:SiteKey"]);
        filterContext.Controller.ViewBag.publicKey = ConfigurationManager.AppSettings[$"{setting_Key}:SiteKey"];
    }
}

B)在你的webconfig文件中添加localhost和website的reCAPTCHA设置键:

<appSettings>

    <!-- RECAPTCHA SETTING KEYS FOR LOCALHOST -->
    <add key="ReCaptcha_Local:SiteKey" value="[Localhost SiteKey]" />
    <add key="ReCaptcha_Local:SecretKey" value="[Localhost SecretKey]" />
    <!-- RECAPTCHA SETTING KEYS FOR WEBSITE -->
    <!--<add key="ReCaptcha:SiteKey" value="[Webite SiteKey]" />
    <add key="ReCaptcha:SecretKey" value="[Webite SecretKey]" />-->

    <!-- OTHER SETTING KEYS OF YOUR PROJECT -->

</appSettings>

注意:通过这种方式,您不需要在post操作中设置reCaptcha_SecretKey参数,也不需要在您的操作和视图中手动设置任何用于reCaptcha的ViewBag。所有这些都将在运行时自动填充,并根据您是在本地主机上还是在网站上运行项目而具有适当的值。

其他回答

请注意,从2016年起,reCAPTCHA不再支持本地主机。常见问题解答:

默认情况下不再支持本地主机域。如果你愿意 继续支持他们的发展,你可以将他们添加到列表中 您的站点密钥支持的域。转到管理控制台 更新受支持的域列表。我们建议使用单独的钥匙 用于开发和生产,并且不允许在您的 生产站点密钥。

只需将localhost添加到您的站点域名列表中,就可以了。

我在Laravel网站上得到了一个与reCAPTCHA相关的错误。我通过使用一些命令和一个env文件解决了这个问题,以前的答案也将有助于解决这个问题。

首先,检查env文件(在您的示例中,该文件具有谷歌reCAPTCHA密钥)中的谷歌reCAPTCHA密钥。

其次,运行这些命令:

PHP工匠配置:清除 PHP工匠缓存:清除 作曲家dump-autoload PHP工匠视图:清除 PHP工匠路线:清除

它会解决你的问题。

很简单:

转到谷歌reCAPTCHA管理面板 将localhost & 127.0.0.1添加到新站点的域,如下图所示。


更新:

如果你的问题是如何在谷歌网站上设置reCAPTCHA,以便在localhost中使用它,那么它就像我上面写的那样,但如果你好奇如何在localhost和网站主机上使用reCAPTCHA,只需在控制器中使用最少的代码,并防止一些代码,如ConfigurationManager。AppSettings["ReCaptcha:SiteKey"]在里面,然后我在我的回答中帮助你这个额外的描述和代码。

您喜欢下面的GET和POST操作吗?

下面的代码支持reCAPTCHA,不需要任何其他代码来处理reCAPTCHA。

[HttpGet]
[Recaptcha]
public ActionResult Register()
{
    // Your code in the GET action
}

[HttpPost]
[Recaptcha]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterViewModel model, string reCaptcha_SecretKey){
   // Your code in the POST action
   if (!ModelState.IsValid || !ReCaptcha.Validate(reCaptcha_SecretKey))
   {
       // Your code
   }
   // Your code
}

In View:(参考)

@ReCaptcha.GetHtml(@ViewBag.publicKey)

@if (ViewBag.RecaptchaLastErrors != null)
{
    <div>Oops! Invalid reCAPTCHA =(</div>
}

使用它

A)在您的Web项目中添加以下ActionFilter:

public class RecaptchaAttribute : FilterAttribute, IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var setting_Key = filterContext.HttpContext.Request.IsLocal ? "ReCaptcha_Local" : "ReCaptcha";
        filterContext.ActionParameters["ReCaptcha_SecretKey"] = ConfigurationManager.AppSettings[$"{setting_Key}:SecretKey"];
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var setting_Key = filterContext.HttpContext.Request.IsLocal ? "ReCaptcha_Local" : "ReCaptcha";
        filterContext.Controller.ViewBag.Recaptcha = ReCaptcha.GetHtml(publicKey: ConfigurationManager.AppSettings[$"{setting_Key}:SiteKey"]);
        filterContext.Controller.ViewBag.publicKey = ConfigurationManager.AppSettings[$"{setting_Key}:SiteKey"];
    }
}

B)在你的webconfig文件中添加localhost和website的reCAPTCHA设置键:

<appSettings>

    <!-- RECAPTCHA SETTING KEYS FOR LOCALHOST -->
    <add key="ReCaptcha_Local:SiteKey" value="[Localhost SiteKey]" />
    <add key="ReCaptcha_Local:SecretKey" value="[Localhost SecretKey]" />
    <!-- RECAPTCHA SETTING KEYS FOR WEBSITE -->
    <!--<add key="ReCaptcha:SiteKey" value="[Webite SiteKey]" />
    <add key="ReCaptcha:SecretKey" value="[Webite SecretKey]" />-->

    <!-- OTHER SETTING KEYS OF YOUR PROJECT -->

</appSettings>

注意:通过这种方式,您不需要在post操作中设置reCaptcha_SecretKey参数,也不需要在您的操作和视图中手动设置任何用于reCaptcha的ViewBag。所有这些都将在运行时自动填充,并根据您是在本地主机上还是在网站上运行项目而具有适当的值。

你可以写“localhost”或“127.0.0.1”,但URL必须相同。

例如:谷歌domain Add -> localhost URL => localhost/login.php

例如:谷歌域Add -> 127.0.0.1 URL => 127.0.0.1/login.php

对我来说,它可以删除我的实际配置并创建一个新的配置,添加如下域: