使用现成的会员手机验证插件(强烈推荐)
这是最简单、最安全、最高效的方法,已经有很多开发者制作了成熟的织梦会员手机验证插件,这些插件通常已经集成了主流的短信平台接口,功能稳定,且文档齐全。

(图片来源网络,侵删)
优点:
- 省时省力:无需编写代码,安装即可使用。
- 功能完善:通常包含注册、登录、找回密码、绑定/解绑手机号等全套功能。
- 安全可靠:由专业开发者维护,代码质量和安全性有保障。
- 支持多短信平台:内置了如阿里云、腾讯云、SendCloud等多种短信接口,可自由切换。
操作步骤(以某款典型插件为例):
-
下载插件:
- 访问织梦官方论坛、Dedecms吧、或一些知名的织梦资源网站(如织梦58、源码爱好者等)。
- 搜索关键词如“织梦会员手机验证”、“织梦短信验证码插件”。
- 选择一款评价高、下载量大的插件进行下载,下载的文件通常是一个压缩包(.zip)。
-
上传安装:
(图片来源网络,侵删)- 解压下载的插件包。
- 通过FTP工具,将插件包内的文件上传到你网站根目录的对应位置,通常是:
- 根目录下的文件(如
index.php的补丁)直接覆盖。 /include/目录下的文件上传到/include/。/member/目录下的文件上传到/member/。/data/目录下的文件上传到/data/。
- 根目录下的文件(如
- 注意:上传前务必备份你的网站,特别是
/include/和/member/目录下的文件。
-
配置短信接口:
- 登录你的网站后台,在“系统” -> “系统基本参数” -> “核心设置”中,找到插件新增的选项,如“短信接口设置”。
- 选择你要使用的短信服务商(如阿里云短信、腾讯云短信等)。
- 填写你在该服务商平台上申请到的 API ID、API Key/Secret、签名 和 模板ID。
- 如何获取短信接口?
- 访问阿里云、腾讯云、容联云、SendCloud等官网,注册并实名认证。
- 开通“短信服务”。
- 创建短信签名(
[你的网站名称])。 - 创建短信模板(
【你的网站名称】您的验证码是{1},5分钟内有效。)。 - 在后台获取到所需的AccessKey ID、Secret、签名ID和模板ID。
-
修改模板(可选):
- 有些插件可能需要你修改会员注册模板
/templets/default/member/reg_new.htm,在手机号输入框下方加入验证码相关的HTML代码,插件说明文档里一般会提供具体的修改方法。
- 有些插件可能需要你修改会员注册模板
-
设置后台选项:
在后台插件管理或相关设置菜单中,开启手机号注册功能,并设置验证码的有效时间、发送频率限制等。
-
测试:
- 清空浏览器缓存,或使用无痕模式访问会员注册页面。
- 输入一个手机号,点击“获取验证码”,检查是否能正常收到短信。
- 填写收到的验证码,完成注册流程,确保一切正常。
手动二次开发(适合有PHP基础的开发者)
如果你找不到满意的插件,或者想根据自己的需求进行深度定制,可以选择手动开发,这个过程相对复杂,需要修改多个文件。
核心思路:
- 修改注册页面:增加手机号输入框和验证码输入框。
- 添加发送验证码逻辑:通过AJAX调用后端接口,向短信平台发送验证码。
- 后端验证:在会员注册提交时,验证用户输入的手机号和验证码是否匹配。
详细步骤:
第1步:修改数据库(可选但推荐)
为了方便管理和验证,建议在数据库中为 dede_member 表增加一个字段来存储手机号和验证码。
- 登录你的网站数据库管理工具(如phpMyAdmin)。
- 执行SQL语句,为
dede_member表添加字段:ALTER TABLE `dede_member` ADD `mobile` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '手机号' AFTER `uname`; ALTER TABLE `dede_member` ADD `mobilecode` VARCHAR(10) NOT NULL DEFAULT '' COMMENT '手机验证码' AFTER `mobile`; ALTER TABLE `dede_member` ADD `mobilecode_time` INT(10) NOT NULL DEFAULT '0' COMMENT '验证码发送时间' AFTER `mobilecode`;
第2步:修改会员注册模板 (/templets/default/member/reg_new.htm)
在合适的位置添加手机号和验证码的输入框。
<!-- 在用户名和密码输入框附近添加 -->
<tr>
<td height="25" align="right">手机号:</td>
<td>
<input name="mobile" type="text" id="mobile" class="intxt" style="width:150px" />
<button type="button" id="sendSmsBtn" onclick="sendSmsCode()">获取验证码</button>
<span id="mobileTip" class="gray"></span>
</td>
</tr>
<tr>
<td height="25" align="right">手机验证码:</td>
<td>
<input name="mobilecode" type="text" id="mobilecode" class="intxt" style="width:150px" />
</td>
</tr>
第3步:创建发送验证码的后台处理文件 (/member/send_sms.php)
这个文件将负责生成验证码、调用短信接口并发送。
<?php
require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC.'/membermodel.class.php');
require_once(DEDEINC.'/sms.class.php'); // 假设你有一个短信类,需要自己实现或引入
// 1. 获取前端传来的手机号
$mobile = isset($mobile) ? trim($mobile) : '';
// 2. 验证手机号格式
if(!preg_match("/^1[3-9]\d{9}$/", $mobile)){
ShowMsg('手机号格式不正确!', '-1');
exit();
}
// 3. 检查发送频率(1分钟内不能重复发送)
$sendTime = $dsql->GetOne("SELECT mobilecode_time FROM `#@__member` WHERE mobile = '{$mobile}'");
if($sendTime && (time() - $sendTime['mobilecode_time'] < 60)) {
ShowMsg('发送太频繁,请稍后再试!', '-1');
exit();
}
// 4. 生成随机验证码
$code = rand(100000, 999999);
// 5. 调用短信接口发送(这里以伪代码为例)
$sms = new Sms(); // 实例化你的短信类
$result = $sms->send($mobile, "您的验证码是:{$code},5分钟内有效。");
if($result['status'] == 'success'){
// 6. 发送成功,将验证码存入Session或数据库(推荐存入数据库,方便后续验证)
$dsql->ExecuteNoneQuery("UPDATE `#@__member` SET mobilecode='{$code}', mobilecode_time='".time()."' WHERE mobile='{$mobile}'");
// 也可以存入Session,但要注意Session的持久化和安全性
// $_SESSION['mobile_'.$mobile] = $code;
// $_SESSION['mobile_time_'.$mobile] = time();
echo json_encode(array('code' => 1, 'msg' => '验证码发送成功!'));
} else {
echo json_encode(array('code' => 0, 'msg' => '验证码发送失败:' . $result['msg']));
}
exit;
?>
注意:你需要自己实现 Sms 类,或者使用现成的PHP SDK(如阿里云短信SDK)来调用短信接口。
第4步:编写前端JS发送逻辑
在注册页面引入一个JS文件,或者在页面底部添加 <script> 标签来处理AJAX请求。
// 在 reg_new.htm 页面底部添加
<script type="text/javascript">
function sendSmsCode() {
var mobile = document.getElementById('mobile').value;
var btn = document.getElementById('sendSmsBtn');
if (!/^1[3-9]\d{9}$/.test(mobile)) {
document.getElementById('mobileTip').innerHTML = '请输入正确的手机号';
return;
}
// 禁用按钮,防止重复点击
btn.disabled = true;
var countdown = 60;
var timer = setInterval(function() {
if (countdown == 0) {
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = "获取验证码";
} else {
btn.innerHTML = countdown + "秒后重试";
countdown--;
}
}, 1000);
// 发送AJAX请求
$.ajax({
url: '/member/send_sms.php',
type: 'POST',
data: { mobile: mobile },
dataType: 'json',
success: function(res) {
if (res.code == 1) {
document.getElementById('mobileTip').innerHTML = res.msg;
} else {
document.getElementById('mobileTip').innerHTML = res.msg;
// 如果发送失败,重新启用按钮
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = "获取验证码";
}
},
error: function() {
alert('网络错误,请稍后重试');
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = "获取验证码";
}
});
}
</script>
第5步:修改会员注册处理逻辑 (/member/reg_new.php)
这是最关键的一步,需要修改织梦的核心注册文件,在插入数据库前进行手机验证码的校验。
- 找到
reg_new.php文件。 - 在文件中找到处理表单提交的代码段(通常在
if($dopost=='save')分支内)。 - 在执行
$uid = $uid + $maxid;或$rs = $m->addUser($uid, $pwd, $uname, $email, $spacesta, $question, $answer);之前,加入验证码校验逻辑。
// ... 在 reg_new.php 的 if($dopost=='save') 内部 ...
// 获取用户提交的手机号和验证码
$usermobile = isset($mobile) ? trim($mobile) : '';
$usercode = isset($mobilecode) ? trim($mobilecode) : '';
// 1. 验证手机号和验证码是否为空
if(empty($usermobile) || empty($usercode)){
ShowMsg('手机号和验证码不能为空!', '-1');
exit();
}
// 2. 从数据库中查询正确的验证码和发送时间
$row = $dsql->GetOne("SELECT mobilecode, mobilecode_time FROM `#@__member` WHERE mobile = '{$usermobile}'");
// 3. 验证
if(!$row || $row['mobilecode'] != $usercode){
ShowMsg('验证码错误!', '-1');
exit();
}
// 4. 验证码有效期(例如5分钟)
if(time() - $row['mobilecode_time'] > 300){
ShowMsg('验证码已过期,请重新获取!', '-1');
exit();
}
// 5. 验证通过,清空该手机号的验证码(防止重复使用)
$dsql->ExecuteNoneQuery("UPDATE `#@__member` SET mobilecode='', mobilecode_time='0' WHERE mobile = '{$usermobile}'");
// ... 继续执行原有的注册流程,将 $mobile 变量传递给 addUser 方法 ...
// 你可能还需要修改 membermodel.class.php 中的 addUser 方法,使其支持保存手机号。
注意:membermodel.class.php 中的 addUser 方法也需要修改,以接收并保存 $mobile 字段到数据库,这通常涉及到修改SQL插入语句。
总结与建议
| 特性 | 方法一 (使用插件) | 方法二 (手动开发) |
|---|---|---|
| 难度 | 低 | 高 |
| 时间成本 | 低 | 高 |
| 安全性 | 高(经过市场检验) | 取决于开发者水平 |
| 灵活性 | 低(受限于插件功能) | 高(可自由定制) |
| 维护成本 | 低(插件作者更新) | 高(需自己维护和升级) |
给您的建议:
- 对于绝大多数用户:强烈推荐 方法一,它快捷、安全、稳定,能让你专注于网站内容建设,而不是陷入繁琐的技术细节。
- 对于有开发能力且需求特殊:如果你对织梦非常熟悉,或者有非常独特的业务逻辑无法用现有插件满足,那么可以考虑 方法二,但请务必小心,错误的修改可能会导致网站崩溃或存在安全漏洞。
在操作任何一种方法之前,备份!备份!备份! 这是最重要的原则。
