Table of Contents
15.4 统一发送融云消息【未授权拦截通过,待登录态联调】
POST /tieup/api/v1/im/messages/send
鉴权:需要 Authorization: Bearer <access_token>。
请求体:
{
"send_scene": "fan_to_artist",
"receiver_id": 20001,
"message_type": "text",
"content": {
"text": "你好"
},
"client_message_id": "cmid_ios_fan_20260702153045123_01JZ4V7W7Y8K9M2N3P4Q5R6S7T"
}
艺人回复粉丝示例:
{
"send_scene": "artist_reply",
"receiver_id": 10001,
"message_type": "text",
"content": {
"text": "回复内容"
},
"client_message_id": "cmid_ios_artist_20260702153100123_01JZ4V8M0Y8K9M2N3P4Q5R6S7V",
"message_uid": "BU2F-A9KJ-XXXX"
}
艺人引用回复粉丝图片示例:
{
"send_scene": "artist_reply",
"receiver_id": 10001,
"message_type": "image",
"content": {
"url": "https://cdn.example.com/im/reply.jpg"
},
"client_message_id": "cmid_ios_artist_20260702153110123_01JZ4V8M0Y8K9M2N3P4Q5R6S7X",
"message_uid": "BU2F-A9KJ-XXXX"
}
艺人发送 60 秒语音示例:
{
"send_scene": "artist_reply",
"receiver_id": 10001,
"message_type": "voice",
"content": {
"url": "https://cdn.example.com/im/voice-60.m4a"
},
"client_message_id": "cmid_ios_artist_20260716153045123_01JZ4V8M0Y8K9M2N3P4Q5R6S8A"
}
艺人普通群发示例:
{
"send_scene": "artist_broadcast",
"message_type": "text",
"content": {
"text": "今晚八点直播见"
},
"client_message_id": "cmid_ios_artist_20260702153200123_01JZ4V9K0Y8K9M2N3P4Q5R6S7W",
"target_filter": {
"subscription_status": 1
}
}
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
send_scene |
string | 是 | 发送场景:fan_to_artist=粉丝发送给艺人,artist_reply=艺人回复粉丝,artist_broadcast=艺人普通群发 |
receiver_id |
integer | 条件必填 | 接收人业务 ID。fan_to_artist 时为艺人 ID;artist_reply 时为粉丝用户 ID;artist_broadcast 不传 |
message_type |
string | 是 | fan_to_artist 只允许 text;artist_reply、artist_broadcast 支持 text=文本、image=图片、voice=语音、video=视频 |
content |
object | 是 | 按 message_type 传入对应消息体;文本消息固定为 {“text”:“你好”},媒体消息传平台上传 URL。语音无需传 duration,服务端读取真实时长 |
client_message_id |
string | 是 | 客户端生成,用于本地消息映射、重试幂等和排障 |
message_uid |
string/null | 否 | 仅 artist_reply 支持;值来自融云消息数据包的 messageUId,最大 128 字符;传入后当前 text/image/voice/video 消息会携带融云新版引用关系 |
objName |
string | 否 | 旧客户端兼容字段,服务端不再使用;新版由 message_uid 查询本地原消息类型 |
referMsg |
object/string | 否 | 旧客户端兼容字段,服务端不再使用;新版不接受客户端提供被引用消息快照 |
target_filter |
object | 否 | 仅 artist_broadcast 支持,群发目标筛选条件 |
content 对象字段:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
text |
string | text 必填 | 文本正文;粉丝文字按后台配置校验去除首尾空白后的 UTF-8 字符数 |
url |
string | image/voice/video 推荐必填 | 平台上传接口返回的媒体 URL,推荐客户端统一使用该字段 |
media_url |
string | 否 | 媒体 URL 兼容字段;未传 url 时使用 |
remote_url |
string | 否 | 媒体 URL 兼容字段;未传 url、media_url 时使用 |
file_url |
string | 否 | 媒体 URL 兼容字段;未传其他媒体 URL 字段时使用 |
媒体消息必须至少提供一个 URL 字段,且 URL 必须来自平台上传接口。语音消息不得依赖客户端传入时长,服务端使用 ffprobe 读取文件真实时长,并按标准四舍五入生成融云整数 duration。
响应字段:
| 字段 | 类型 | 说明 |
|---|---|---|
message_no |
string | 消息编号 |
task_no |
string/null | 群发任务编号,定向消息为空,普通群发时返回 |
rong_ultra_group_id |
string | 融云超级群 ID |
rong_channel_id |
string | 融云超级群频道 ID,默认频道为空 |
target_rong_user_ids |
array | 定向接收人融云用户 ID;普通群发为空 |
message_extra |
object | 本地排障用业务元数据;不再写入融云消息体 content.extra |
message |
object | 消息元数据 |
message.message_no |
string | 消息编号 |
message.rong_message_uid |
string/null | 融云消息 UID,发送成功后返回 |
message.object_name |
string | 当前回复主体的融云 ObjectName;引用图片仍为 RC:ImgMsg,不会改为 RC:ReferenceMsg |
message.message_type |
string | 消息类型:text/image/voice/video |
message.content |
object/null | 本地保存的消息正文;撤回后为 null |
message.reference |
object/null | 引用消息快照 |
message.extra_content |
object | 发送给融云的 extraContent 扩展快照 |
message.extra_content.fanAvatar |
string | 仅 fan_to_artist 返回;粉丝身份头像,读取 tieup_user.avatar |
message.extra_content.fanGender |
string | 仅 fan_to_artist 返回;发送粉丝的用户性别:"0"=未知、"1"=男、"2"=女 |
message.extra_content.companionStartAt |
string | 当前连续陪伴段开始时间;无有效订阅返回空字符串 |
message.extra_content.companionDays |
string | 当前连续陪伴完整天数;无有效订阅返回 "0" |
message.extra_content.fanSubStatus |
string | none=无有效订阅、active=非自动续费订阅、auto_renew_active=自动续费订阅 |
message.extra_content.fanSubAutoRenew |
string | "0"=无有效订阅、"1"=自动续费、"2"=非自动续费 |
message.extra_content.fanSubExpiresAt |
string | 当前连续有效订阅段最终到期时间;无有效订阅返回空字符串 |
message.extra_content.fanSubExpiresText |
string | 到期展示文案:今日、七天内显示相对天数,更远显示月日,跨年补充年份 |
message.extra_content.candySpent |
string | 对当前艺人的有效糖果消费,固定两位小数字符串 |
message.extra_content.lastArtistReplyAt |
string | 艺人最后一次定向消息时间;从未回复返回空字符串 |
message.extra_content.lastArtistReplyText |
string | 回复展示文案:今日、七天内显示相对天数,更早显示月日,跨年补充年份 |
message.extra_content.replyCount |
string | 新粉丝消息固定为 "0";历史查询按本地消息记录实时覆盖 |
message.extra_content.artistAvatar |
string | artist_reply、artist_broadcast 返回;艺人身份头像,读取 tieup_artist.avatar,未配置时返回空字符串且不回退用户头像 |
message.extra_content.readCount |
string | 仅 artist_broadcast 群发消息返回;发送成功时初始为字符串 "0" |
message.extra_content.targetCount |
string | 仅 artist_broadcast 群发消息返回;发送时有效订阅粉丝人数快照 |
message.target_count |
integer | 消息目标人数;群发消息为发送时有效订阅粉丝人数快照 |
message.read_count |
integer | 本地已读聚合人数;新群发消息初始为 0 |
message.reply_count |
integer | 被引用回复次数 |
message.recall_status |
integer | 撤回状态:0=正常,1=已撤回 |
message.send_status |
integer | 发送状态:0=创建,1=发送成功,2=发送失败,3=已撤回 |
message.failed_reason |
string/null | 发送失败原因 |
message.created_at |
string | 创建时间 |
响应示例:
{
"code": 200,
"message": "成功",
"data": {
"message_no": "MSG202607030001",
"task_no": null,
"rong_ultra_group_id": "tieup_artist_20001",
"rong_channel_id": "",
"target_rong_user_ids": [
"tieup_artist_20001"
],
"message_extra": {
"message_no": "MSG202607030001",
"client_message_id": "cmid_ios_fan_20260703153045123_01JZ4V7W7Y8K9M2N3P4Q5R6S7T",
"direction": 1,
"direction_name": "fan_to_artist_direct",
"artist_id": 20001,
"fan_user_id": 10001,
"sender_user_id": 10001,
"receiver_user_id": 20002,
"content_digest": "sha256_digest",
"target_rong_user_ids": [
"tieup_artist_20001"
]
},
"message": {
"message_no": "MSG202607030001",
"client_message_id": "cmid_ios_fan_20260703153045123_01JZ4V7W7Y8K9M2N3P4Q5R6S7T",
"rong_message_uid": "XXXX-JJJJ-KKK-LLLL",
"rong_ultra_group_id": "tieup_artist_20001",
"rong_channel_id": "",
"object_name": "RC:TxtMsg",
"artist_id": 20001,
"artist_user_id": 20002,
"fan_user_id": 10001,
"sender_user_id": 10001,
"receiver_user_id": 20002,
"direction": 1,
"direction_name": "fan_to_artist_direct",
"message_type": "text",
"broadcast_task_no": null,
"reply_to_message_no": null,
"target_count": 1,
"read_count": 0,
"reply_count": 0,
"content": {
"text": "你好"
},
"reference": null,
"extra_content": {
"senderRole": "fan",
"fanId": "10001",
"artistId": "20001",
"fanAvatar": "https://cdn.example.com/avatar.png",
"fanNickname": "Tieup用户",
"fanGender": "2",
"companionStartAt": "2026-07-03 10:00:00",
"companionDays": "26",
"fanSubStatus": "auto_renew_active",
"fanSubAutoRenew": "1",
"fanSubExpiresAt": "2026-08-03 10:00:00",
"fanSubExpiresText": "8月3日到期",
"candySpent": "128.00",
"lastArtistReplyAt": "2026-07-29 09:30:00",
"lastArtistReplyText": "今日回复",
"replyCount": "0"
},
"content_digest": "sha256_digest",
"send_status": 1,
"read_status": 1,
"recall_status": 0,
"sent_at": "2026-07-03 15:30:45",
"read_at": null,
"recalled_at": null,
"failed_reason": null,
"created_at": "2026-07-03 15:30:45"
}
}
}
艺人普通群发成功完整响应示例:
{
"code": 200,
"message": "成功",
"data": {
"message_no": "MSG202607030003",
"task_no": "BCT202607030001",
"rong_ultra_group_id": "tieup_artist_group_20001",
"rong_channel_id": "",
"target_rong_user_ids": [],
"message_extra": {
"message_no": "MSG202607030003",
"client_message_id": "cmid_ios_artist_20260702153200123_01JZ4V9K0Y8K9M2N3P4Q5R6S7W",
"direction": 3,
"direction_name": "artist_broadcast",
"artist_id": 20001,
"fan_user_id": null,
"sender_user_id": 20002,
"receiver_user_id": null,
"content_digest": "sha256_digest",
"target_rong_user_ids": []
},
"message": {
"message_no": "MSG202607030003",
"client_message_id": "cmid_ios_artist_20260702153200123_01JZ4V9K0Y8K9M2N3P4Q5R6S7W",
"rong_message_uid": "BCST-A9KJ-XXXX",
"rong_ultra_group_id": "tieup_artist_group_20001",
"rong_channel_id": "",
"object_name": "RC:TxtMsg",
"artist_id": 20001,
"artist_user_id": 20002,
"fan_user_id": null,
"sender_user_id": 20002,
"receiver_user_id": null,
"direction": 3,
"direction_name": "artist_broadcast",
"message_type": "text",
"broadcast_task_no": "BCT202607030001",
"reply_to_message_no": null,
"target_count": 1200,
"read_count": 0,
"reply_count": 0,
"content": {
"text": "今晚八点直播见"
},
"reference": null,
"extra_content": {
"senderRole": "artist",
"artistId": "20001",
"artistNickname": "示例艺人",
"artistAvatar": "https://cdn.example.com/artist.png",
"readCount": "0",
"targetCount": "1200"
},
"content_digest": "sha256_digest",
"send_status": 1,
"read_status": 0,
"recall_status": 0,
"sent_at": "2026-07-03 15:32:00",
"read_at": null,
"recalled_at": null,
"failed_reason": null,
"created_at": "2026-07-03 15:32:00"
}
}
}
融云发送失败响应示例:
{
"code": 422,
"message": "融云消息发送失败,请使用新的 client_message_id 重试:融云API请求失败:融云API错误 [1002]: 参数错误",
"data": {
"message_no": "MSG202607030001",
"client_message_id": "cmid_ios_fan_20260703153045123_01JZ4V7W7Y8K9M2N3P4Q5R6S7T",
"task_no": null,
"rong_message_uid": null,
"rong_ultra_group_id": "tieup_artist_group_20001",
"rong_channel_id": "",
"send_status": 2,
"failed_reason": "融云API请求失败:融云API错误 [1002]: 参数错误",
"sent_at": null,
"created_at": "2026-07-03 15:30:45"
}
}
粉丝发送非文字消息响应示例:
{
"code": 422,
"message": "粉丝只能向艺人发送文字消息",
"data": []
}
粉丝文字超过后台配置字符数响应示例:
{
"code": 422,
"message": "粉丝单条消息不能超过 30 个字符",
"data": []
}
粉丝超过当天发送条数响应示例:
{
"code": 422,
"message": "每天最多向同一艺人发送 3 条消息,请明天再试",
"data": []
}
说明:
- 本接口只有在服务端调用融云超级群发送接口成功、且融云返回
messageUIDs[].messageUID后才返回code=200。 - 融云发送失败时,服务端会先把本地消息标记为
send_status=2并记录failed_reason,然后返回code=422;客户端不得把该响应当作发送成功。 -
content继续使用对象结构,文本消息也必须放在content.text,方便 text/image/voice/video 保持统一协议并支持后续扩展。 -
fan_to_artist只允许发送文字消息;单条文字最大字符数读取后台基础配置fan_to_artist_text_max_chars,默认30,按去除首尾空白后的 UTF-8 文本计算。 - 同一粉丝每天向同一艺人的发送条数读取后台基础配置
fan_to_artist_daily_limit,默认3;按北京时间自然日统计,不同粉丝或不同艺人分别计数。 - 粉丝每日条数包含发送中、发送成功和成功后撤回的消息;内容审核拒绝或融云明确发送失败的消息不占额度。并发发送会按粉丝与艺人维度串行登记,不能通过并发请求突破上限。
- 服务端自动生成的
message_type=subscription订阅成功消息不占粉丝每日发送额度,也不进入fan_message_count、sent_message_count、reply_required_count、read_message_count和回复率统计;该消息仍会更新聊天最后消息并增加艺人端未读数。 - 服务端发送融云超级群消息时统一传
expansion=true和extraContent;业务展示扩展不再写入消息体content.extra。 - 粉丝主动发送普通消息时,服务端将当前完整画像写入融云
extraContent,同时把完全相同的数组保存到本地extra_content_payload。字段包含senderRole、fanId、artistId、fanAvatar、fanNickname、fanGender、companionStartAt、companionDays、fanSubStatus、fanSubAutoRenew、fanSubExpiresAt、fanSubExpiresText、candySpent、lastArtistReplyAt、lastArtistReplyText、replyCount;所有值均为字符串。 - 艺人定向消息的
extraContent包含senderRole、artistId、artistNickname、artistAvatar;artistAvatar固定读取独立维护的tieup_artist.avatar,未配置时返回空字符串,不回退绑定账号的tieup_user.avatar。艺人普通群发在相同字段上增加字符串readCount="0"和发送时目标人数快照targetCount。融云 SDK 实时收到群发消息时从expansionDic读取这两个字段,业务发送接口则在message.extra_content返回相同快照。 - 艺人引用回复粉丝时,当前回复继续使用真实消息类型,并在超级群发送请求顶层附加融云新版
quote;支持 text/image/voice/video。 -
quote由服务端根据message_uid查询本地原消息后生成,包含被引用消息的msgUID、objectName、fromUserId;客户端传入的objName、referMsg仅用于旧版本请求兼容,不参与发送载荷。 - 被引用消息必须属于同一艺人和粉丝、发送成功、未撤回且具备融云消息 UID,否则返回业务错误。
- 群发、定向和订阅业务消息均按支持离线推送处理,并始终向融云提交对应的
pushContent和 JSON 字符串形式pushExt。基础通知由消息业务生成:pushExt.title使用发送者昵称,艺人消息优先使用艺名、粉丝消息使用粉丝昵称,空昵称统一回退Tieup;pushExt.forceShowPushContent固定为1。文本通知正文使用消息内容,图片、语音、视频推送摘要分别为[图片]、[语音]、[视频],不会在通知正文暴露媒体 URL。 - 定向消息仅在接收用户所属启用渠道配置了合法厂商参数时附加
pushExt.pushConfigs;接收用户、渠道或厂商配置缺失,以及覆盖多渠道的群发消息,不发送空pushConfigs。渠道配置中的title、templateId、forceShowPushContent不参与发送,也不能覆盖业务基础字段。无渠道配置时融云参数示例为pushContent="夫妇饭过"、pushExt={"title":"张三","forceShowPushContent":1};Tieup:ReadAck已读回执仍仅实时发送,不触发离线推送。iOS 最终是否显示通知正文仍受用户的系统通知预览设置影响。 - 群发、定向和订阅业务消息同时提交独立的
pushDataJSON 字符串,用于离线通知点击跳转。pushExt只控制通知展示和厂商参数,前端不得从pushExt.title或pushContent推断业务页面。 - iOS、Android 从厂商通知载荷的
appData获取pushData;Android 也可使用融云PushNotificationMessage#getPushData()。历史通知没有pushData、schemaVersion不支持或 JSON 解析失败时,客户端回退消息首页或系统消息列表,不得根据标题猜测跳转。 - Android IMKit 5.38.0+ 需开启
enableReference(true)和enableQuoteV2(true)才能展示新版引用卡片;低版本按当前真实消息类型展示,但不展示引用关系。 -
client_message_id推荐客户端使用 ULID 或 UUID v7 生成,格式建议:cmid_{platform}_{identity}_{yyyyMMddHHmmssSSS}_{ulid},示例:cmid_ios_fan_20260702153045123_01JZ4V7W7Y8K9M2N3P4Q5R6S7T。 - 同一条本地消息断网、超时或失败重试时必须复用同一个
client_message_id;用户修改内容后重新发送必须生成新的client_message_id。 -
client_message_id长度不超过 128,只允许字母、数字、下划线和中横线。 -
fan_to_artist仅有效订阅粉丝可发送;服务端先确保艺人融云超级群存在,并将粉丝加入超级群。 -
artist_reply要求当前账号已开通偶像端,目标粉丝必须是当前偶像有效订阅粉丝;message_uid可选,不传时表示艺人主动定向发送。 -
message_uid指向的消息必须是同一粉丝发给当前艺人、发送成功且未撤回的消息;引用回复只有首次从非成功状态进入send_status=1时,才会在同一数据库事务内把被引用消息的reply_count原子加一;相同client_message_id重试或并发成功回调不会重复计数。 - 被引用消息的
reply_count是回复状态权威值。聊天列表最后消息、历史消息和按 UID 查询接口都会强制覆盖expansionDic.replyCount。 - 消息发送成功后,头像、昵称、性别、订阅、陪伴天数、糖果消费和回复状态变化均不调用融云已有消息扩展更新接口,也不投递 Redis 队列或登记新扩展待办。服务端在本地消息读取时按当前页粉丝批量计算最新画像,只覆盖本次响应,不写回消息快照。
-
replyCount表示历史引用回复次数;艺人撤回已发送的回复后不递减。客户端不得仅根据“艺人回复消息到达”自行推算状态。 - iOS、Android 不得依赖融云超级群消息扩展变更回调刷新粉丝画像。聊天列表、历史消息和按 UID 查询返回的本地
expansionDic是当前权威值,客户端按messageUId合并或替换本地缓存。 -
reply_to_message_no已从请求协议中禁用,继续传入会返回参数校验错误;该字段仅作为服务端内部关联键和既有响应字段保留。 -
artist_broadcast要求当前账号已开通偶像端,是偶像对整个超级群发送普通消息,不按粉丝逐条展开。 - 同一
sender_user_id + client_message_id幂等,重复请求命中已成功消息时返回已有成功消息;命中失败或未成功消息时返回code=422,不会自动重发。 - 服务端完成内容审核后直接调用融云超级群定向消息发送;客户端不再调用融云 SDK 发送聊天正文。
- 图片、语音、视频消息的 URL 必须来自平台上传接口,字段可使用
content.url、content.media_url、content.remote_url或content.file_url。 - 语音时长由服务端探测并四舍五入为整秒,允许范围为 1 到 60 秒:
60.00到60.49秒按duration=60发送,60.50秒起按 61 秒拒绝;客户端无需也不能通过传入duration绕过校验。 -
send_status=1表示后端已发送到融云并写入rong_message_uid;send_status=2表示后端发送失败,失败响应会返回failed_reason。失败后用户主动重新发送必须生成新的client_message_id。
离线通知 pushData 点击跳转协议
超级群业务消息的 pushData 在线路中是 JSON 字符串,以下示例均为客户端从 appData 取值后反序列化得到的对象。
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
schemaVersion |
integer | 跳转协议版本,当前固定为 1 |
notificationType |
string | 跳转场景:im_artist_to_fan、im_fan_to_artist、im_artist_broadcast、im_subscription_success |
messageType |
string | 消息内容类型:text、image、voice、video、subscription |
conversationType |
integer | 融云超级群会话类型,固定为 10 |
targetId |
string | 融云超级群 ID |
channelId |
string | 融云超级群频道 ID,无独立频道时为空字符串 |
artistId |
integer | 艺人业务 ID |
fanId |
integer/null | 单粉丝定向消息对应粉丝用户 ID;普通群发或历史多粉丝定向消息为 null |
messageNo |
string | 本地业务消息编号,用于定位和排障 |
objectName |
string | 融云消息内容类型,如 RC:TxtMsg、RC:ImgMsg、RC:HQVCMsg、RC:SightMsg、Tieup:Subscribe;只控制消息解析,不直接决定页面跳转 |
艺人定向发送图片,粉丝端打开对应艺人群聊:
{
"schemaVersion": 1,
"notificationType": "im_artist_to_fan",
"messageType": "image",
"conversationType": 10,
"targetId": "tieup_artist_group_20001",
"channelId": "",
"artistId": 20001,
"fanId": 10001,
"messageNo": "MSG202607210001",
"objectName": "RC:ImgMsg"
}
粉丝定向发送文本,艺人端打开对应粉丝会话:
{
"schemaVersion": 1,
"notificationType": "im_fan_to_artist",
"messageType": "text",
"conversationType": 10,
"targetId": "tieup_artist_group_20001",
"channelId": "",
"artistId": 20001,
"fanId": 10001,
"messageNo": "MSG202607210002",
"objectName": "RC:TxtMsg"
}
艺人普通群发视频,粉丝端打开对应艺人群聊:
{
"schemaVersion": 1,
"notificationType": "im_artist_broadcast",
"messageType": "video",
"conversationType": 10,
"targetId": "tieup_artist_group_20001",
"channelId": "",
"artistId": 20001,
"fanId": null,
"messageNo": "MSG202607210003",
"objectName": "RC:SightMsg"
}
艺人定向发送语音,粉丝端打开对应艺人群聊:
{
"schemaVersion": 1,
"notificationType": "im_artist_to_fan",
"messageType": "voice",
"conversationType": 10,
"targetId": "tieup_artist_group_20001",
"channelId": "",
"artistId": 20001,
"fanId": 10001,
"messageNo": "MSG202607210004",
"objectName": "RC:HQVCMsg"
}
订阅成功业务消息,艺人端打开对应订阅粉丝会话:
{
"schemaVersion": 1,
"notificationType": "im_subscription_success",
"messageType": "subscription",
"conversationType": 10,
"targetId": "tieup_artist_group_20001",
"channelId": "",
"artistId": 20001,
"fanId": 10001,
"messageNo": "MSG202607210005",
"objectName": "Tieup:Subscribe"
}
订阅成功自定义消息协议
每生成一条新的订阅记录,服务端以粉丝融云身份向对应艺人发送一条超级群定向消息。客户端必须注册自定义消息类型 Tieup:Subscribe,不能按 RC:TxtMsg 解析。消息设置 isPersisted=1、isCounted=1,会进入聊天历史并产生艺人侧未读。
完整融云发送载荷示例:
{
"fromUserId": "tieup_fan_10001",
"toGroupIds": ["tieup_artist_group_20001"],
"toUserIds": ["tieup_artist_20001"],
"objectName": "Tieup:Subscribe",
"content": "{\"content\":\"订阅会员\"}",
"pushContent": "订阅会员",
"pushExt": "{\"title\":\"粉丝昵称\",\"forceShowPushContent\":1}",
"pushData": "{\"schemaVersion\":1,\"notificationType\":\"im_subscription_success\",\"messageType\":\"subscription\",\"conversationType\":10,\"targetId\":\"tieup_artist_group_20001\",\"channelId\":\"\",\"artistId\":20001,\"fanId\":10001,\"messageNo\":\"MSG202607210005\",\"objectName\":\"Tieup:Subscribe\"}",
"isPersisted": 1,
"isCounted": 1,
"expansion": true,
"extraContent": "{\"senderRole\":\"fan\",\"businessType\":\"subscription_success\",\"fanId\":\"10001\",\"fanNickname\":\"粉丝昵称\",\"artistId\":\"20001\",\"artistNickname\":\"艺人昵称\",\"subscriptionCode\":\"SUB202607200001\"}"
}
content 反序列化结果:
{
"content": "订阅会员"
}
extraContent 反序列化结果:
{
"senderRole": "fan",
"businessType": "subscription_success",
"fanId": "10001",
"fanNickname": "粉丝昵称",
"artistId": "20001",
"artistNickname": "艺人昵称",
"subscriptionCode": "SUB202607200001"
}
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
objectName |
string | 固定为 Tieup:Subscribe |
content |
string | JSON 字符串,反序列化后包含固定文本 content=订阅会员 |
pushContent |
string | 固定为 订阅会员 |
isPersisted |
integer | 固定为 1,进入融云消息历史 |
isCounted |
integer | 固定为 1,产生艺人侧会话未读 |
expansion |
boolean | 固定为 true,启用消息扩展 |
extraContent |
string | JSON 字符串,反序列化后得到订阅业务字段 |
extraContent.senderRole |
string | 固定为 fan |
extraContent.businessType |
string | 固定为 subscription_success |
extraContent.fanId |
string | 粉丝 APP 用户 ID |
extraContent.fanNickname |
string | 粉丝昵称,来自 tieup_user.nickname |
extraContent.artistId |
string | 艺人档案 ID |
extraContent.artistNickname |
string | 优先使用艺人名称,空时回退艺人用户昵称 |
extraContent.subscriptionCode |
string | 本次唯一订阅记录号 subscription_no,客户端可用于幂等展示 |
业务规则:
- 首次订阅、连续续费、手动续费和 Apple 自动续订每生成一条新订阅记录都发送一次。
- 服务端使用
biz:subscription:{subscription_no}作为本地client_message_id,重复支付回调和补偿不会为同一订阅创建第二条业务消息。 - 融云发送失败不会回滚已生效订阅;异步队列最多重试,最终由每分钟
im-subscription-message定时补偿继续处理。 - 历史消息接口返回
message_type=subscription、objectName=Tieup:Subscribe和上述正文、扩展;消息可正常已读、删除和撤回。 - 艺人引用回复订阅消息时引用关系正常展示,但订阅消息不计入粉丝主动消息数、待回复数或回复率。