站内消息
登录会员的站内消息列表、未读统计、详情查看、已读标记与删除清空。消息数据范围固定为当前登录会员,删除与清空均为软删除,管理端仍可追溯。
小程序订阅消息完整流程(全流程可配置,无需改代码):
- 管理端「消息中心-消息模板」配置各小程序渠道的订阅消息模板ID(
miniapp_*JSON 的template_id)与启用渠道; - 用户端业务/插件通过通用函数
useSubscribeMessage发起订阅(内部自动调用「获取可订阅模板」接口并调起平台订阅授权),见下方用户端接入; - 用户同意后客户端自动调用「上报订阅结果」接口落库,按「会员+渠道+模板」累加剩余可推送次数(一次性订阅:同意一次可下发一条);
- 管理端发送消息时按模板启用的渠道执行推送:推送前先查订阅记录预检,未订阅或次数用尽直接记录失败原因、不再请求平台;推送成功后剩余次数扣减一。
订阅发起不绑定任何页面:订单、支付、活动等业务代码和插件在关键操作前调用通用函数即可,模板增减完全由管理端配置驱动。
获取可订阅模板
接口地址
GET /api/auth/message/subscribe_templates接口说明
返回当前小程序平台可订阅的消息模板ID列表:仅包含启用、当前平台渠道已启用且完成 template_id 配置的模板;平台由 X-Platform-Source 请求头解析,非小程序来源返回业务错误。客户端拿到 template_id 后调用平台订阅授权接口(一次最多 3 条),用户同意后管理端即可向该用户推送对应模板消息。
接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Query 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
template_codes | string | 否 | 模板编码列表,英文逗号分隔,如 order_pay_success,refund_notice;不传返回当前平台全部 |
响应示例
{
"code": 0,
"msg": "success",
"data": [
{
"template_code": "order_pay_success",
"name": "订单支付成功通知",
"template_id": "xWX9z..."
}
]
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
data[].template_code | string | 模板编码 |
data[].name | string | 模板名称 |
data[].template_id | string | 当前平台的订阅消息模板ID,用于发起订阅授权 |
上报订阅结果
接口地址
POST /api/auth/message/subscribe接口说明
用户在小程序订阅授权弹窗中同意后,客户端将接受的模板编码上报落库。服务端按「会员+渠道+模板」唯一记录,每上报一次剩余可推送次数加一;管理端推送成功后扣减一次。无效、未启用或未配置当前平台渠道的模板编码会被跳过,不影响其余模板。subscribe_ids 与 template_codes 按下标对应,仅百度渠道需要(百度要求发送时携带订阅授权时的平台订阅ID)。
接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
template_codes | array<string> | 是 | 订阅成功的模板编码列表,最多 20 个 |
subscribe_ids | array<string> | 否 | 平台订阅ID列表,与模板编码按下标对应,百度渠道必传 |
响应示例
{
"code": 0,
"msg": "success",
"data": [
{
"template_code": "order_pay_success",
"remain_count": 1
}
]
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
data[].template_code | string | 已记录的模板编码 |
data[].remain_count | integer | 该会员该模板当前剩余可推送次数 |
消息列表
接口地址
GET /api/auth/message/list接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Query 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
msg_type | string | 否 | 消息类型 system 系统通知 / order 订单通知 / marketing 营销消息 / interactive 互动消息 / service 客服消息,不传查询全部 |
page | integer | 否 | 页码,默认 1 |
page_size | integer | 否 | 每页数量,默认 20,最大 100 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"list": [
{
"id": 100,
"msg_type": "order",
"title": "您的订单 ORD202610010001 支付成功",
"content": "订单金额:¥99.00",
"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",
"created_at": "2026-09-25T10:00:00+08:00"
}
],
"total": 1
}
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
list | array | 消息列表,按发送时间倒序 |
list[].id | integer | 消息ID |
list[].msg_type | string | 消息类型 system / order / marketing / interactive / service |
list[].title | string | 消息标题 |
list[].content | 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 | 关联业务类型,如 order |
list[].biz_id | string | 关联业务ID,客户端据此跳转对应业务详情 |
list[].created_at | string | 发送时间 |
total | integer | 数据总数 |
未读消息统计
接口地址
GET /api/auth/message/unread_count接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"total": 3,
"items": [
{
"msg_type": "system",
"count": 1
},
{
"msg_type": "order",
"count": 2
}
]
}
}响应参数说明
| 响应字段 | 类型 | 说明 |
|---|---|---|
total | integer | 未读消息总数 |
items[] | array | 按消息类型的未读数量,仅包含存在未读的类型 |
items[].msg_type | string | 消息类型 system / order / marketing / interactive / service |
items[].count | integer | 该类型未读数量 |
消息详情
接口地址
GET /api/auth/message/detail接口说明
查看未读消息时自动标记为已读并返回已读时间;只能查看当前登录会员自己的消息。
接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Query 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 是 | 消息ID |
响应示例
{
"code": 0,
"msg": "success",
"data": {
"id": 100,
"msg_type": "order",
"title": "您的订单 ORD202610010001 支付成功",
"content": "订单金额:¥99.00",
"cover_url": "https://oss.example.com/uploads/2026/09/cover.png",
"jump_type": 3,
"jump_url": "/pages/order/detail?id=123456",
"is_read": 1,
"read_at": "2026-09-25T10:05:00+08:00",
"biz_type": "order",
"biz_id": "123456",
"created_at": "2026-09-25T10:00:00+08:00"
}
}响应参数说明
响应字段与「消息列表」中的单个消息结构一致。
标记消息已读
接口地址
POST /api/auth/message/read接口说明
只能标记当前登录会员自己的消息;重复调用幂等。
接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 是 | 消息ID |
响应示例
{
"code": 0,
"msg": "success",
"data": null
}响应参数说明
成功时 data 为 null。
全部已读
接口地址
POST /api/auth/message/read_all接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
msg_type | string | 否 | 消息类型 system / order / marketing / interactive / service,不传标记全部 |
响应示例
{
"code": 0,
"msg": "success",
"data": null
}响应参数说明
成功时 data 为 null。
删除消息
接口地址
POST /api/auth/message/delete接口说明
软删除单条消息,只能删除当前登录会员自己的消息。
接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 是 | 消息ID |
响应示例
{
"code": 0,
"msg": "success",
"data": null
}响应参数说明
成功时 data 为 null。
清空消息
接口地址
POST /api/auth/message/clear接口说明
软删除当前登录会员的全部消息,可按消息类型限定。
接口参数说明
| Header 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-Platform-Source | integer | 是 | 平台来源 1微信小程序 2微信公众号 3iOS 4Android 5H5 6支付宝小程序 7百度小程序 8抖音小程序 9QQ小程序 10快手小程序 |
X-App-Version | string | 否 | 客户端版本号,服务端仅透传记录 |
| Body 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
msg_type | string | 否 | 消息类型 system / order / marketing / interactive / service,不传清空全部 |
响应示例
{
"code": 0,
"msg": "success",
"data": null
}响应参数说明
成功时 data 为 null。
用户端接入指南
本节面向后续业务模块与插件开发:发起订阅、读写站内消息时,直接复用用户端已封装的 API 与通用函数,禁止绕过封装直接调用 uni.request。
接口封装
消息相关接口统一封装在 user_client/src/api/message.ts,均已携带登录态与平台请求头:
| 函数 | 对应接口 | 说明 |
|---|---|---|
getMessageList(params?) | GET /api/auth/message/list | 消息列表,支持 msg_type 筛选与分页 |
getUnreadCount() | GET /api/auth/message/unread_count | 未读总数与按类型统计 |
getMessageDetail(id) | GET /api/auth/message/detail | 消息详情,未读自动标记已读 |
markMessageRead(id) | POST /api/auth/message/read | 标记单条已读,幂等 |
markAllMessagesRead(msgType?) | POST /api/auth/message/read_all | 全部已读,可按类型 |
deleteMessage(id) | POST /api/auth/message/delete | 删除单条(软删除) |
clearMessages(msgType?) | POST /api/auth/message/clear | 清空消息,可按类型 |
getMessageSubscribeTemplates(templateCodes?) | GET /api/auth/message/subscribe_templates | 当前平台可订阅模板ID,一般不直接调用 |
reportMessageSubscriptions(templateCodes, subscribeIds?) | POST /api/auth/message/subscribe | 上报订阅授权结果,useSubscribeMessage 内部已自动调用 |
发起订阅:useSubscribeMessage
订阅消息的通用调用函数位于 user_client/src/composables/useSubscribeMessage.ts,业务与插件在关键操作(下单、支付、提醒设置等)前调用即可:
import { useSubscribeMessage } from '@/composables/useSubscribeMessage'
const { requestMessageSubscribe } = useSubscribeMessage()
// 订阅当前平台全部已配置模板
const subscribed = await requestMessageSubscribe()
// 只订阅指定模板(传管理端配置的模板编码)
const ok = await requestMessageSubscribe(['order_pay_success', 'refund_notice'])行为说明:
- 内部流程:
getMessageSubscribeTemplates拉取当前平台模板ID →uni.requestSubscribeMessage调起授权(单次最多 3 条,超出自动截断)→ 把用户同意的模板自动调用reportMessageSubscriptions上报服务端累加可推送次数 → 按结果给出统一反馈,返回是否至少完成一个模板的订阅上报; - 平台支持:微信、QQ、百度、抖音、快手小程序;H5、App 与支付宝小程序(订阅接口参数形态不同)暂不支持,调用时直接提示并返回
false,不会抛错; - 可用
supportsSubscribeMessage()判断当前环境是否支持,用于控制订阅入口的显隐; - 模板增减、启用停用完全由管理端「消息中心-消息模板」配置驱动,业务代码无需感知具体模板ID。