【问题标题】:Next.js how to implement react-google-recaptcha in my contact formNext.js 如何在我的联系表单中实现 react-google-recaptcha
【发布时间】:2021-09-15 19:03:55
【问题描述】:

我正在尝试在 Next.js 中的联系表单上实施 Google Recaptcha。它会在需要时弹出挑战,但无论如何都会发送表单。 到目前为止,这是我的代码:

  // Recaptcha
  const recaptchaRef = useRef();

  // Form validation
  const [validated, setValidated] = useState(false);

  // Reset form
  const formRef = useRef();
  const handleReset = () => {
    formRef.current.reset();
    setValidated(false);
  };

  // Thank you Message
  const [thankYouMessage, setThankYouMessage] = useState(false);

  // Form submit handler
  async function handleSubmit(e) {
    e.preventDefault();
    e.stopPropagation();

    // Execute the reCAPTCHA when the form is submitted
    recaptchaRef.current.execute();

    const formData = new FormData();

    Array.from(e.currentTarget.elements).forEach((field) => {
      if (!field.name) return;
      formData.append(field.name, field.value);
    });

    await fetch(process.env.NEXT_PUBLIC_WORDPRESS_CF7_ENDPOINT, {
      body: formData,
      method: "POST",
    })
      .then((response) => response.json())
      .then((response) => {
        if (response.status === "mail_sent") {
          setThankYouMessage(!thankYouMessage);
        } else if (response.status === "mail_failed") {
          alert("Message failed to send.");
        }
      });

    setValidated(true);
    handleReset();
    recaptchaRef.current.reset();
  }

在表格上:

  <Form
    ref={formRef}
    validated={validated}
    onSubmit={handleSubmit}
  >
    <ReCAPTCHA
      ref={recaptchaRef}
      size="invisible"
      sitekey={process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY}
    />

这当然行不通,因为即使 recaptcha 被触发,它仍然会发送表单。

我尝试在&lt;ReCAPTCHA /&gt; 上添加onChange={onReCAPTCHAChange},但随后出现错误Uncaught (in promise) ReferenceError

  const onReCAPTCHAChange = (captchaCode) => {
    // If the reCAPTCHA code is null or undefined indicating that
    // the reCAPTCHA was expired then return early
    if (!captchaCode) {
      return;
    }
    // Else reCAPTCHA was executed successfully so proceed with the
    // alert
    alert(`Hey, ${email}`);
    // Reset the reCAPTCHA so that it can be executed again if user
    // submits another email.
    recaptchaRef.current.reset();
  };

【问题讨论】:

  • 尝试将 reCAPTCHA 检查后需要发生的任何事情转移到 onReCAPTCHAChange 函数。
  • 啊,我想我明白了。您的意思是将handleSubmit 操作放入onReCAPTCHAChange 函数中,对吗?
  • 是的,我就是这个意思。
  • @juliomalves 我尝试将 async function handleSubmit(e) 中的所有内容放在 onReCAPTCHAChange 中,但随后 handleSubmit 函数将不起作用。介意给我写个例子吗?

标签: reactjs next.js recaptcha react-google-recaptcha


【解决方案1】:

我认为在你的handleSubmit中你可以使用executeAsync这样的方法(如官方文档所示),这样你应该可以在handleSubmit中编写所有内容:

import ReCAPTCHA from "react-google-recaptcha";
 
 
const ReCAPTCHAForm = (props) => {
  const recaptchaRef = React.useRef();
 
  const handleSubmit = async () => {
    try {
       const token = await recaptchaRef.current.executeAsync();
       // Add your API call code here also pass token to API
    } catch(error) {
      // handle validation error
    }
 
    
  }
 
  return (
    <form onSubmit={handleSubmit}>
      <ReCAPTCHA
        ref={recaptchaRef}
        size="invisible"
        sitekey="Your client site key"
      />
    </form>
  )
 
}
 
ReactDOM.render(
  <ReCAPTCHAForm />,
  document.body
);

【讨论】:

  • 您好,感谢您的回答。可悲的是我没有得到这个// Add your API call code here also pass token to API 我在哪里将token 传递给?
  • 向项目的 API 开发人员询问,recaptcha 令牌需要在后端进行验证,否则不会增加任何真正的安全性。
  • 哦,我现在明白了,所以我必须将该令牌传递给 API。我使用 WordPress Contact Form 7 作为 API。它确实让我添加了一个 recaptcha 选项。必须弄清楚那个端点是什么。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
相关资源
最近更新 更多