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

(图片来源网络,侵删)
下面我将分步为你讲解整个开发流程,从环境准备到具体接口开发,再到小程序端的调用。
第一步:准备工作
-
本地开发环境:
- PHP环境:织梦基于PHP,你需要一个PHP运行环境,如
phpStudy、XAMPP或Docker。 - MySQL数据库:织梦使用MySQL,确保你的本地环境已经安装并配置好MySQL。
- 织梦CMS:下载并完整安装一个织梦CMS到你的本地服务器,确保网站能正常访问。
- PHP环境:织梦基于PHP,你需要一个PHP运行环境,如
-
小程序开发工具:
下载并安装对应平台(如微信开发者工具)的开发工具。
(图片来源网络,侵删) -
核心思路:
- 接口文件:在织梦网站根目录下,创建一个专门的文件夹,
api/,用于存放所有的接口文件。 - 安全验证:所有接口都必须有安全验证机制,防止恶意调用,最简单的方式是使用
Token。 - 数据库连接:接口文件需要直接连接到织梦的数据库,而不是依赖织梦的全局变量
$dsql,因为全局变量在独立PHP脚本中可能未定义。
- 接口文件:在织梦网站根目录下,创建一个专门的文件夹,
第二步:创建通用数据库连接类
为了避免在每个接口文件里都重复写数据库连接代码,我们创建一个通用的数据库连接类。
-
在
api/文件夹下创建一个文件db.php。 -
编辑
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();
}
}
?>
第三步:开发具体接口
我们以开发一个“获取文章列表”的接口为例,这个接口将接收分页参数,并返回指定数量的文章列表。
-
在
api/文件夹下创建一个文件article_list.php。 -
编辑
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参数。 - 分页处理:通过
page和pageSize参数计算LIMIT子句,实现分页功能。 - SQL查询:直接查询
dede_archives表。ismake = 1代表已发布的文章。 - 数据格式化:
htmlspecialchars():对从数据库取出的文本进行转义,防止XSS攻击。- 图片路径拼接:织梦存储的图片路径通常是相对路径,需要拼接上你的域名才能在小程序中正常显示。
- 时间戳转换:
pubdate字段是Unix时间戳,使用date()函数将其转换为可读的字符串。
- JSON返回:使用
json_encode()将PHP数组转换为JSON字符串,返回一个包含状态码、消息、数据和分页信息的标准结构,方便小程序统一处理。
第四步:小程序端调用接口
我们可以在小程序中使用 wx.request 来调用我们刚刚创建的接口。
- 在小程序的页面
.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方法中,判断当前是否是第一页,决定是替换列表还是追加列表,这是实现无限滚动列表的关键。
第五步:进阶与最佳实践
-
接口封装:在小程序中,可以将
wx.request封装成一个全局的api.js,方便统一管理接口地址、请求拦截(如自动添加token)和响应拦截(如统一处理错误码)。 -
更复杂的接口:
- 获取文章详情:接口
api/article_detail.php,接收id参数,查询dede_archives和dede_addonarticle(如果需要),返回完整的文章内容。 - 获取栏目列表:接口
api/category_list.php,查询dede_arctype表,返回栏目列表。
- 获取文章详情:接口
-
安全性增强:
- 签名机制:比Token更安全,将所有参数(包括token)按字典序排序,拼接成一个字符串,然后使用你和客户端都知道的另一个密钥(如
app_secret)进行HMAC-SHA1等加密,生成一个sign值,服务器端用同样的方法计算sign进行比对,这可以防止参数被篡改。 - HTTPS:务必在生产环境中使用HTTPS,加密所有传输数据。
- 签名机制:比Token更安全,将所有参数(包括token)按字典序排序,拼接成一个字符串,然后使用你和客户端都知道的另一个密钥(如
-
性能优化:
- 缓存:对于不经常变化的数据(如栏目列表),可以使用Redis等缓存技术,减少数据库查询压力。
- 数据库索引:确保
dede_archives表中的typeid,ismake,pubdate等常用查询字段有索引,可以极大提升查询速度。
通过以上步骤,你就可以成功地为织梦CMS开发出功能完善、安全可靠的小程序接口了,核心就是“解耦”,让接口独立于织梦的模板和流程,专注于数据交换。
