Halo CMS对接微信小程序,内容同步展示
先理清同步思路
Halo CMS 本身是一个博客/内容管理系统,微信小程序不能直接读取它的数据库。
可行方式是让 Halo 暴露文章接口,小程序端用 wx.request 拉取 JSON 数据再渲染。
Halo 2.x 默认提供内容 API,通常需要先在后台生成个人令牌(Personal Access Token),再通过 /apis/api.content.halo.run/v1alpha1/posts 这类地址获取文章列表。
最终效果是:你在 Halo 发布文章,小程序下拉刷新后能看到新内容。
准备条件与后台配置
开始前确认三件事:Halo 站点已能正常访问、小程序已注册并拿到 AppID、服务器允许外部请求 API 域名。
登录 Halo 后台,进入 用户 → 个人令牌,新建一个令牌,权限至少勾选文章读取相关范围。
复制生成的令牌字符串,它只在创建时显示一次。
接着确认 API 地址。
常见形式如下,实际路径以你 Halo 版本和控制台显示为准:
https://你的域名/apis/api.content.halo.run/v1alpha1/posts
在服务器上用 curl 验证接口是否可访问:
curl -H "Authorization: Bearer 你的令牌" \
"https://你的域名/apis/api.content.halo.run/v1alpha1/posts?page=1&size=10"
如果返回 JSON 且包含 items 字段,说明接口通了。
若返回 401,检查令牌是否复制完整;
返回 404,检查路径和 Halo 版本。
小程序端拉取与渲染
微信小程序要求请求域名加入白名单。
进入 微信公众平台 → 开发 → 开发管理 → 服务器域名,把 Halo 的域名加到 request合法域名。
在小程序页面的 js 中发起请求:
wx.request({
url: 'https://你的域名/apis/api.content.halo.run/v1alpha1/posts?page=1&size=10',
header: {
'Authorization': 'Bearer 你的令牌'
},
success(res) {
console.log(res.data.items)
}
})
拿到数据后,用 wx:for 渲染列表,点击跳转到详情页时再请求单篇文章接口。
详情接口通常类似:
https://你的域名/apis/api.content.halo.run/v1alpha1/posts/文章name
注意:令牌不要写在小程序前端代码里直接提交到公开仓库,更稳妥的做法是让小程序请求你自己的后端,由后端转发并携带令牌。
容易踩坑的地方
- 域名必须 HTTPS:微信小程序正式环境只允许 https 请求,HTTP 或自签名证书会失败。
- 令牌权限不足:只勾选部分权限时,文章列表能读、详情读不到是常见现象,建议先给足读取范围再收紧。
- 跨域与 CDN:如果 Halo 前面套了 CDN 或 Nginx,要确认
/apis/路径没有被拦截或缓存。 - 分页参数:不同版本对
page、size的默认值可能不同,建议显式传参。 - 内容格式:Halo 返回的正文可能是 HTML 或 Markdown,小程序
rich-text组件对 HTML 支持有限,必要时在后端转成纯文本或分段结构。
验证同步是否成功
在 Halo 后台新发一篇文章,回到小程序下拉刷新。
如果列表出现新标题,点进详情能看到正文,说明同步链路正常。
再检查图片是否能加载,图片域名同样要加入小程序白名单。
如果列表没更新,先在小程序开发者工具里看 Network 面板的请求状态码和返回体。
200 但数据为空,多半是权限或分页问题;
401 查令牌;
404 查接口路径。
常见疑问
Halo 版本不同接口会变吗? 会。
Halo 2.x 与后续版本在 API 路径和权限命名上可能有调整,建议以你后台实际显示的接口和控制台文档为准。
能不能不用令牌直接读? 部分公开站点可以匿名读取公开文章,但一旦涉及草稿或权限控制,就需要令牌。
生产环境建议走令牌加后端转发。
同步是实时的吗? 取决于小程序端请求频率。
Halo 发布后接口数据立即变化,小程序需要主动刷新或定时拉取才能看到最新内容。