Discuz为某签到插件添加验证码(1/2 添加DZ自带验证码)

我们在做或者修改一些特殊类型的插件(比如签到)的时候,可能会被一些开签到机的所困扰,最好的办法就是增加验证码了。
本文章将分为两个部分,第一部分为添加普通的dz自带的验证码,第二部分为调用极验插件,让签到插件支持极验。

范例插件:https://addon.discuz.com/?@dc_signin.plugin

你所需要了解的内容:
PHP的基本语法

Discuz的模板特殊语法:https://open.discuz.net/?ac=document&page=template_coderule

0.准备
首先,我们要先了解到dz的表单验证机制。每个表单都会生成一个独一无二的formhash来对页面来源性进行验证。怎么验证呢?dz提供了一个submitcheck的方法,用来对提交的表单进行检查来源是否合法。

function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0)

submitcheck拥有四个参数

    $var : 全局变量中的下标,string类型
    $allowget : 是否允许以get的方式请求,0为不允许,1为允许
    $seccodecheck : 是否验证验证码,0为不验证,1为验证
    $secqaacheck : 是否验证安全问答,0为不验证,1为验证

很明显,为了验证验证码,我们需要把第三个参数$seccodecheck设置为1,就可以使用验证码验证了。

其次,我们需要为插件需要提交表单的页面,添加一个输入验证码的输入框
我们可以参考一下dz自带的登录页面的验证码的实现

<!--{if $seccodecheck}-->
<!--{block sectpl}--><div class="rfm"><table><tr><th><sec>: </th><td><sec><br /><sec></td></tr></table></div><!--{/block}-->
<!--{subtemplate common/seccheck}-->
<!--{/if}-->

在这之前,我相信你应该已经读过了Discuz的模板特殊语法的文档了吧。什么?没有?回到文章顶部,找到文档地址,赶紧去读吧,至少你需要先了解<–{if}–>这个特殊语法。

首先,dz会判断你是否启用了验证码功能,如果启用了,就会开始输出第二行,直到if的闭合
最关键的就是第三句,他将会调用你当前模板的common/seccheck页面,也就是验证码页面。
所以我们可以依葫芦画瓢,只需要把判断改为自己的即可(比如你插件自己的配置啊,甚至直接不要这个判断也可以。)

1.开始改造
首先我们要找到范例插件的签到提交表单验证的位置。该插件的提交验证的地方在sign.inc.php中

那么我们首先要做的就是先写一个$seccodecheck变量(为了到时候给添加极验验证方便取消默认的验证码),赋值为1
然后修改之前的那个submitcheck,为他的第三个参数添加我们刚才写的$seccodecheck变量(第二个你就写为0就行了)。
此处要提一个可能存在的Bug,在dz的部分版本中,可能还需要你在判断中手动再写一个验证码验证方法。我仅在我自己的开发环境碰到过这个Bug,不确定是什么原因导致的。

if(!check_seccode($_G['gp_seccodeverify'], $_G['gp_sechash'])){
showmessage('submit_seccode_invalid');
}


至此,后台的改造我们就已经完成了。

接下来我们需要修改前台的表单页面,为他增加一个验证码输入框。
该插件的签到提交页面在插件目录下的template/sign.htm(电脑版)与template/touch/sign.htm(手机版)中,我们都需要进行修改。
首先我们需要先找到提交按钮(type=”submit”的button控件),然后在他的上方添加验证码代码。你可以直接使用登录页面的代码,也可以使用我目前所使用的。(如果你使用登录页面的那个验证码代码,请注意判断。请仔细阅读我之前的0.准备)

<!--{block sectpl}--><sec> <span id="sec<hash>" onclick="showMenu(this.id)"><sec></span><div id="sec<hash>_menu" class="p_pop p_opt" style="display:none"><sec></div><!--{/block}-->
<!--{eval $seccodecheck = 1;}-->
<!--{block sectpl}--><div class="rfm" style="width:auto"><table><tr><th><span class="rq">*</span><sec>: </th><td><sec><br /><sec></td></tr></table></div><!--{/block}-->
<!--{subtemplate common/seccheck}-->

那么,准备好见证奇迹吧!进入签到页面,点击签到

那么,我们就已经完成了我们的第一步,为插件添加Discuz自带的验证码。
在下一节,我们将会利用这个插件自带的附件机制,为签到插件添加极验的验证。