织梦默认的验证码功能主要集中在会员登录、评论、留言等地方,并没有直接为“购买”这个动作开启验证码,我们需要手动修改代码来实现。

这里提供两种主流的实现方法:
- 使用织梦自带的
safe_check()函数(推荐,最简单) - 手动调用验证码类(更灵活,但代码稍多)
准备工作(两种方法都需要)
在修改代码之前,请确保你的织梦系统已经开启了验证码功能。
- 登录织梦后台。
- 进入 系统 -> 系统基本参数 -> 安全设置。
- 找到并开启以下选项:
- 开启验证码:设置为“是”。
- 开启会员验证码:设置为“是”。
- 点击“保存”。
使用 safe_check() 函数(最简单)
这个方法是织梦预留的通用安全检查接口,只需在提交订单的页面调用即可。
操作步骤:
-
找到并打开文件 在你的织梦根目录下,找到并编辑文件:
/plus/carbuyaction.php
(图片来源网络,侵删)这个文件是处理用户提交购买信息(即创建订单)的核心文件。
-
添加验证码检查代码 在文件的开头部分,找到
require_once(dirname(__FILE__)."/../include/common.inc.php");这一行代码。 在它后面,添加以下代码:// 安全验证码检查 if(preg_match('/PHPSESSID/i', $_SERVER['HTTP_REFERER']) || preg_match('/PHPSESSID/i', $_SERVER['QUERY_STRING'])) { ShowMsg('提交的来路不正确!', '-1'); exit(); } if($safe_check > 0) { if(empty($dopost)) { $dopost = ''; } if($safe_check == 2 && $dopost == 'save') { $safecode = empty($safecode) ? '' : strtolower(trim($safecode)); $seccode = empty($seccode) ? '' : strtolower(trim($seccode)); if($safecode != $seccode) { ShowMsg('验证码错误!', '-1'); exit(); } } else { if(empty($vdcode)) { ShowMsg('请输入验证码!', '-1'); exit(); } $vdcode = empty($vdcode) ? '' : strtolower(trim($vdcode)); $svali = GetCkVdValue(); if($vdcode != $svali) { ShowMsg('验证码错误!', '-1'); exit(); } } }代码解释:
if($safe_check > 0):这个判断会检查后台“安全设置”中的“开启验证码”选项,如果关闭了,这里就不会执行。if($safe_check == 2 && ...):这是针对织梦“万能表单”的验证逻辑,我们普通购买流程用不到,可以忽略。else:这是核心部分,处理我们常见的验证码。if(empty($vdcode)):检查用户是否提交了验证码。$vdcode = strtolower(trim($vdcode));:获取用户输入的验证码并转为小写。$svali = GetCkVdValue();:获取服务器端生成的正确验证码。if($vdcode != $svali):比对用户输入和服务器端的验证码,如果不一致,则提示错误并退出。
-
在前台页面添加验证码输入框 现在后台检查有了,但用户在前台看不到验证码输入框,你需要在你网站的商品详情页的购买按钮附近,添加验证码。
(图片来源网络,侵删)你需要修改的模板文件通常是:
/templets/default/shopcar.htm(购物车页面) 或者商品详情页的购买表单,文件可能是:/templets/default/article_article.htm(如果购买功能集成在文章页) 或者一个专门的购买模板/templets/default/buy.htm。在购买表单
<form>标签内部,合适的位置(提交订单”按钮上方)添加以下HTML代码:<div class="form-group"> <label for="vdcode">验证码:</label> <div class="input-group"> <input type="text" name="vdcode" id="vdcode" class="form-control text" style="width:120px;" /> <img id="vdimgck" align="absmiddle" style="cursor:pointer;margin-left:5px;" onclick="this.src=this.src+'?'" src="/include/vdimgck.php" alt="看不清?点击更换" /> </div> </div>代码解释:
name="vdcode":这里的vdcode必须和carbuyaction.php中检查的变量名$vdcode一致。src="/include/vdimgck.php":这是织梦生成验证码图片的固定路径。onclick="this.src=this.src+'?'":点击图片刷新验证码的JS代码。
-
完成 当用户点击“提交订单”时,系统会检查验证码,如果验证码为空或错误,就会提示“验证码错误!”,无法成功提交订单。
手动调用验证码类(更灵活)
如果你觉得方法一不够灵活,或者想自定义验证码的样式和行为,可以手动调用验证码类。
操作步骤:
-
修改
carbuyaction.php文件 同样,打开/plus/carbuyaction.php文件,在引入公共文件后,添加手动验证码检查逻辑:// 引入验证码类 require_once(DEDEINC.'/vdimgcode.class.php'); // 获取用户输入的验证码 $vdcode = isset($_POST['vdcode']) ? trim($_POST['vdcode']) : ''; // 实例化验证码类 $vdcodeHandler = new vdcode(); // 校验验证码 if(!$vdcodeHandler->check($vdcode)) { ShowMsg('验证码错误,请重新输入!', '-1'); exit(); }代码解释:
require_once(DEDEINC.'/vdimgcode.class.php');:引入织梦的验证码处理类。new vdcode():创建一个验证码对象。$vdcodeHandler->check($vdcode):使用这个对象的check方法来验证用户输入,这个方法内部会处理大小写、空格等问题,比手动比对更健壮。
-
在前台页面添加验证码输入框 这一步和方法一完全相同,在你的购买表单中添加HTML代码来显示验证码图片和输入框。
<div class="form-group"> <label for="vdcode">验证码:</label> <div class="input-group"> <input type="text" name="vdcode" id="vdcode" class="form-control text" style="width:120px;" /> <img id="vdimgck" align="absmiddle" style="cursor:pointer;margin-left:5px;" onclick="this.src=this.src+'?'" src="/include/vdimgck.php" alt="看不清?点击更换" /> </div> </div>
总结与建议
| 特性 | 方法一 (safe_check()) |
方法二 (手动调用类) |
|---|---|---|
| 实现难度 | 非常简单,只需粘贴代码 | 稍微复杂,需要理解类和方法 |
| 代码侵入性 | 较低,直接调用现有函数 | 较高,需要引入新文件并实例化对象 |
| 灵活性 | 较低,功能固定 | 高,可以轻松扩展,如修改验证码位数、复杂度等 |
| 推荐度 | 强烈推荐,对于99%的需求都足够 | 适合有特殊定制需求的开发者 |
对于绝大多数用户,我强烈推荐使用【方法一】,它简单、可靠,且符合织梦的设计逻辑,不容易出错。
重要提示:在进行任何文件修改前,请务必备份原始文件!以防修改出错导致网站无法正常运行,修改后,清除浏览器缓存再进行测试。
