织梦小程序接口开发如何实现?

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 织梦建站 正文

织梦CMS本身是一个基于PHP的网站内容管理系统,它使用传统的网页模板渲染,而小程序(微信、支付宝等)需要的是JSON格式的数据接口,开发小程序接口的核心任务就是:创建一个独立的PHP脚本,它不依赖织梦的模板系统,而是直接从织梦的数据库中查询数据,并将其格式化为小程序能识别的JSON格式返回。

织梦小程序接口开发
(图片来源网络,侵删)

下面我将分步为你讲解整个开发流程,从环境准备到具体接口开发,再到小程序端的调用。


第一步:准备工作

  1. 本地开发环境

    • PHP环境:织梦基于PHP,你需要一个PHP运行环境,如 phpStudyXAMPPDocker
    • MySQL数据库:织梦使用MySQL,确保你的本地环境已经安装并配置好MySQL。
    • 织梦CMS:下载并完整安装一个织梦CMS到你的本地服务器,确保网站能正常访问。
  2. 小程序开发工具

    下载并安装对应平台(如微信开发者工具)的开发工具。

    织梦小程序接口开发
    (图片来源网络,侵删)
  3. 核心思路

    • 接口文件:在织梦网站根目录下,创建一个专门的文件夹,api/,用于存放所有的接口文件。
    • 安全验证:所有接口都必须有安全验证机制,防止恶意调用,最简单的方式是使用 Token
    • 数据库连接:接口文件需要直接连接到织梦的数据库,而不是依赖织梦的全局变量 $dsql,因为全局变量在独立PHP脚本中可能未定义。

第二步:创建通用数据库连接类

为了避免在每个接口文件里都重复写数据库连接代码,我们创建一个通用的数据库连接类。

  1. api/ 文件夹下创建一个文件 db.php

  2. 编辑 api/db.php,填入以下代码,你需要根据你的织梦数据库配置信息来修改 $dbHost, $dbUser, $dbPass, $dbName

    织梦小程序接口开发
    (图片来源网络,侵删)
<?php
// api/db.php
class Database {
    private $host = 'localhost'; // 数据库主机
    private $username = 'root';   // 数据库用户名
    private $password = 'root';   // 数据库密码
    private $database = 'dedecms_v57'; // 数据库名
    public $conn;
    public function __construct() {
        $this->conn = new mysqli($this->host, $this->username, $this->password, $this->database);
        // 检查连接是否成功
        if ($this->conn->connect_error) {
            // 在生产环境中,不要直接输出错误信息,应该记录日志
            die(json_encode(['code' => 500, 'msg' => '数据库连接失败: ' . $this->conn->connect_error]));
        }
        // 设置字符集为utf8mb4,以支持更广泛的字符
        $this->conn->set_charset("utf8mb4");
    }
    public function query($sql) {
        $result = $this->conn->query($sql);
        if (!$result) {
            die(json_encode(['code' => 500, 'msg' => 'SQL查询错误: ' . $this->conn->error]));
        }
        return $result;
    }
    public function close() {
        $this->conn->close();
    }
}
?>

第三步:开发具体接口

我们以开发一个“获取文章列表”的接口为例,这个接口将接收分页参数,并返回指定数量的文章列表。

  1. api/ 文件夹下创建一个文件 article_list.php

  2. 编辑 api/article_list.php,填入以下代码:

<?php
// api/article_list.php
// 1. 引入数据库连接类
require_once 'db.php';
// 2. 安全验证 - Token验证
$token = 'your_secret_token_here'; // 设置一个你自己的Token
$provided_token = isset($_GET['token']) ? $_GET['token'] : '';
if ($provided_token !== $token) {
    http_response_code(403); // 设置HTTP状态码为403 Forbidden
    echo json_encode(['code' => 403, 'msg' => 'Forbidden: Invalid Token']);
    exit;
}
// 3. 获取并验证分页参数
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; // 当前页码,最小为1
$pageSize = isset($_GET['pageSize']) ? max(1, intval($_GET['pageSize'])) : 10; // 每页条数,最小为1
$offset = ($page - 1) * $pageSize; // 计算偏移量
// 4. 准备SQL查询语句
// 注意:这里我们直接操作织梦的 `dede_archives` 表,这是存储文章核心信息的表。
// `dede_arctype` 是栏目表,`dede_addonarticle` 是文章附加表(如果使用了文章模型)。
// 为了简化,我们只查询 `archives` 表的基本信息。
$sql = "SELECT id, typeid, title, litpic, pubdate, description 
        FROM dede_archives 
        WHERE arctypeid > 0 AND ismake = 1 
        ORDER BY id DESC 
        LIMIT {$offset}, {$pageSize}";
// 5. 执行查询并处理数据
$db = new Database();
$result = $db->query($sql);
$articles = [];
while ($row = $result->fetch_assoc()) {
    // 处理数据,使其符合小程序的需求
    $articles[] = [
        'id'          => $row['id'],
        'title'       => htmlspecialchars($row['title']), // 防止XSS攻击
        'cover_image' => $row['litpic'] ? 'http://your-domain.com' . $row['litpic'] : '', // 拼接完整的图片URL
        'category_id' => $row['typeid'],
        'publish_time'=> date('Y-m-d H:i:s', $row['pubdate']), // 时间戳转换
        'description' => htmlspecialchars($row['description'])
    ];
}
// 6. 获取总文章数,用于小程序计算总页数
$count_sql = "SELECT COUNT(*) as total FROM dede_archives WHERE arctypeid > 0 AND ismake = 1";
$count_result = $db->query($count_sql);
$total = $count_result->fetch_assoc()['total'];
$totalPages = ceil($total / $pageSize);
$db->close(); // 关闭数据库连接
// 7. 返回JSON格式的数据
// 设置响应头,告诉客户端返回的是JSON数据
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
    'code' => 200,
    'msg'  => 'success',
    'data' => [
        'list' => $articles,
        'pagination' => [
            'page'       => $page,
            'pageSize'   => $pageSize,
            'total'      => $total,
            'totalPages' => $totalPages
        ]
    ]
]);
?>

代码解释

  • Token验证:这是接口安全的第一道防线,小程序在请求接口时,必须带上正确的 token 参数。
  • 分页处理:通过 pagepageSize 参数计算 LIMIT 子句,实现分页功能。
  • SQL查询:直接查询 dede_archives 表。ismake = 1 代表已发布的文章。
  • 数据格式化
    • htmlspecialchars():对从数据库取出的文本进行转义,防止XSS攻击。
    • 图片路径拼接:织梦存储的图片路径通常是相对路径,需要拼接上你的域名才能在小程序中正常显示。
    • 时间戳转换:pubdate 字段是Unix时间戳,使用 date() 函数将其转换为可读的字符串。
  • JSON返回:使用 json_encode() 将PHP数组转换为JSON字符串,返回一个包含状态码、消息、数据和分页信息的标准结构,方便小程序统一处理。

第四步:小程序端调用接口

我们可以在小程序中使用 wx.request 来调用我们刚刚创建的接口。

  1. 在小程序的页面 .js 文件中,编写请求逻辑。
// pages/article-list/article-list.js
Page({
  data: {
    articleList: [],
    pagination: {
      page: 1,
      pageSize: 10,
      total: 0,
      totalPages: 0
    },
    isLoading: false
  },
  onLoad: function (options) {
    this.fetchArticleList();
  },
  // 下拉刷新
  onPullDownRefresh: function () {
    this.setData({
      'pagination.page': 1
    }, () => {
      this.fetchArticleList(() => {
        wx.stopPullDownRefresh();
      });
    });
  },
  // 上拉加载
  onReachBottom: function () {
    if (this.data.pagination.page < this.data.pagination.totalPages) {
      this.setData({
        'pagination.page': this.data.pagination.page + 1
      }, () => {
        this.fetchArticleList();
      });
    }
  },
  // 获取文章列表的方法
  fetchArticleList: function (callback) {
    if (this.data.isLoading) return; // 防止重复请求
    this.setData({ isLoading: true });
    const { page, pageSize } = this.data.pagination;
    // 替换成你自己的服务器域名和Token
    const apiUrl = 'http://your-domain.com/api/article_list.php';
    const token = 'your_secret_token_here';
    wx.request({
      url: apiUrl,
      method: 'GET',
      data: {
        page: page,
        pageSize: pageSize,
        token: token
      },
      success: (res) => {
        if (res.data.code === 200) {
          const newList = res.data.data.list;
          // 如果是第一页,直接替换;否则追加
          const finalList = page === 1 ? newList : [...this.data.articleList, ...newList];
          this.setData({
            articleList: finalList,
            pagination: res.data.data.pagination
          });
        } else {
          wx.showToast({
            title: res.data.msg || '获取数据失败',
            icon: 'none'
          });
        }
      },
      fail: (err) => {
        console.error('请求失败:', err);
        wx.showToast({
          title: '网络请求失败',
          icon: 'none'
        });
      },
      complete: () => {
        this.setData({ isLoading: false });
        if (typeof callback === 'function') {
          callback();
        }
      }
    });
  }
});

小程序代码解释

  • 域名配置:在小程序管理后台的“开发” -> “开发管理” -> “开发设置”中,将你的服务器域名添加到“request合法域名”列表中。
  • Token:在请求时,将 token 作为参数传递。
  • 分页逻辑
    • onLoad: 页面加载时,请求第一页数据。
    • onPullDownRefresh: 下拉刷新时,重置页码为1,重新请求数据。
    • onReachBottom: 上拉加载时,页码加1,追加新数据。
  • 数据合并fetchArticleList 方法中,判断当前是否是第一页,决定是替换列表还是追加列表,这是实现无限滚动列表的关键。

第五步:进阶与最佳实践

  1. 接口封装:在小程序中,可以将 wx.request 封装成一个全局的 api.js,方便统一管理接口地址、请求拦截(如自动添加token)和响应拦截(如统一处理错误码)。

  2. 更复杂的接口

    • 获取文章详情:接口 api/article_detail.php,接收 id 参数,查询 dede_archivesdede_addonarticle(如果需要),返回完整的文章内容。
    • 获取栏目列表:接口 api/category_list.php,查询 dede_arctype 表,返回栏目列表。
  3. 安全性增强

    • 签名机制:比Token更安全,将所有参数(包括token)按字典序排序,拼接成一个字符串,然后使用你和客户端都知道的另一个密钥(如 app_secret)进行HMAC-SHA1等加密,生成一个 sign 值,服务器端用同样的方法计算 sign 进行比对,这可以防止参数被篡改。
    • HTTPS:务必在生产环境中使用HTTPS,加密所有传输数据。
  4. 性能优化

    • 缓存:对于不经常变化的数据(如栏目列表),可以使用Redis等缓存技术,减少数据库查询压力。
    • 数据库索引:确保 dede_archives 表中的 typeid, ismake, pubdate 等常用查询字段有索引,可以极大提升查询速度。

通过以上步骤,你就可以成功地为织梦CMS开发出功能完善、安全可靠的小程序接口了,核心就是“解耦”,让接口独立于织梦的模板和流程,专注于数据交换。

-- 展开阅读全文 --
头像
dede系统模板插件如何选择与使用?
« 上一篇 04-18
dede如何获取当前域名?
下一篇 » 04-18

相关文章

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

目录[+]