【问题标题】:Joomla, Sp Page Builder and ReCaptchaJoomla、Sp Page Builder 和 ReCaptcha
【发布时间】:2017-04-06 16:53:37
【问题描述】:

这是我第一次在 Joomla 中使用 SP Page Builder 组件。我想使用他们的联系表格,但它不支持 Google ReCaptcha。 我对编码足够好,认为我可以手动将它添加到:/com_sppagebuilder/addons/ajax_contact/site.php 并让它工作。 我确实添加了:<div class="g-recaptcha" data-sitekey="My_Key"></div>; 并且 Joomla ReCaptcha 插件被激活。 我不知道是否必须这样做,但我在 head 标签中添加了<script src='https://www.google.com/recaptcha/api.js'></script>。 有了这个,ReCaptcha 就很好了。

我的问题在于验证。 我确实尝试在 site.php 中添加一些验证代码,但我相信 SP Page Builder 使用 JFactory::getMailer();准备好电子邮件并发送,我对此一无所知。

因此,我不知道在哪里可以添加我的 ReCaptcha 验证码,而且我确实在网上找到了几个版本的代码,我真的不知道该使用哪一个。 我一直在到处寻找有关如何进行此验证的一些答案...我尝试了很多方法,但仍然无法正常工作。

谁能帮我解决这个问题?

非常感谢!

编辑

我觉得我的问题不够清楚:

我想添加 Recaptcha,它已经在我的网站上以其他形式正常工作(所以它不是 Joomla 问题的配置)。我想使用以下 SP Page Builder 联系表,而不是网站其余部分的 RSFormPro。验证过程应该围绕这部分完成,但我尝试添加谷歌验证代码,并尝试了我在互联网上找到的几个版本,它根本不起作用:

public static function getAjax() {
    $input = JFactory::getApplication()->input;
    $mail = JFactory::getMailer();

    //inputs
    $inputs             = $input->get('data', array(), 'ARRAY');

    foreach ($inputs as $input) {

        if( $input['name'] == 'recipient' ) {
            $recipient          = base64_decode($input['value']);
        }

        if( $input['name'] == 'email' ) {
            $email          = $input['value'];
        }

        if( $input['name'] == 'name' ) {
            $name           = $input['value'];
        }

        if( $input['name'] == 'subject' ) {
            $subject            = $input['value'];
        }

        if( $input['name'] == 'message' ) {
            $message            = nl2br( $input['value'] );
        }
    }

    /*Try at the validation*/
    $captcha_plugin = JFactory::getConfig()->get('captcha');
    if ($captcha_plugin != '0') {
    $captcha = JCaptcha::getInstance($captcha_plugin);
    $field_id = 'google-recaptcha';
     print $captcha->display($field_id, $field_id, 'g-recaptcha');
    }


    $sender = array($email, $name);
    $mail->setSender($sender);
    $mail->addRecipient($recipient);
    $mail->setSubject($subject);
    $mail->isHTML(true);
    $mail->Encoding = 'base64';
    $mail->setBody($message);

    if ($mail->Send()) {
        return '<span class="sppb-text-success">'. JText::_('COM_SPPAGEBUILDER_ADDON_AJAX_CONTACT_SUCCESS') .'</span>';
    } else {
        return '<span class="sppb-text-danger">'. JText::_('COM_SPPAGEBUILDER_ADDON_AJAX_CONTACT_FAILED') .'</span>';
    }
}

有什么建议吗?

谢谢!

【问题讨论】:

    标签: joomla captcha contact-form recaptcha


    【解决方案1】:

    我已成功将验证码添加到 Ajax 联系表单。虽然代码还需要一些改进,但我是这样做的:

    看到我正在使用 n3tseznamcaptcha 验证码插件,我仍然需要实施更改才能使其他验证码正常工作(recaptcha 等),但您可以根据自己的需要进行调整。

    SP Pagebuilder 插件由两个文件组成,管理员和站点。在管理站点中,我删除了缺少许多安全措施的默认验证码。然后在网站部分我添加了以下内容:

    function ajax_contact_addon($atts)
    {
        global $formcaptcha;
        (...)
        if($formcaptcha) 
        {
                // TODO: Add Joomla's captcha:
                JPluginHelper::importPlugin('captcha');
                $dispatcher = JDispatcher::getInstance();
    
                // This will put the code to load CAPTCHA's JavaScript file into your <head>
                $dispatcher->trigger('onInit', 'dynamic_captcha_1');
    
                // This will return the array of HTML code.
                $captcha = $dispatcher->trigger('onDisplay', array(null, 'dynamic_captcha_1', 'class=""'));
                // I have only 1 recaptcha plugin enabled so the HTML is at 0 index, this will be improved in next version, following the contact component
                $output .= (isset($captcha[0])) ? $captcha[0] : '';
                $output .= '<div class="clearfix"></div><p></p>';
        }
        (...)
    }
    
    function ajax_contact_get_ajax() 
    {
        global $formcaptcha;
    
        $jinput         = JFactory::getApplication()->input;
        $mail           = JFactory::getMailer();
        $config         = JFactory::getConfig();
    
        // TODO: CHECK CAPTCHA and add a Helper Class to get the captchas fields
        $captchaset = 'n3tseznamcaptcha';
        if ($captchaset === 'n3tseznamcaptcha')
        {   
            $captcha_field_hash = 'n3t_seznam_captcha_hash';
            $captcha_field_answer = 'n3t_seznam_captcha';
        }
    
        //inputs
        $inputs             = $jinput->get('data', array(), 'ARRAY');
        foreach ($inputs as $input) 
        {
                if( $input['name'] == 'title' ) 
                {
                    $title                  = $input['value'];
                }
                if( $input['name'] == 'recipient' ) 
                {
                        $recipient      = base64_decode($input['value']);
                }
    
                if( $input['name'] == 'email' ) 
                {
                        $email          = $input['value'];
                }
    
                (...)
    
                if( $input['name'] == $captcha_field_hash ) 
                {
                        $captcha_hash   = $input['value'];
                }
    
                if( $input['name'] == $captcha_field_answer ) 
                {
                        $captcha_answer     = $input['value'];
                }
        }
    
        if($formcaptcha)
        {
                // get the plugin
                JPluginHelper::importPlugin('captcha');
                $dispatcher = JEventDispatcher::getInstance();
    
                // In order the plugin can check the code, we have to insert it into the request data:
                $jinput->set('n3t_seznam_captcha_hash', $captcha_hash);
                $jinput->set('n3t_seznam_captcha', $captcha_answer);
    
                // Here we check for the code:
                $res = $dispatcher->trigger('onCheckAnswer', $captcha_answer);
    
                if(!$res[0])
                {
                        // There is a problem with pagebuilder cache and captchas, so we need to clean the cache, to renew the captcha code:
                        $cache = JFactory::getCache('page');
                        $cache->clean();
                        return '<span class="pb-text-danger">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_FORM_WRONG_CAPTCHA') .'</span>';
                }
    }
    
    }
    

    我想就是这样。希望对您有所帮助。

    【讨论】:

    • 这帮助很大!我仍在努力使其适应 Google 的验证码,如果成功了我会告诉你的 :)
    • 嗯...我真的很讨厌这个,因为我真的不知道该放什么而不是:$captchaset = 'n3tseznamcaptcha'; if ($captchaset === 'n3tseznamcaptcha') { $captcha_field_hash = 'n3t_seznam_captcha_hash'; $captcha_field_answer = 'n3t_seznam_captcha'; } 而不是:$jinput-&gt;set('n3t_seznam_captcha_hash', $captcha_hash); $jinput-&gt;set('n3t_seznam_captcha', $captcha_answer); $res = $dispatcher-&gt;trigger('onCheckAnswer', $captcha_answer); 为了让我的谷歌 ReCaptcha 工作://
    • 这里实现安装的验证码的问题是ajax表单没有填充get参数,它填充POST变量并返回AJAX响应,因此插件永远无法工作,所以我们必须要做的是从生成的验证码字段中获取这些值并将其传递给 jinput (JFactory::getApplication->input),以便在触发插件时它可以检索这些值并检查它们是否正确,但每个验证码都有它的自己的字段,所以我们需要找出我们使用哪个字段来读取这些值
    【解决方案2】:

    所以这里你有完整的解决方案。请注意,我在管理方面也进行了一些更改。此版本将显示并验证在 Joomla 配置中选择的默认验证码,但它仅适用于 recaptcha 和 n3tsezam.. 其他应手动添加。原因是这个插件没有在请求中添加挑战和响应字段,验证码插件用于验证,因此我们需要检索它并写入我们的 ajax 函数 (ajax_contact_get_ajax) 中的 jinput,以及使整体复杂化的原因问题是每个验证码插件都使用不同的字段。无论如何..如果您需要任何其他验证码插件,只需将其添加到交换机,您就应该完成。

    函数 ajax_contact_addon($atts) {

            extract(AddonAtts(array(
                    "title"             => '',
                    "show_title"                    => '',
                    "heading_selector"      => 'h3',
                    "title_fontsize"        => '',
                    "title_fontweight"      => '',
                    "title_text_color"      => '',
                    "title_margin_top"      => '',
                    "title_margin_bottom"           => '',  
                    "recipient_email"       => '',
                    "formcaptcha"           => '',
                    "class"             => '',
                    ), $atts));
    
            JHtml::script('media/com_pagebuilder/js/ajax-contact.js');        
    
    //      There is a problem with pagebuilder cache and captchas
            $cache = JFactory::getCache('page');
            $cache->clean();
    
            $output  = '<div class="pb-addon pb-addon-ajax-contact ' . $class . '">';
    
            if(boolval($show_title) && $title) 
            {
    
                    $title_style = '';
                    if($title_margin_top !='') $title_style .= 'margin-top:' . (int) $title_margin_top . 'px;';
                    if($title_margin_bottom !='') $title_style .= 'margin-bottom:' . (int) $title_margin_bottom . 'px;';
                    if($title_text_color) $title_style .= 'color:' . $title_text_color  . ';';
                    if($title_fontsize) $title_style .= 'font-size:'.$title_fontsize.'px;line-height:'.$title_fontsize.'px;';
                    if($title_fontweight) $title_style .= 'font-weight:'.$title_fontweight.';';
    
                    $output .= '<'.$heading_selector.' class="pb-addon-title" style="' . $title_style . '">' . $title . '</'.$heading_selector.'>';
            }
    
            $output .= '<div class="pb-addon-content">';
            $output .= '<form class="pb-ajax-contact-form">';
    
            $output .= '<div class="pb-form-group">';
            $output .= '<input type="text" name="name" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_NAME') .'" required="required">';
            $output .= '</div>';
    
            $output .= '<div class="pb-form-group">';
            $output .= '<input type="email" name="email" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_EMAIL') .'" required="required">';
            $output .= '</div>';
    
            $output .= '<div class="pb-form-group">';
            $output .= '<input type="text" name="subject" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_SUBJECT') .'" required="required">';
            $output .= '</div>';
    
            $output .= '<div class="pb-form-group">';
            $output .= '<textarea type="text" name="message" rows="5" class="pb-form-control" placeholder="'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_MESSAGE') .'" required="required"></textarea>';
            $output .= '</div>';
    
            if($formcaptcha) 
            {
                    JPluginHelper::importPlugin('captcha');
                    $dispatcher = JDispatcher::getInstance();
                    $dispatcher->trigger('onInit', 'dynamic_captcha_1');
    
                    $captchas = $dispatcher->trigger('onDisplay', array(null, 'dynamic_captcha_1', 'class=""'));
                    $index = 0;
    
                    foreach (JPluginHelper::getPlugin('captcha') as $plugin)
                    {
                            if (JFactory::getApplication()->get('captcha', '0') === $plugin->name)
                            {
                                    $captcha = $captchas[$index];
                                    break;
                            }
                            $index++;
                    }
                    $output .= (isset($captcha)) ? $captcha : '';
                    $output .= '<div class="clearfix"></div><p></p>';
            }
    
            $output .= '<input type="hidden" name="recipient" value="'. base64_encode($recipient_email) .'">';
            $output .= '<input type="hidden" name="title" value="'. $title .'">';
    
            $output .= '<button type="submit" class="btn btn-default"><i class="fa"></i> '. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_SEND') .'</button>';
    
            $output .= '</form>';
    
            $output .= '<div style="display:none;margin-top:10px;" class="pb-ajax-contact-status"></div>';
    
            $output .= '</div>';
    
            $output .= '</div>';
    
            return $output;
    
    }
    
    function ajax_contact_get_ajax() 
    {
            $config                         = JFactory::getConfig();
            $jinput             = JFactory::getApplication()->input;
            //inputs
            $inputs             = $jinput->get('data', array(), 'ARRAY');
    
            $mail               = JFactory::getMailer();
    
            // TODO: Find the way to check if captcha is enabled in the addon
            $formcaptcha = true;
            $message = "";
    
            // TODO: CHECK CAPTCHA and add a Helper Class to get the captchas
            switch (JFactory::getApplication()->get('captcha', '0'))
            {
                case 'recaptcha':
                    // v.1:
                    //$captcha_challenge_field = 'recaptcha_challenge_field';
                    //$captcha_answer_field = 'recaptcha_response_field';
                    // v.2:
                    $captcha_challenge_field = '';
                    $captcha_answer_field = 'g-recaptcha-response';
                    break;
                case 'n3tseznamcaptcha':
                    $captcha_challenge_field = 'n3t_seznam_captcha_hash';
                    $captcha_answer_field = 'n3t_seznam_captcha';
                    break;
                default:
                    // disable captcha as we could not find the right fields
                    $formcaptcha = false;
            }
    
            foreach ($inputs as $input) 
            {
    
                    if( $input['name'] == 'title' ) 
                    {
                            $title                  = $input['value'];
                    }
                    if( $input['name'] == 'recipient' ) 
                    {
                            $recipient      = base64_decode($input['value']);
                    }
    
                    if( $input['name'] == 'email' ) 
                    {
                            $email          = $input['value'];
                    }
    
                    if( $input['name'] == 'name' ) 
                    {
                            $name           = $input['value'];
                    }
    
                    if( $input['name'] == 'subject' ) 
                    {
                            $subject            = $input['value'];
                    }
    
                    if( $input['name'] == 'message' ) 
                    {
                            $message            = nl2br( $input['value'] );
                    }
    
                    if( $input['name'] == $captcha_challenge_field ) 
                    {
                            $captcha_challenge  = $input['value'];
                    }
    
                    if( $input['name'] == $captcha_answer_field ) 
                    {
                            $captcha_answer     = $input['value'];
                    }
    
            }
    
            $valid_captcha = true;
            if($formcaptcha)
            {
                    // get the plugin
                    JPluginHelper::importPlugin('captcha');
                    $dispatcher = JEventDispatcher::getInstance();
    
                    $jinput->set($captcha_challenge_field,  $captcha_challenge);
                    $jinput->set($captcha_answer_field,     $captcha_answer);
    
                    $res = $dispatcher->trigger('onCheckAnswer', $captcha_answer);
    
                    $index = 0;
                    foreach (JPluginHelper::getPlugin('captcha') as $plugin)
                    {
                            if (JFactory::getApplication()->get('captcha', '0') === $plugin->name)
                            {
                                    $valid_captcha = $res[$index];
                                    break;
                            }
                            $index++;
                    }
                    if(!$valid_captcha)
                    {
                        $msg = '<span class="pb-text-danger">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_FORM_WRONG_CAPTCHA') .'</span>';                        
                    }
            }
    
            if ($valid_captcha)
            {
                    // We do not want to send the email as a fake user, it may cause spam problems
                    $sender = array( 
                            $config->get( 'mailfrom' ),
                            $config->get( 'fromname' ) 
                    );
    
                    $subject = (($title)? '['.$title.'] ' : '') . $subject;
                    $message .= JText::sprintf('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_EMAIL_SIGNATURE', JUri::getInstance()->toString(),  JUri::getInstance());
    
                    $mail->setSender($sender);
                    $mail->addRecipient($recipient);
                    $mail->setSubject($subject);
                    $mail->AddReplyTo($email);
                    $mail->isHTML(true);
                    $mail->Encoding = 'base64'; 
                    $mail->setBody($message);
    
                    if ($mail->Send()) 
                    {
                            $msg = '<span class="pb-text-success">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_SUCCESS') .'</span>';
                    } else {
                            $msg = '<span class="pb-text-danger">'. JText::_('COM_PAGEBUILDER_ADDON_AJAX_CONTACT_FAILED') .'</span>';
                    }
            }
    
    //      There is a problem with pagebuilder cache and captchas
            $cache = JFactory::getCache('page');
            $cache->clean();
    
            return $msg;
    
    }
    

    【讨论】:

    • 我尝试将您的代码放入:/com_sppagebuilder/addons/ajax_contact/site.php,这是向前迈出的一步,因为现在它阻止了所有联系消息,而不是发送所有消息 XD 我一定做错了什么。
    【解决方案3】:

    该功能现已集成到 SP Page Builder 联系表单插件中。

    1) 从控制台获取 reCaptcha API 密钥:https://www.google.com/recaptcha/admin

    2) 在 Joomla 的后端启用 reCaptcha 插件: Joomla 控制面板并导航到扩展 > 插件 > 验证码 - reCaptcha

    3) 在您的 Joomla 配置中启用 reCaptcha: 转到系统 > 全局配置 > 站点设置 > 默认验证码

    4) 转到您的联系表格(或创建一个新表格)并启用验证码。然后在验证码类型选择器中选择“CAPTCHA - reCAPTCHA”。

    完成上述步骤后,如果您在联系表单前端没有看到 reCAPTCHA 框,则表示您的模板使用了旧的联系插件代码。在大多数情况下,您可以安全地进行备份,然后删除(粗体)文件夹:templates\YOUR-TEMPLATE-NAME\sppagebuilder\addons\ajax_contact

    本文提供了您需要的所有信息:https://www.joomshaper.com/blog/google-recaptcha-joomla-contact-forms-integration

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多