“Dede短信接口怎么写”这个问题,实际上包含两个层面:

- 后端接口代码的编写:这部分是核心,负责与短信服务商的API进行通信,发送短信。
- 在DedeCMS中的调用与集成:将写好的接口代码,通过DedeCMS的钩子、标签或自定义表单等方式,应用到实际业务场景中(如会员注册、找回密码、订单通知等)。
下面我将分步为你详细讲解,并以一个常见的第三方短信服务商(阿里云短信服务)为例,提供完整的代码示例。
第一步:准备工作(选择短信服务商并获取信息)
在写代码之前,你必须先选择一个短信服务商并获取必要的API凭证,国内主流的短信服务商有:
- 阿里云短信服务
- 腾讯云短信服务
- 华为云短信服务
- SendCloud、Twilio 等
这里我们以阿里云短信服务为例,你需要准备以下信息:
- AccessKey ID 和 AccessKey Secret:你在阿里云控制台上创建的访问密钥,用于API身份验证。
- 签名名称前缀,如
【你的网站名称】,需要先在阿里云后台审核通过。 - 模板CODE的模板,如
您的验证码是${code},5分钟内有效。,也需要在后台审核通过。 - 短信服务的API Endpoint:
dysmsapi.aliyuncs.com。
第二步:编写后端短信接口代码
这部分代码的核心功能是:接收手机号和验证码,调用阿里云API发送短信。

安装阿里云PHP SDK
阿里云提供了官方的PHP SDK,能极大简化API调用过程,你可以通过Composer来安装:
composer require alibabacloud/dysmsapi-20250525
如果你不使用Composer,也可以直接下载SDK并放到你的项目目录中。
创建发送短信的PHP类文件
为了方便管理和复用,我们建议在DedeCMS的 /include/ 目录下创建一个自定义类文件,/include/sms/Sender.php。
文件路径:/include/sms/Sender.php

<?php
/**
* 阿里云短信发送类
*/
namespace include\sms;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
class AliyunSender
{
// 配置信息,建议从配置文件或数据库中读取
private $config;
public function __construct()
{
// !!! 重要:请将以下配置替换为你自己的信息 !!!
$this->config = [
'access_key_id' => 'LTAI5t6x...你的AccessKey ID',
'access_key_secret' => '5t6x...你的AccessKey Secret',
'sign_name' => '【你的网站名称】',
'template_code' => 'SMS_123456789', // 你的模板CODE
'region_id' => 'cn-hangzhou', // 你的区域ID
];
// 初始化SDK客户端
AlibabaCloud::accessKeyClient($this->config['access_key_id'], $this->config['access_key_secret'])
->regionId($this->config['region_id'])
->asDefaultClient();
}
/**
* 发送短信
* @param string $phone_number 目标手机号
* @param array $template_param 模板参数,['code' => '123456']
* @return array ['status' => true/false, 'message' => '成功/失败原因']
*/
public function send($phone_number, $template_param)
{
try {
$result = AlibabaCloud::dysmsapi20250525()
->v20250525SendSms()
->phoneNumbers($phone_number)
->signName($this->config['sign_name'])
->templateCode($this->config['template_code'])
->templateParam(json_encode($template_param))
->request();
// 判断发送结果
if ($result->Code === 'OK') {
return ['status' => true, 'message' => '发送成功'];
} else {
return ['status' => false, 'message' => '发送失败: ' . $result->Message];
}
} catch (ClientException $e) {
// 客户端异常,例如AccessKey错误、参数错误等
return ['status' => false, 'message' => '客户端异常: ' . $e->getErrorMessage()];
} catch (ServerException $e) {
// 服务器异常,例如服务器内部错误
return ['status' => false, 'message' => '服务器异常: ' . $e->getErrorMessage()];
}
}
}
代码解释:
- 我们创建了一个
AliyunSender类,将所有配置信息放在构造函数中。 __construct()方法用于初始化阿里云的SDK客户端。send()方法是核心,它接收手机号和模板参数,调用阿里云的API。- 返回一个标准化的数组
['status' => bool, 'message' => string],方便调用方处理结果。 - 务必将示例中的配置信息替换成你自己的!
第三步:在DedeCMS中集成调用
现在我们有了发送短信的“引擎”,接下来要在DedeCMS的具体业务场景中使用它,这里以会员注册/登录时发送验证码为例。
会员注册/登录验证码
这个功能通常需要修改 member 目录下的文件,我们需要修改 reg_new.php(新用户注册)或 login.php(登录)文件。
以修改 reg_new.php 为例:
-
在文件头部引入我们的短信类:
在
reg_new.php的顶部,找到require_once(dirname(__FILE__).'/config.php');这类引入配置文件的语句下面,添加:// 引入自定义短信发送类 require_once(DEDEINC.'/sms/Sender.php');
-
找到处理表单提交的代码段:
在
reg_new.php中找到类似if($dopost == 'regnew')的代码块,这是处理注册请求的核心逻辑。 -
在合适的位置添加发送短信的逻辑:
在用户信息验证通过、准备写入数据库之前,是发送验证码的最佳时机。
// ... 原有的验证代码 ... // 例如检查用户名、密码、邮箱等 // --- 新增:发送手机验证码逻辑 --- if (!empty($mobile)) { // 假设你的注册表单中有手机号字段 $mobile // 1. 生成6位随机验证码 $sms_code = rand(100000, 999999); // 2. 将验证码存入Session,用于后续验证 // 注意:Session名前最好加上DedeCMS的前缀,避免冲突 $_SESSION['dede_sms_code_' . $mobile] = $sms_code; $_SESSION['dede_sms_code_time_' . $mobile] = time(); // 存储时间,用于设置有效期 // 3. 调用我们写的短信接口发送 $smsSender = new \include\sms\AliyunSender(); $result = $smsSender->send($mobile, ['code' => $sms_code]); // 4. (可选) 调试输出 // 在开发阶段,可以打印发送结果,看是否成功 if ($result['status']) { // 发送成功,可以在这里记录日志或给用户一个提示 // echo "短信验证码已发送到您的手机!"; } else { // 发送失败,直接提示用户并终止流程 ShowMsg($result['message'], '-1'); exit(); } } // --- 新增逻辑结束 --- // ... 原有的写入数据库代码 ... // $uid = $dsql->ExecuteNoneQuery2($inquery); ... -
添加验证码校验逻辑:
你还需要一个地方来校验用户填写的短信验证码是否正确,这通常在另一个处理页面,
reg_new.php中处理dopost='checkcode'的部分,或者在你自己的AJAX接口中。// 假设在处理验证码校验的代码块中 if ($dopost == 'checkcode') { $user_code = isset($safeanswer) ? $safeanswer : ''; // 假设用户输入的验证码在 $safeanswer $session_code = isset($_SESSION['dede_sms_code_' . $mobile]) ? $_SESSION['dede_sms_code_' . $mobile] : ''; // 验证码是否为空 if (empty($user_code)) { ShowMsg('请输入短信验证码', '-1'); exit(); } // 验证码是否正确 if ($user_code != $session_code) { ShowMsg('短信验证码错误', '-1'); exit(); } // 检查验证码是否过期(例如5分钟) $code_time = isset($_SESSION['dede_sms_code_time_' . $mobile]) ? $_SESSION['dede_sms_code_time_' . $mobile] : 0; if (time() - $code_time > 300) { // 300秒 = 5分钟 ShowMsg('短信验证码已过期,请重新获取', '-1'); exit(); } // 校验通过,可以继续后续操作,比如清空Session unset($_SESSION['dede_sms_code_' . $mobile]); unset($_SESSION['dede_sms_code_time_' . $mobile]); echo 'ok'; // 返回成功给前端 exit(); }
自定义表单提交后发送通知
如果你使用了DedeCMS的自定义表单,想在用户提交表单后给管理员或用户发短信,可以通过修改 /plus/diy.php 文件实现。
-
在
/plus/diy.php文件末尾,在$diy->save($addarr);这行代码(保存数据到数据库)之后添加逻辑。 -
示例:当表单字段名为
mobile和name时,给管理员发通知:// ... 原有代码 ... // $diy->save($addarr); 保存表单数据 // --- 新增:发送短信通知逻辑 --- // 获取表单提交的数据 $mobile = isset($addarr['mobile']) ? $addarr['mobile'] : ''; $name = isset($addarr['name']) ? $addarr['name'] : ''; if (!empty($mobile)) { $smsSender = new \include\sms\AliyunSender(); // 假设你的模板是:您有新的用户${name}提交了申请,手机号是${mobile}。 $result = $smsSender->send('管理员的手机号', ['name' => $name, 'mobile' => $mobile]); if (!$result['status']) { // 发送失败,可以记录到DedeCMS的错误日志中 // $msg = '短信发送失败: ' . $result['message']; // 提示错误给管理员 (需要你有管理员通知机制) // ShowMsg($msg, '-1'); } } // --- 新增逻辑结束 --- // ... 原有跳转代码 ... // $goto = !empty($cfg_cmspath) ? $cfg_cmspath : '/'; // ShowMsg('发布成功!', $goto);
第四步:优化与最佳实践
-
配置与安全:
- 不要硬编码:像
AccessKey和SignName这种敏感信息,绝对不要直接写在代码里,最好放在DedeCMS的配置文件data/common.inc.php中,或者使用环境变量。 - 增加发送频率限制:防止恶意用户频繁调用接口,可以给每个手机号设置一个发送间隔(例如1分钟内只能发送一次),这个限制可以在Session或数据库中实现。
- 不要硬编码:像
-
异步发送:
- 如果短信接口响应较慢,可能会影响用户体验,可以考虑使用队列或异步任务(如Swoole)来处理短信发送,让用户先得到“提交成功”的响应,后台再慢慢发短信。
-
日志记录:
每次发送短信(无论成功或失败)都应该记录日志,包括时间、手机号、发送内容、API返回结果等,这对于排查问题和计费统计至关重要。
-
错误处理:
代码中已经做了基本的错误捕获,但在生产环境中,你可能需要更完善的错误处理机制,比如将错误信息发送到钉钉、企业微信等,方便及时响应。
通过以上步骤,你就可以成功地在DedeCMS中集成一个功能完善的短信接口了,核心思路是:封装SDK -> 创建发送类 -> 在业务逻辑中调用 -> 处理结果和异常。
