Afdian Plus — 为 Halo 博客打造的爱发电数据集成插件

让赞助数据不再散落在爱发电后台,在你的博客里优雅地展示每一位支持者。

前话

用爱发电做创作者赞助的博主应该不少,但 Halo 商城原有的爱发电插件早已停更,接口失效、API 不兼容,升级 Halo 版本后直接报错。

与其等别人修,不如自己造一个。

Afdian Plus 从零开始编写,把赞助者、订单、方案、电铺商品、作品集全部拉到 Halo 里管理。后台有仪表盘看数据,前台有 Finder API 给主题用,Webhook 回调自动刷新数据并推送通知。配合 Serenity 主题,在关于页面一键展示赞助者墙和方案卡片。

一键拉取全部数据

在插件后台填入爱发电的 user_idAPI Token,点击「一键拉取」即可获取全部数据:

  • 赞助者列表(通过签名接口 query-sponsor,自动翻页,每页 100 条)

  • 订单列表(通过签名接口 query-order,自动翻页)

  • 方案数据(从赞助者的 sponsor_planscurrent_plan 中智能收集去重,再额外查询后台配置的方案 ID 补全)

  • 电铺商品(通过公开 API get-products,无需签名,自动翻页)

  • 作品集(通过公开 API get-album-list,无需签名,自动翻页)

拉取完成后,全部数据持久化到 ConfigMapplugin-afdian-plus-data),重启 Halo 不丢失。内存缓存可配置时长(默认 30 分钟,最大 24 小时),避免频繁请求爱发电 API。

双域名容灾

爱发电有两个域名afdian.comifdian.net。插件内置双域名自动回退机制——无论是签名接口(POST)还是公开接口(GET),都会依次尝试两个域名,第一个成功即返回。主域名超时或返回错误时自动切换到备用域名,确保数据拉取不中断。

每个请求有 15 秒超时限制,HTTP 客户端支持自动重定向。

后台仪表盘

插件提供可视化仪表盘,打开即可看到:

模块

内容

统计卡片

赞助者总数、订单总数、累计金额、方案数量(附带商品数量)

订单趋势

近 6 个月订单柱状图,当月高亮显示

赞助者排行

按累计金额排序的 Top 6,带头像、进度条和金额

最近订单

时间线形式展示最近 8 笔订单,显示金额、状态、赞助者名称、订单号

仪表盘数据来自缓存,加载速度快,不会每次都请求爱发电。

数据面板

除了仪表盘概览,还有独立的数据面板页面,分为六个 Tab:

赞助者

展示所有赞助者的头像、昵称、累计金额、最后支付时间和当前方案。

订单

展示所有订单的订单号、标题、金额、状态标签(已支付/未支付)、类型和创建时间。

方案

每个方案有「可见性」开关,控制该方案是否在主题前端展示。可见性通过后台一键切换。

方案卡片显示名称、价格、类型标签(订阅/商品/捆绑包/自选包/售票)和描述,点击可弹窗下单。

电铺商品

展示电铺商品的图片、名称、价格和在售状态。无需签名,点击可弹窗下单。

作品集

展示作品集的封面、标题、状态和篇数。

Webhook 日志

展示收到的 Webhook 回调记录,包含摘要信息和原始 JSON。最多保留 50 条,按时间倒序排列。

Webhook 回调

在爱发电后台设置 Webhook 地址:

https://你的域名/apis/console.api.afdian.halo.run/v1alpha1/afdian/-/webhook

收到支付回调后,插件会:

  1. 解析订单数据,提取订单号、方案 ID、金额、状态、备注

  2. 清除内存缓存,重新拉取全部五类数据并持久化

  3. 通过 Halo 通知系统向管理员发送新订单通知(站内通知 + 邮件)

通知模板已内置,自动为管理员用户订阅通知,开箱即用。

弹窗支付

方案卡片和电铺商品支持点击弹窗下单。插件提供 520×700 的居中小窗口打开爱发电支付页面,体验流畅。同时在后台创建一条赞助记录(状态为「未支付」),记录方案 ID、方案名称、金额、验证码和月数。

支付验证

用户完成支付后,插件会通过 query-order 接口查询最近订单(最多翻 5 页),查找同时满足以下条件的订单:

  • plan_id 匹配

  • status 为 2(已支付)

  • remark 包含验证码

匹配成功后,更新赞助记录状态为「已支付」,并向管理员发送通知。

赞助记录管理

后台提供独立的赞助记录面板,展示所有前台和后台创建的赞助订单记录。支持按状态筛选(全部/已支付/未支付),可删除单条记录。最多保留 200 条。

主题集成(Finder API)

插件注册 afdianPlusFinder 到 Thymeleaf 上下文,主题模板可直接调用:

方法

说明

afdianPlusFinder.listAllSponsor()

获取全部赞助者(不需要授权)

afdianPlusFinder.listAllOrder()

获取全部订单(需要授权)

afdianPlusFinder.listAllPlan()

获取可见方案(需要授权)

afdianPlusFinder.listAllProduct()

获取电铺全部商品(需要授权)

afdianPlusFinder.listAllAlbum()

获取全部作品集(需要授权)

afdianPlusFinder.parseTime(timestamp)

秒级时间戳转 yyyy-MM-dd

返回结构统一为 { "data": { "total_count": N, "list": [...] } }

Serenity 主题集成

Serenity 主题已内置完整集成,在主题设置 > 关于页面中开启爱发电即可,无需手动写模板。主题中的爱发电区域包含:

  • 赞助者墙:直接展示所有赞助者的头像、昵称、金额和时间

  • 发电方案:折叠面板,展开后显示方案卡片网格,点击弹窗下单

  • 电铺商品:折叠面板,展开后显示商品卡片网格,带图片预览

  • 底部按钮:链接到爱发电主页

  • 弹窗支付:选择订阅时长、填写备注、前往支付、验证支付

赞助者墙示例

<!-- 赞助者墙 -->
<th:block th:with="sponsorData = ${afdianPlusFinder.listAllSponsor()}">
  <div th:if="${sponsorData != null && sponsorData.data != null}"
       th:each="sponsor : ${sponsorData.data.list}">
    <img th:src="${sponsor.user.avatar}" />
    <span th:text="${sponsor.user.name}">用户名</span>
    <span th:text="|¥${sponsor.all_sum_amount}|">¥0</span>
  </div>
</th:block>

<!-- 方案卡片(仅展示可见方案) -->
<th:block th:with="planData = ${afdianPlusFinder.listAllPlan()}">
  <div th:if="${planData != null && planData.data != null}"
       th:each="plan : ${planData.data.list}">
    <span th:text="${plan.name}">方案名</span>
    <span th:text="|¥${plan.price ?: plan.show_price}|">¥0</span>
  </div>
</th:block>

配置说明

在插件后台「API 配置」页面设置:

配置项

说明

用户 ID (user_id)

爱发电创作者管理 > 开发者设置中获取

API Token

爱发电创作者管理 > 开发者设置中获取

缓存时长

数据缓存分钟数,默认 30,最大 1440(24 小时)

方案的可见性在数据面板的「方案」Tab 中通过开关控制,不在设置页面配置。

免费功能

插件提供基础的免费功能(已适配Serenity主题):赞助者列表的拉取和展示不需要授权,安装配置基础数据即可使用。主题端通过 afdianPlusFinder.listAllSponsor() 获取赞助者数据不受授权限制,关于页面的赞助者墙开箱即用。

795a6620-d978-4e78-84d6-88f0723ea95a.png

环境要求

  • Halo >= 2.20.0

写在最后

Afdian Plus 把爱发电商城搬进 Halo,后台有仪表盘一目了然,前台有 Finder API 灵活展示,Webhook 回调让数据实时同步,自动下发商品。双域名容灾保证稳定性,通知系统让你不错过每一笔赞助,搭建一个属于你自己的支付方案。

如果你在用爱发电做创作者赞助,又想在博客里展示赞助者墙或方案卡片,这个插件应该能帮到你。

下载地址:https://serenity.aobp.cn/store