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 兼容字段;未传 urlmedia_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_replyartist_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_countsent_message_countreply_required_countread_message_count 和回复率统计;该消息仍会更新聊天最后消息并增加艺人端未读数。
  • 服务端发送融云超级群消息时统一传 expansion=trueextraContent;业务展示扩展不再写入消息体 content.extra
  • 粉丝主动发送普通消息时,服务端将当前完整画像写入融云 extraContent,同时把完全相同的数组保存到本地 extra_content_payload。字段包含 senderRolefanIdartistIdfanAvatarfanNicknamefanGendercompanionStartAtcompanionDaysfanSubStatusfanSubAutoRenewfanSubExpiresAtfanSubExpiresTextcandySpentlastArtistReplyAtlastArtistReplyTextreplyCount;所有值均为字符串。
  • 艺人定向消息的 extraContent 包含 senderRoleartistIdartistNicknameartistAvatarartistAvatar 固定读取独立维护的 tieup_artist.avatar,未配置时返回空字符串,不回退绑定账号的 tieup_user.avatar。艺人普通群发在相同字段上增加字符串 readCount="0" 和发送时目标人数快照 targetCount。融云 SDK 实时收到群发消息时从 expansionDic 读取这两个字段,业务发送接口则在 message.extra_content 返回相同快照。
  • 艺人引用回复粉丝时,当前回复继续使用真实消息类型,并在超级群发送请求顶层附加融云新版 quote;支持 text/image/voice/video。
  • quote 由服务端根据 message_uid 查询本地原消息后生成,包含被引用消息的 msgUIDobjectNamefromUserId;客户端传入的 objNamereferMsg 仅用于旧版本请求兼容,不参与发送载荷。
  • 被引用消息必须属于同一艺人和粉丝、发送成功、未撤回且具备融云消息 UID,否则返回业务错误。
  • 群发、定向和订阅业务消息均按支持离线推送处理,并始终向融云提交对应的 pushContent 和 JSON 字符串形式 pushExt。基础通知由消息业务生成:pushExt.title 使用发送者昵称,艺人消息优先使用艺名、粉丝消息使用粉丝昵称,空昵称统一回退 TieuppushExt.forceShowPushContent 固定为 1。文本通知正文使用消息内容,图片、语音、视频推送摘要分别为 [图片][语音][视频],不会在通知正文暴露媒体 URL。
  • 定向消息仅在接收用户所属启用渠道配置了合法厂商参数时附加 pushExt.pushConfigs;接收用户、渠道或厂商配置缺失,以及覆盖多渠道的群发消息,不发送空 pushConfigs。渠道配置中的 titletemplateIdforceShowPushContent 不参与发送,也不能覆盖业务基础字段。无渠道配置时融云参数示例为 pushContent="夫妇饭过"pushExt={"title":"张三","forceShowPushContent":1}Tieup:ReadAck 已读回执仍仅实时发送,不触发离线推送。iOS 最终是否显示通知正文仍受用户的系统通知预览设置影响。
  • 群发、定向和订阅业务消息同时提交独立的 pushData JSON 字符串,用于离线通知点击跳转。pushExt 只控制通知展示和厂商参数,前端不得从 pushExt.titlepushContent 推断业务页面。
  • iOS、Android 从厂商通知载荷的 appData 获取 pushData;Android 也可使用融云 PushNotificationMessage#getPushData()。历史通知没有 pushDataschemaVersion 不支持或 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.urlcontent.media_urlcontent.remote_urlcontent.file_url
  • 语音时长由服务端探测并四舍五入为整秒,允许范围为 1 到 60 秒:60.0060.49 秒按 duration=60 发送,60.50 秒起按 61 秒拒绝;客户端无需也不能通过传入 duration 绕过校验。
  • send_status=1 表示后端已发送到融云并写入 rong_message_uidsend_status=2 表示后端发送失败,失败响应会返回 failed_reason。失败后用户主动重新发送必须生成新的 client_message_id

离线通知 pushData 点击跳转协议

超级群业务消息的 pushData 在线路中是 JSON 字符串,以下示例均为客户端从 appData 取值后反序列化得到的对象。

字段说明:

字段 类型 说明
schemaVersion integer 跳转协议版本,当前固定为 1
notificationType string 跳转场景:im_artist_to_fanim_fan_to_artistim_artist_broadcastim_subscription_success
messageType string 消息内容类型:textimagevoicevideosubscription
conversationType integer 融云超级群会话类型,固定为 10
targetId string 融云超级群 ID
channelId string 融云超级群频道 ID,无独立频道时为空字符串
artistId integer 艺人业务 ID
fanId integer/null 单粉丝定向消息对应粉丝用户 ID;普通群发或历史多粉丝定向消息为 null
messageNo string 本地业务消息编号,用于定位和排障
objectName string 融云消息内容类型,如 RC:TxtMsgRC:ImgMsgRC:HQVCMsgRC:SightMsgTieup: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=1isCounted=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=subscriptionobjectName=Tieup:Subscribe 和上述正文、扩展;消息可正常已读、删除和撤回。
  • 艺人引用回复订阅消息时引用关系正常展示,但订阅消息不计入粉丝主动消息数、待回复数或回复率。