BuildingAI 帮助文档
BuildingAI 官网
  1. 应用开发
  • 欢迎使用 BuildingAI
  • 演示环境
  • 用户社群
  • 企业版咨询
  • 产品线路图
  • 更新日志
  • API 赞助商
  • 积分获取方式
  • 应用安装教程「必看」
  • 使用教程
    • 快速使用
      • 对话
      • 智能体
      • 知识库
      • 工作流
      • MCP 服务
      • 登录配置
      • 密钥配置
      • 模型计费
      • 积分充值
      • 会员订阅
      • 卡密兑换
      • DIY装修
    • 常见配置教程
      • 微信支付配置
      • 支付宝支付配置
      • 微信公众号配置
      • OSS存储配置
      • 短信配置
      • 谷歌登录配置
      • Ollama配置
    • 应用配置教程
      • 香蕉绘画-使用教程
      • Sora2短剧视频-使用教程
      • 即梦AI绘画-使用教程
      • wan2.6漫剧-使用教程
    • 大模型申请教程
      • 即梦AI密钥-申请教程
      • 豆包大模型-申请教程
      • 通义千问-申请教程
    • 老版本教程
      • 功能使用教程
      • 智能体
      • MCP工具
      • DIY中心
  • 部署教程
    • 宝塔面板部署
    • Windows 环境下 Docker 部署
    • Docker方式安装
  • 开发文档
    • 网络接口
      • 登录注册
        • 账号密码登录
        • 账号密码注册
      • 前台
        • 文件上传/下载
          • 单个上传
          • 多个上传
          • 列表
          • 详情
          • 下载
          • 删除
        • 用户
          • 算力明细
          • 登录配置
        • AI聊天
          • 对话(非流式)
          • 流式对话
          • 对话记录
          • 对话详情
          • 修改记录
          • 删除记录
          • 获取记录对话
        • MCP
          • 列表
          • 所有记录
          • 详情:id
          • 创建
          • 修改
          • 可见状态
          • 添加
          • 关联详情
          • 系统MCP
          • json导入
          • 移除
          • 删除
          • 获取快捷菜单
          • 系统MCP详情:id
          • 连通性
          • 批量连通性
        • 充值中心
          • 充值中心
          • 充值提交订单
          • 充值记录
          • 预支付
          • 获取支付结果
        • 模型厂商
          • 列表
          • 详情:id
          • 详情:code
        • AI模型
          • 列表
          • 详情:id
          • 默认模型
        • 数据分析
          • 数据记录
        • 会员中心
          • 会员中心信息
          • 获取套餐列表
          • 预支付
          • 订阅提交订单
      • 后台
        • 工作空间
          • MCP
            • 列表
            • 详情
            • 创建
            • 修改
            • 删除
            • 批量删除
            • 启用状态
            • json导入
            • 连通性
            • 批量连通性
            • 获取快捷菜单
            • 设置快捷菜单
          • AI模型
            • 厂商管理
              • 列表
              • 新增
              • 详情:id
              • 详情:provider
              • 修改
              • 删除
              • 状态
            • 模型管理
              • 列表
              • 新增
              • 详情:id
              • 修改
              • 删除:id
              • 批量删除
              • 设为默认
              • 模型类型
              • 模型支持能力
              • 父级模型类型
          • AI知识库
            • 知识库列表
            • 知识库详情
            • 转移知识库
            • 知识库删除
            • 知识库文档列表
            • 知识库文档详情
            • 知识库文档删除
            • 知识库分段列表
            • 知识库分段详情
            • 知识库分段删除
            • 数据列表接口
          • AI智能体
            • 智能体创建
            • 智能体列表
            • 智能体详情
            • 智能体对话记录列表
            • 智能体对话记录详情
            • 智能体对话
            • 智能体发布API接口对话
            • 智能体发布API获取对话列表
            • 智能体发布API获取对话消息
            • 智能体发布API更新对话
            • 智能体发布API删除对话
          • 密钥管理
            • 密钥模板
              • 列表
              • 全部列表
              • 详情
              • 创建
              • 修改
              • 删除
              • 批量删除
              • 修改状态
              • json导入
            • 密钥配置
              • 列表
              • 列表:templateId
              • 创建
              • 统计
              • 详情
              • 完整详情
              • 修改
              • 修改状态
              • 删除
              • 批量删除
        • 用户管理
          • 列表
          • 创建
          • 详情:id
          • 删除
          • 批量删除
          • 重置密码
          • 更新状态
          • 重置随机密码
          • 登录设置
          • 登录设置
        • 角色管理
          • 创建
          • 详情:id
          • 修改
          • 删除
          • 列表
        • 菜单管理
          • 创建
          • 详情:id
          • 修改
          • 删除
          • 列表
        • 插件管理
          • 我的插件
            • 列表
            • 修改
            • 详情:id
            • 创建
            • 启用列表
            • 批量删除
            • 删除:id
            • 批量状态
            • 禁用:id
            • 启用:id
            • 是否存在:identifier
            • 详情:identifier
            • 入库插件详情:identifier
            • 本地列表
            • 类型列表
            • 版本列表:identifier
            • 安装
            • 卸载
          • 插件操作
            • 下载
            • 安装
          • 平台密钥
            • 获取开发者密钥
            • 设置开发者密钥
        • 权限管理
          • 列表
          • 扫描权限
          • 同步到库
          • 扫描接口
          • 清理废弃权限
          • 详情:code
        • 字典配置
          • 列表
        • 系统操作
          • 支付配置
            • 列表
            • 详情:id
            • 状态
            • 更新
          • 系统信息
            • 安装状态
            • 安装状态
          • pm2
            • 进程列表
            • 日志
            • 重启
            • 重载
            • 停止进程
            • 进程详情
            • 进程状态
            • 清空日志
            • 保存进程
            • 健康检查
            • 删除进程
        • 套餐充值
          • 获取套餐充值配置
          • 获取套餐充值配置 Copy
        • 财务
          • 财务中心
          • 用户余额明细
        • 订单管理
          • 充值订单列表
          • 充值订单详情
          • 充值订单退款
          • 会员订单列表
        • 渠道管理
          • 公众号配置
            • 详情
            • 修改
        • 数据分析
          • 数据看板
        • VIP 会员
          • 会员等级
            • 新增会员等级
            • 会员等级列表
            • 修改会员等级
            • 会员等级详情
            • 删除会员等级
          • 订阅计划
            • 新增订阅计划
            • 订阅计划设置
            • 设置会员功能状态
            • 更改订阅计划状态
            • 订阅计划详情
            • 修改订阅计划
            • 删除订阅计划
            • 更新订阅计划排序
      • 插件
        • 文章插件
          • 前台
            • 列表
          • 后台
            • 文章
              • 列表
              • 创建
            • 分类
              • 列表
              • 创建
        • 智能体-企业微信插件
          • 对话接口
        • 配图大师
          • 后台
            • 配图记录
            • 获取配图插件
            • 插件设置
    • 插件与框架开发
      • 技术规范
      • 前置准备
      • 本地部署与开发
      • 目录结构
      • 项目配置
      • 主程序启动链路
      • 请求处理链路
      • 后端开发约定
      • BaseController 与 BaseService
      • DTO、工具与通用服务
      • 前端开发
      • 主程序计费接入
      • 数据库与实体建议
      • AI SDK 开发文档
      • BuildingAI 升级开发文档
      • 应用开发
        • 介绍
        • 创建应用
        • 模板结构
        • 应用开发
        • 打包发布
        • 插件更新
        • 插件清单文件
        • 插件后端开发
        • 插件前端开发
        • Extension SDK 怎么用
        • 插件计费接入
        • 插件 AI 能力接入建议
        • Seeds、Upgrade 与存储
        • 插件升级开发文档
        • 构建与发布
      • PC 客户端
        • 开发文档
        • 构建文档
  • 设计资源
    • 官方素材库
  • 政策
    • 开源许可
    • 服务条款
    • 隐私政策
  1. 应用开发

插件计费接入

插件里如果涉及用户积分消耗或返还,优先使用:
ExtensionBillingModule
ExtensionBillingService
不要在插件里直接改 user.power。

1. 计费模块位置#

packages/@buildingai/extension-sdk/src/modules/billing/
├── extension-billing.module.ts
└── extension-billing.service.ts
底层仍然复用主程序的:
BaseBillingService
User
AccountLog

2. 为什么插件也必须走计费服务#

因为插件计费服务除了加减积分,还会:
1.
校验余额
2.
写 account_log
3.
自动把来源记成插件来源
4.
从运行时堆栈识别当前插件标识符
5.
通过插件配置反查插件名称
如果你直接改 user.power,会丢失:
流水来源
插件归属
运营/财务可追踪性

3. 如何注册 ExtensionBillingModule#

如果你的插件模块要用计费服务,建议在插件模块里显式引入:
import { ExtensionBillingModule } from "@buildingai/extension-sdk";

@Module({
    imports: [ExtensionBillingModule],
    providers: [ArticleService],
})
export class ArticleModule {}
虽然它被标记为 @Global(),但仍建议由插件某个根模块显式导入一次,避免运行时 provider 不可见。
对应的 service 注入写法:
@Injectable()
export class ArticleService {
    constructor(
        private readonly extensionBillingService: ExtensionBillingService,
    ) {}
}

4. ExtensionBillingService 提供的方法#

hasSufficientPower(userId, requiredAmount)#

判断用户余额是否足够:
const ok = await this.extensionBillingService.hasSufficientPower(userId, 5);
if (!ok) {
    throw HttpErrorFactory.badRequest("积分不足");
}

deductUserPower(options, entityManager?)#

给插件业务扣费。

addUserPower(options, entityManager?)#

给插件业务返积分或赠送积分。
一个最小可运行示例:
@Injectable()
export class ArticleService {
    constructor(
        private readonly extensionBillingService: ExtensionBillingService,
    ) {}

    async polish(userId: string, taskNo: string) {
        await this.extensionBillingService.deductUserPower({
            userId,
            amount: 5,
            remark: "文章润色消耗",
            associationNo: taskNo,
        });
    }
}

5. 插件扣费参数怎么填#

插件层传入的参数比主程序少一些,因为:
source
accountType
这两项由 ExtensionBillingService 自动补。
基础写法:
await this.extensionBillingService.deductUserPower({
    userId,
    amount: 5,
    remark: "文章生成消耗",
    associationNo: taskNo,
});
底层会自动补成:
accountType: ACCOUNT_LOG_TYPE.PLUGIN_DEC
source.type: ACCOUNT_LOG_SOURCE.PLUGIN
source.source: 当前插件名称
所以插件只需要关心:
用户是谁
扣多少
这次扣费属于哪个业务单号
备注怎么写

6. 插件加积分参数怎么填#

await this.extensionBillingService.addUserPower({
    userId,
    amount: 10,
    remark: "任务失败返还积分",
    associationNo: taskNo,
});
适合:
插件执行失败退回积分
运营活动赠送积分
业务补偿

7. 插件计费的一个关键注意点#

当前实现里:
deductUserPower() 和 addUserPower()
都会使用 ACCOUNT_LOG_TYPE.PLUGIN_DEC
真正区分“增加还是扣减”的字段,是 AccountLog.action:
ACTION.DEC
ACTION.INC
所以如果你后续做插件账单报表,不要只按 accountType 判断增减,要结合:
accountType
action
一起看。

8. 插件名称是怎么识别出来的#

ExtensionBillingService 会通过调用栈识别当前插件标识符,再去扩展配置里取插件名称。
这意味着:
这个服务要从插件构建产物内部调用
不要把它脱离插件上下文拿到主程序其他位置去调用
否则可能出现:
找不到扩展标识符
抛出 Extension not found

9. 插件计费的常见模式#

模式一:执行前先校验最低积分#

const ok = await this.extensionBillingService.hasSufficientPower(userId, 5);
if (!ok) {
    throw HttpErrorFactory.badRequest("积分不足,请充值后再试");
}
适合:
长任务提交前
图片生成前
大模型工作流执行前

模式二:执行成功后按固定价格扣费#

await this.extensionBillingService.deductUserPower({
    userId,
    amount: 5,
    remark: "文章润色消耗",
    associationNo: taskNo,
});
适合:
固定单价功能
单次动作收费

模式三:执行失败返还积分#

await this.extensionBillingService.addUserPower({
    userId,
    amount: 5,
    remark: "文章润色失败返还",
    associationNo: taskNo,
});

模式四:按步骤分段扣费#

await this.extensionBillingService.deductUserPower({
    userId,
    amount: 2,
    remark: "文档解析消耗",
    associationNo: taskNo,
});

await this.extensionBillingService.deductUserPower({
    userId,
    amount: 3,
    remark: "摘要生成消耗",
    associationNo: taskNo,
});
适合:
多阶段工作流
每步成本不同的插件

10. 事务里的正确写法#

如果插件里需要“扣费 + 落业务数据”保证原子性,建议把 entityManager 传进去。
await this.articleRepository.manager.transaction(async (entityManager) => {
    await this.extensionBillingService.deductUserPower(
        {
            userId,
            amount: 5,
            remark: "文章生成消耗",
            associationNo: taskNo,
        },
        entityManager,
    );

    await entityManager.insert(ArticleTask, {
        userId,
        taskNo,
        status: "done",
    });
});
这样可以保证:
扣费成功但业务表写入失败时回滚
业务表写入成功但扣费失败时回滚

11. 插件计费最佳实践#

预校验余额与实际扣费建议分两步
associationNo 建议用任务号、订单号、工作流号
remark 要能让运营一眼看懂
大额或关键扣费放事务里
不要绕过 ExtensionBillingService 自己改余额
做退款/返还时尽量和原业务单号保持一致,方便追踪
修改于 2026-04-17 02:50:04
上一页
Extension SDK 怎么用
下一页
插件 AI 能力接入建议
Built with