dede短信接口代码如何写?

99ANYc3cd6
预计阅读时长 29 分钟
位置: 首页 DEDE建站 正文

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

dede短信接口怎么写
(图片来源网络,侵删)
  1. 后端接口代码的编写:这部分是核心,负责与短信服务商的API进行通信,发送短信。
  2. 在DedeCMS中的调用与集成:将写好的接口代码,通过DedeCMS的钩子、标签或自定义表单等方式,应用到实际业务场景中(如会员注册、找回密码、订单通知等)。

下面我将分步为你详细讲解,并以一个常见的第三方短信服务商(阿里云短信服务)为例,提供完整的代码示例。


第一步:准备工作(选择短信服务商并获取信息)

在写代码之前,你必须先选择一个短信服务商并获取必要的API凭证,国内主流的短信服务商有:

  • 阿里云短信服务
  • 腾讯云短信服务
  • 华为云短信服务
  • SendCloud、Twilio

这里我们以阿里云短信服务为例,你需要准备以下信息:

  1. AccessKey IDAccessKey Secret:你在阿里云控制台上创建的访问密钥,用于API身份验证。
  2. 签名名称前缀,如【你的网站名称】,需要先在阿里云后台审核通过。
  3. 模板CODE的模板,如您的验证码是${code},5分钟内有效。,也需要在后台审核通过。
  4. 短信服务的API Endpointdysmsapi.aliyuncs.com

第二步:编写后端短信接口代码

这部分代码的核心功能是:接收手机号和验证码,调用阿里云API发送短信。

dede短信接口怎么写
(图片来源网络,侵删)

安装阿里云PHP SDK

阿里云提供了官方的PHP SDK,能极大简化API调用过程,你可以通过Composer来安装:

composer require alibabacloud/dysmsapi-20250525

如果你不使用Composer,也可以直接下载SDK并放到你的项目目录中。

创建发送短信的PHP类文件

为了方便管理和复用,我们建议在DedeCMS的 /include/ 目录下创建一个自定义类文件,/include/sms/Sender.php

文件路径:/include/sms/Sender.php

dede短信接口怎么写
(图片来源网络,侵删)
<?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 为例:

  1. 在文件头部引入我们的短信类:

    reg_new.php 的顶部,找到 require_once(dirname(__FILE__).'/config.php'); 这类引入配置文件的语句下面,添加:

    // 引入自定义短信发送类
    require_once(DEDEINC.'/sms/Sender.php');
  2. 找到处理表单提交的代码段:

    reg_new.php 中找到类似 if($dopost == 'regnew') 的代码块,这是处理注册请求的核心逻辑。

  3. 在合适的位置添加发送短信的逻辑:

    在用户信息验证通过、准备写入数据库之前,是发送验证码的最佳时机。

    // ... 原有的验证代码 ...
    // 例如检查用户名、密码、邮箱等
    // --- 新增:发送手机验证码逻辑 ---
    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); ...
  4. 添加验证码校验逻辑:

    你还需要一个地方来校验用户填写的短信验证码是否正确,这通常在另一个处理页面,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 文件实现。

  1. /plus/diy.php 文件末尾,在 $diy->save($addarr); 这行代码(保存数据到数据库)之后添加逻辑。

  2. 示例:当表单字段名为 mobilename 时,给管理员发通知:

    // ... 原有代码 ...
    // $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);

第四步:优化与最佳实践

  1. 配置与安全

    • 不要硬编码:像 AccessKeySignName 这种敏感信息,绝对不要直接写在代码里,最好放在DedeCMS的配置文件 data/common.inc.php 中,或者使用环境变量。
    • 增加发送频率限制:防止恶意用户频繁调用接口,可以给每个手机号设置一个发送间隔(例如1分钟内只能发送一次),这个限制可以在Session或数据库中实现。
  2. 异步发送

    • 如果短信接口响应较慢,可能会影响用户体验,可以考虑使用队列异步任务(如Swoole)来处理短信发送,让用户先得到“提交成功”的响应,后台再慢慢发短信。
  3. 日志记录

    每次发送短信(无论成功或失败)都应该记录日志,包括时间、手机号、发送内容、API返回结果等,这对于排查问题和计费统计至关重要。

  4. 错误处理

    代码中已经做了基本的错误捕获,但在生产环境中,你可能需要更完善的错误处理机制,比如将错误信息发送到钉钉、企业微信等,方便及时响应。

通过以上步骤,你就可以成功地在DedeCMS中集成一个功能完善的短信接口了,核心思路是:封装SDK -> 创建发送类 -> 在业务逻辑中调用 -> 处理结果和异常

-- 展开阅读全文 --
头像
织梦网站栏目无法更新,原因何在?
« 上一篇 今天
织梦相关产品调用标签
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]