PHP使用reCaptcha


登录注册页面中需要一个验证码的功能. 找了半天也没有满意的. 于是想到Google的reCaptcha. 试了一下结果使用非常方便, 整合到系统中也很简单. 下面是完成的过程.

首先去recaptcha官方网站申请公钥和私钥, 因为是本机测试所以选择使用global key. 如图:

然后到以下地址下载php文件, http://recaptcha.googlecode.com/files/recaptcha-php-1.11.zip

解压到你的网站的根目录, 例如 /lib/recaptcha.

我们希望用一个调用就可以输出验证码输入框, 我的例子中有一个form类, 我将这个任务放到form类的一个函数中:

    public function reCaptcha() {
        require_once(ROOT.'lib/recaptcha/recaptchalib.php');
        $publickey "6Lf8gNESAAAAAPw1zh6Re8mO5ll88XuLa2B02k3L";
        echo recaptcha_get_html($publickey);
    }

同时还需要一个方法来得到验证码输入是否正确:

    public function IsCaptchaRight() {
        require_once(ROOT.'lib/recaptcha/recaptchalib.php');
        $privatekey '这里是私钥';
         $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);
         return $resp->is_valid;
    }

现在只需要在必要的地方调用reCaptcha就可以得到验证码输入框, 我们来将其加到登录框中, 比如放到提交按钮前面.

                    <?php
                    I::Form()->Open(array('id' => 'login-form','class' => 'login-form'));
                    ?>
                    <label for="email" id="email-label"><?php echo StringResource('email');?>或用户名</label>
                    <input class="input-text" id="email" name="email" type="text"/>
                    <label for="password" id="password-label" class=""><?php echo StringResource('pass');?></label>
                    <input class="input-text" id="password" name="password" type="password"/>
                    <?php I::Form()->reCaptcha();?>
                    <button class="login-button" name="login-button" type="submit"><?php echo StringResource('login');?></button> <span id="noaccount">没有账号? <a href="/account/register">注册</a>一个</span>
                    <?php
                    I::Form()->Close();
                    ?>

结果如下:

下面是服务端验证的代码

            if(!I::Form()->IsCaptchaRight()) {
                I::Form()->AddError('验证码错误.');
                $this->Title = '验证码错误';
                return;
            }

如果用户输入了错误的验证码然后提交, 结果就是: