我正在用Grav创建一个网站。我使用Zammad作为票务系统,并希望在页面上包含反馈表单。为此,我使用了Zammad "https://admin-docs.zammad.org/en/latest/channels/form.html"“的应用程序接口。这就像它一样工作。可以通过表单创建新的票证。现在我想添加一个机器人保护。为此,我选择了hCaptcha。https://docs.hcaptcha.com/ (谷歌reCaptcha可以毫不费力地使用现成的插件”表单“,但我不想使用谷歌reCaptcha)。我也已经开始为hCaptcha编写一个插件,但我找不到正确的Grav入口。
我当前的代码:
function onFormProcessed(Event $event){
if(is_entered_data_valid()) {
if(isset($_POST['h-captcha-response']) && !empty($_POST['h-captcha-response'])){
$secret = "0x0000000000000000000000000000000000000000";
$remote_address = $_SERVER['REMOTE_ADDR'];
$verify_url = "https://hcaptcha.com/siteverify?secret=".$secret."&response=".$_POST['h-captcha-response']."&remoteip=".$remote_address;
// This is hcaptcha url
$response = file_get_contents($verify_url); # Get token from post data with key 'h-captcha-response' and Make a POST request with data payload to hCaptcha API endpoint
$responseData = json_decode($response);
$success_msg="";
$err_msg="";
if($responseData->success){
$success_msg = "You can process your login functionality";
}else{
$err_msg = "Something went wrong while hCaptcha Validation. Please try again after sometime.";
}
}else{
$err_msg = "Please fill all the required fields";
}
} else {
// Server side validation failed
$error_output = "Please fill all the required fields";
}
// Get the response and pass it into your ajax as a response.
$return_msg = array(
'error' => $err_msg,
'success' => $success_msg
);
echo json_encode($return_msg);
}此函数必须在提交表单时执行
发布于 2021-09-01 16:14:12
如果你走对了方向,onFormProcessed就是你需要使用的事件。你可以从Grav的表单插件中学习。但是,您需要为您的插件定义一个特定的表单操作,否则您的代码将为站点上的所有表单运行,无论这些表单是否使用您的验证码。
假设您的表单操作是hcaptcha
public function onFormProcessed(Event $event): void
{
$form = $event['form'];
$action = $event['action'];
switch ($action) {
case 'hcaptcha':
// If captcha validation fails, stop the form processing.
if ($validation_fails) {
$message = "Please solve the captcha!";
$this->grav->fireEvent('onFormValidationError', new Event([
'form' => $form,
'message' => $message
]));
$event->stopPropagation();
return;
}https://stackoverflow.com/questions/67318015
复制相似问题