消息中心
站内消息模板维护、消息发送、消息记录与小程序订阅消息推送记录查询。消息模板同时承载站内消息渲染与微信、支付宝、百度、抖音、QQ、快手小程序订阅消息下发配置;推送渠道取值与会员注册来源一致。
消息模板列表
接口地址
GET /admin/message/template/list接口参数说明
无请求参数。
响应示例
{
"code": 0,
"msg": "success",
"data": [
{
"id": 1,
"created_at": "2026-09-25T10:00:00+08:00",
"updated_at": "2026-09-25T10:00:00+08:00",
"template_code": "order_pay_success",
"name": "订单支付成功通知",
"msg_type": "order",
"title_template": "您的订单 {{order_no}} 支付成功",
"content_template": "订单金额:¥{{amount}}\n支付时间:{{pay_time}}",
"cover_image": "uploads/2026/09/cover.png",
"cover_url": "https://oss.example.com/uploads/2026/09/cover.png",
"jump_type": 3,
"jump_url_template": "/pages/order/detail?id={{order_id}}",
"miniapp_wechat": "{\"template_id\":\"xWX9z...\",\"page\":\"pages/order/detail\",\"data_fields\":{\"thing1\":\"order_no\",\"amount2\":\"amount\"}}",
"miniapp_alipay": "",
"miniapp_baidu": "",
"miniapp_douyin": "",
"miniapp_qq": "",
"miniapp_ks": "",
"push_channels": [1, 6, 8],
"variables": "[{\"name\":\"order_no\",\"label\":\"订单号\",\"required\":1}]",
"status": 1,
"remark": ""
}
]
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
data[].id | integer | 主键ID |
data[].created_at | string | 创建时间 |
data[].updated_at | string | 更新时间 |
data[].template_code | string | 模板编码,业务调用唯一标识 |
data[].name | string | 模板名称 |
data[].msg_type | string | 消息类型 system 系统通知 / order 订单通知 / marketing 营销消息 / interactive 互动消息 / service 客服消息 |
data[].title_template | string | 站内消息标题模板,支持 占位符 |
data[].content_template | string | 站内消息内容模板,支持 占位符 |
data[].cover_image | string | 默认封面图相对路径 |
data[].cover_url | string | 封面图完整地址(按当前默认存储动态补全) |
data[].jump_type | integer | 跳转类型 0不跳转 1站内页 2H5链接 3小程序页面 |
data[].jump_url_template | string | 跳转地址模板,支持 占位符 |
data[].miniapp_wechat | string | 微信小程序订阅消息配置JSON:{"template_id":"","page":"","data_fields":{"字段":"变量名"}} |
data[].miniapp_alipay | string | 支付宝小程序模板消息配置JSON,结构同微信 |
data[].miniapp_baidu | string | 百度小程序订阅消息配置JSON,结构同微信 |
data[].miniapp_douyin | string | 抖音小程序订阅消息配置JSON,结构同微信 |
data[].miniapp_qq | string | QQ小程序订阅消息配置JSON,结构同微信 |
data[].miniapp_ks | string | 快手小程序订阅消息配置JSON,结构同微信 |
data[].push_channels | array<integer> | 启用的推送渠道,取值与会员注册来源一致 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
data[].variables | string | 模板变量定义JSON数组:[{"name":"order_no","label":"订单号","required":1}] |
data[].status | integer | 状态 1启用 2禁用 |
data[].remark | string | 备注 |
新增/修改消息模板
接口地址
POST /admin/message/template/save接口说明
传 id 为修改,不传为新增;模板编码全局唯一。启用的小程序渠道必须在对应 miniapp_* 配置中填写 template_id;变量定义中的变量名不可重复;发送时必填变量(required 为 1)必须传值。
接口参数说明
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 否 | 主键ID,新增时不传 |
template_code | string | 是 | 模板编码,业务调用唯一标识,最长 64 位 |
name | string | 是 | 模板名称 |
msg_type | string | 是 | 消息类型 system / order / marketing / interactive / service |
title_template | string | 是 | 站内消息标题模板,支持 占位符 |
content_template | string | 否 | 站内消息内容模板 |
cover_image | string | 否 | 默认封面图相对路径 |
jump_type | integer | 否 | 跳转类型 0不跳转 1站内页 2H5链接 3小程序页面 |
jump_url_template | string | 否 | 跳转地址模板,支持 占位符 |
miniapp_wechat | string | 否 | 微信小程序订阅消息配置JSON,启用微信渠道时必填 |
miniapp_alipay | string | 否 | 支付宝小程序模板消息配置JSON,启用支付宝渠道时必填 |
miniapp_baidu | string | 否 | 百度小程序订阅消息配置JSON,启用百度渠道时必填 |
miniapp_douyin | string | 否 | 抖音小程序订阅消息配置JSON,启用抖音渠道时必填 |
miniapp_qq | string | 否 | QQ小程序订阅消息配置JSON,启用QQ渠道时必填 |
miniapp_ks | string | 否 | 快手小程序订阅消息配置JSON,启用快手渠道时必填 |
push_channels | array<integer> | 否 | 启用的推送渠道,取值与会员注册来源一致 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
variables | string | 否 | 模板变量定义JSON数组 |
status | integer | 是 | 状态 1启用 2禁用 |
remark | string | 否 | 备注 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"created_at": "2026-09-25T10:00:00+08:00",
"updated_at": "2026-09-25T10:00:00+08:00",
"template_code": "order_pay_success",
"name": "订单支付成功通知",
"msg_type": "order",
"title_template": "您的订单 {{order_no}} 支付成功",
"content_template": "订单金额:¥{{amount}}",
"cover_image": "",
"cover_url": "",
"jump_type": 3,
"jump_url_template": "/pages/order/detail?id={{order_id}}",
"miniapp_wechat": "",
"miniapp_alipay": "",
"miniapp_baidu": "",
"miniapp_douyin": "",
"miniapp_qq": "",
"miniapp_ks": "",
"push_channels": [1],
"variables": "",
"status": 1,
"remark": ""
}
}响应参数说明
响应字段与「消息模板列表」中的单个模板结构一致。
删除消息模板
接口地址
POST /admin/message/template/delete接口说明
已产生站内消息或推送记录的模板不能删除。
接口参数说明
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 是 | 主键ID |
响应示例
{
"code": 0,
"msg": "success",
"data": null
}响应参数说明
成功时 data 为 null。
发送消息
接口地址
POST /admin/message/send接口说明
两种模式二选一:传 template_code 时按模板发送,使用 variables 渲染标题、内容与跳转地址,并按模板启用的渠道执行小程序订阅推送;不传 template_code 时为自定义发送,必须填写 msg_type 与 title,仅发送站内消息(小程序推送需模板配置,自定义发送不支持)。
小程序订阅推送下发前按平台字段类型前缀做本地适配(字段名如 thing1、amount2):thing/name/phrase/letter/symbol/character_string/string/status/car_number/phone_number 等文本类超长自动截断(如 thing 20 字符);number/amount 校验必须为数字,不合法时该渠道记录失败原因。time/date/enum 等格式类字段由平台侧校验,失败原因同样落推送记录。
支持批量:receiver_sns 最多 100 个会员编号(去重后),每个接收会员各落一条站内消息;任一编号不存在时整体失败并提示不存在的编号。会员未绑定某渠道小程序身份、对应配置未启用或未订阅时,该渠道记录推送失败及原因,不影响站内消息本身。
小程序订阅推送执行前会先查询会员订阅记录(sys_message_subscription)预检:未订阅或剩余可推送次数用尽时,该渠道直接记录失败原因「该会员未订阅此模板或订阅次数已用尽」,不再请求平台接口;推送成功后剩余次数扣减一。订阅记录由用户端在订阅授权成功后上报累加,见用户端「上报订阅结果」接口与「订阅记录列表」查询接口。
接口参数说明
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
template_code | string | 否 | 模板编码,填写后按模板发送 |
receiver_sns | array<string> | 是 | 接收会员编号列表(sys_member.sn),最多 100 个 |
variables | object | 否 | 模板变量值,键为变量名,如 {"order_no":"ORD202610010001"} |
msg_type | string | 否 | 自定义消息类型 system / order / marketing / interactive / service,不按模板发送时必填 |
title | string | 否 | 自定义消息标题,不按模板发送时必填 |
content | string | 否 | 自定义消息内容 |
jump_type | integer | 否 | 自定义跳转类型 0不跳转 1站内页 2H5链接 3小程序页面 |
jump_url | string | 否 | 自定义跳转地址或小程序页面路径 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"total": 2,
"pushes": [
{
"channel": 1,
"success": 1,
"failed": 1
}
]
}
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
data.total | integer | 站内消息发送条数(等于去重后的接收会员数) |
data.pushes[] | array | 各渠道推送结果汇总 |
data.pushes[].channel | integer | 推送渠道 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
data.pushes[].success | integer | 该渠道推送成功数 |
data.pushes[].failed | integer | 该渠道推送失败数,失败明细见「推送记录列表」 |
消息记录列表
接口地址
GET /admin/message/list接口参数说明
| Query 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
receiver_sn | string | 否 | 按接收会员编号精确筛选 |
msg_type | string | 否 | 消息类型 system / order / marketing / interactive / service |
page | integer | 否 | 页码,默认 1 |
page_size | integer | 否 | 每页数量,默认 20,最大 100 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"list": [
{
"id": 100,
"created_at": "2026-09-25T10:00:00+08:00",
"updated_at": "2026-09-25T10:00:00+08:00",
"receiver_sn": "M202609251754509918",
"receiver_nickname": "张三",
"receiver_avatar": "https://oss.example.com/uploads/2026/09/avatar.png",
"msg_type": "order",
"title": "您的订单 ORD202610010001 支付成功",
"content": "订单金额:¥99.00",
"cover_image": "uploads/2026/09/cover.png",
"cover_url": "https://oss.example.com/uploads/2026/09/cover.png",
"jump_type": 3,
"jump_url": "/pages/order/detail?id=123456",
"is_read": 0,
"read_at": null,
"biz_type": "order",
"biz_id": "123456",
"template_id": 1,
"send_source": 2
}
],
"total": 1
}
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
list | array | 消息列表 |
list[].id | integer | 主键ID |
list[].created_at | string | 发送时间 |
list[].updated_at | string | 更新时间 |
list[].receiver_sn | string | 接收会员编号 |
list[].receiver_nickname | string | 接收会员昵称 |
list[].receiver_avatar | string | 接收会员头像地址 |
list[].msg_type | string | 消息类型 system / order / marketing / interactive / service |
list[].title | string | 消息标题 |
list[].content | string | 消息内容 |
list[].cover_image | string | 封面图相对路径 |
list[].cover_url | string | 封面图完整地址 |
list[].jump_type | integer | 跳转类型 0不跳转 1站内页 2H5链接 3小程序页面 |
list[].jump_url | string | 跳转地址或小程序页面路径 |
list[].is_read | integer | 是否已读 0未读 1已读 |
list[].read_at | string | 已读时间,未读为 null |
list[].biz_type | string | 关联业务类型 |
list[].biz_id | string | 关联业务ID |
list[].template_id | integer | 来源模板ID,0表示无模板 |
list[].template_name | string | 来源模板名称,模板已删除时为空 |
list[].send_source | integer | 发送来源 1系统自动 2后台手动发送 3业务触发 |
total | integer | 数据总数 |
推送记录列表
接口地址
GET /admin/message/push_record/list接口参数说明
| Query 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
message_id | integer | 否 | 按站内消息ID筛选 |
receiver_sn | string | 否 | 按接收会员编号筛选 |
channel | integer | 否 | 推送渠道 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
status | integer | 否 | 推送状态 1待发送 2成功 3失败 |
page | integer | 否 | 页码,默认 1 |
page_size | integer | 否 | 每页数量,默认 20,最大 100 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"list": [
{
"id": 1,
"created_at": "2026-09-25T10:00:00+08:00",
"updated_at": "2026-09-25T10:00:00+08:00",
"message_id": 100,
"template_id": 1,
"receiver_sn": "M202609251754509918",
"channel": 1,
"openid": "oXyz123...",
"template_data": "{\"thing1\":{\"value\":\"ORD202610010001\"}}",
"status": 2,
"fail_reason": "",
"third_party_msg_id": "",
"sent_at": "2026-09-25T10:00:01+08:00"
}
],
"total": 1
}
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
list | array | 推送记录列表 |
list[].id | integer | 主键ID |
list[].created_at | string | 记录创建时间 |
list[].updated_at | string | 更新时间 |
list[].message_id | integer | 关联站内消息ID |
list[].template_id | integer | 来源模板ID,0表示无模板 |
list[].receiver_sn | string | 接收会员编号 |
list[].channel | integer | 推送渠道 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
list[].openid | string | 小程序openid快照,便于排查 |
list[].template_data | string | 推送模板数据快照JSON,变量替换后的值 |
list[].status | integer | 推送状态 1待发送 2成功 3失败 |
list[].fail_reason | string | 失败原因 |
list[].third_party_msg_id | string | 第三方平台返回的消息ID |
list[].sent_at | string | 发送时间 |
total | integer | 数据总数 |
订阅记录列表
接口地址
GET /admin/message/subscription/list接口说明
查询会员的小程序订阅授权记录:每条记录按「会员+渠道+模板」唯一,subscribe_count 为累计订阅次数,remain_count 为剩余可推送次数(推送成功后自动扣减),subscribed_at 为最近订阅时间。
接口参数说明
| Query 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
template_code | string | 否 | 按模板编码筛选 |
receiver_sn | string | 否 | 按会员编号筛选 |
channel | integer | 否 | 订阅渠道 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
page | integer | 否 | 页码,默认 1 |
page_size | integer | 否 | 每页数量,默认 20,最大 100 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"list": [
{
"id": 1,
"created_at": "2026-09-25T10:00:00+08:00",
"updated_at": "2026-09-25T10:00:00+08:00",
"member_sn": "M202609251754509918",
"member_nickname": "张三",
"member_avatar": "https://oss.example.com/uploads/2026/09/avatar.png",
"channel": 1,
"template_code": "order_pay_success",
"template_id": 1,
"platform_template_id": "xWX9z...",
"platform_subscribe_id": "",
"subscribe_count": 2,
"remain_count": 1,
"subscribed_at": "2026-09-25T10:00:00+08:00"
}
],
"total": 1
}
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
list | array | 订阅记录列表 |
list[].id | integer | 主键ID |
list[].member_sn | string | 会员编号 |
list[].member_nickname | string | 会员昵称 |
list[].member_avatar | string | 会员头像地址 |
list[].channel | integer | 订阅渠道 1微信小程序 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
list[].template_code | string | 模板编码 |
list[].template_id | integer | 来源模板ID |
list[].platform_template_id | string | 平台订阅消息模板ID快照 |
list[].platform_subscribe_id | string | 平台订阅ID快照,百度渠道发送时必传 |
list[].subscribe_count | integer | 累计订阅次数 |
list[].remain_count | integer | 剩余可推送次数 |
list[].subscribed_at | string | 最近订阅时间 |
total | integer | 数据总数 |