红包场景实践
场景说明
用户在单聊/群聊会话中向指定好友发送红包(实际货币、虚拟货币、积分等),发送人和接收人可以明确感知红包是否被领取的状态(未领取、已领取)。
效果示例
无 UI 集成,您可根据业务侧逻辑调整相关 UI。

红包消息流程
1. 准备工作
在开始之前,请确保已创建应用并完成客户端 SDK 集成。
2. 定义红包消息
2.1 定义红包消息类型
您可通过 IMLib SDK 的自定义消息,创建红包类消息类型(如 RedPacketMessage
),消息内容结构需根据业务需求自行定义,确保多端(Android / iOS / Web)一致。
Android / iOS 端自定义消息类参考:
- Android 端 CustomRedPacketMessage.java
- iOS 端 CustomRedPacketMessage.h
- iOS 端 CustomRedPacketMessage.m
- Server SDK RedPacketMessage.java
Web 端示例代码:
javascript
// 1. RongIMLib.registerMessageType 必须在 connect 之前调用,否则可能造成收取消息的行为异常。
// 2. 请尽量把应用中所有涉及到的自定义消息统一一次注册,且同类型消息仅调用一次注册,便于管理。
const messageType = 'app:red_packet' // 消息类型
const isPersited = true // 是否存储
const isCounted = true // 是否计数
const searchProps = [] // 搜索字段,Web 端无需设置,搜索字段值设置为数字时取值范围为 (-Math.pow(2, 64), Math.pow(2, 64)) 且为整数
const isStatusMessage = false // 是否是状态消息。状态消息不存储、不计数,接收方在线时才能收到。
const PersonMessage = RongIMLib.registerMessageType(messageType, isPersited, isCounted, searchProps, isStatusMessage)
3. 注册并接收红包消息
- Android
- iOS
- Web
Java
// 注册自定义消息类型,初始化 SDK 后注册
ArrayList<Class<? extends MessageContent>> myMessages = new ArrayList<>();
myMessages.add(CustomRedPacketMessage.class);
RongCoreClient.registerMessageType(myMessages);
// 接收消息示例:设置接收消息监听器,接收消息时会自动回调
RongCoreClient.addOnReceiveMessageListener(new OnReceiveMessageWrapperListener() {
@Override
public void onReceivedMessage(Message message, ReceivedProfile profile) {
int left = profile.getLeft();
boolean isOffline = profile.isOffline();
boolean hasPackage = profile.hasPackage();
}
});
// 返回的 `Message` 实体参考下面信息,可以使用 `objectName` 或者 `content` 来区分消息类型:
{
"conversationType": "PRIVATE",
"targetId": "userid3453",
"messageId": 70,
"channelId": "",
"messageDirection": "RECEIVE",
"senderUserId": "userid3453",
"receivedStatus": "io.rong.imlib.model.Message$ReceivedStatus @560f848",
"sentStatus": "SENT",
"receivedTime": 1739428279001,
"sentTime": 1739428279158,
"objectName": "app:red_packet",
"content": {
"content": "红包消息"
},
"extra": "",
"readReceiptInfo": "io.rong.imlib.model.ReadReceiptInfo @b8d3c06",
"messageConfig": {
"disablePushTitle": false,
"pushTitle": "",
"pushContent": "",
"pushData": "null",
"templateId": "",
"forceShowDetailContent": false,
"iOSConfig": null,
"androidConfig": null,
"harmonyConfig": null
},
"canIncludeExpansion": false,
"expansionDic": null,
"expansionDicEx": null,
"mayHasMoreMessagesBefore": false,
"UId": "CKVO-0J6T-GM26-D3E6",
"disableUpdateLastMessage": "false",
"directedUsers": "0"
}
Objective C
// 在初始化 SDK 后,连接 IM 之前注册自定义消息
[[RCCoreClient sharedCoreClient] registerMessageType:[CustomRedPacketMessage class]];
//注册接收消息监听
[[RCCoreClient sharedCoreClient] addReceiveMessageDelegate: self];
//IMLib 的代理回调
- (void)onReceived:(RCMessage *)message left:(int)nLeft object:(nullable id)object;
//消息的内容
// 获取到的自定义消息的相关内容
_isOffline = false
_canIncludeExpansion = false
_hasChanged = false
_disableUpdateLastMessage = false
_conversationType = 1
_targetId = @"123"
_channelId = @""
_messageId = 17
_messageDirection = 2
_senderUserId = @"123"
_receivedStatusInfo RCReceivedStatusInfo * 0x3025eb5c0
_sentStatus = 30
_receivedTime = 1740566955000
_sentTime = 1740566955056
_objectName = @"app:red_packet"
_content CustomRedPacketMessage * 0x300691b80
_RCMessageContent RCMessageContent
_senderUserInfo
_mentionedInfo
_auditInfo
_destructDuration = 0
_extra
_rawJSONData
_contentBaseKeys
_content = @"红包"
_extra = @""
_messageUId = @"CL87-G08C-6L85-E222"
_readReceiptInfo
_groupReadReceiptInfoV2
_messageConfig RCMessageConfig * 0x30279cee0
_messagePushConfig RCMessagePushConfig * 0x300693110
_directedUserIds
_destructTime = 0
_expansionDicEx
typescript
// 设置消息监听
const Events = RongIMLib.Events
RongIMLib.addEventListener(Events.MESSAGES, (evt) => {
console.log(evt.messages)
})
// 注册自定义消息
const PersonMessage = RongIMLib.registerMessageType('app:red_packet', true, true, [], false)
// 发送自定义消息
// 构建要发送的自定义消息
const message = new PersonMessage({ name: 'someone', age: 18 })
// 接收该自定义消息示例
// 调用 addEventListener 设置消息接收监听器。所有接收到的消息都会在此接口方法中回调。
// 返回 IAReceivedMessage 类型的消息数组,类型请参考:https://doc.rongcloud.cn/apidoc/im-web/latest/zh_CN/interfaces/IMessagesEvent.html
const Events = RongIMLib.Events
const listener = (evt) => {
console.log(evt.messages)
};
RongIMLib.addEventListener(Events.MESSAGES, listener)
// 返回的 `Message` 实体参考下面信息,可以使用 `messageType` 来区分消息类型:
{
// 可根据 messageType 筛选业务层要处理的礼物消息
"messageType": "app:red_packet",
"channelId": "",
"content": {
"content": "红包消息"
},
"senderUserId": "user01",
"targetId": "chart01",
"conversationType": 4,
"sentTime": 1743414376795,
"receivedTime": 0,
"messageUId": "消息唯一值",
"messageDirection": 1,
"isPersited": true,
"isCounted": true,
"isMentioned": false,
"disableNotification": false,
"isStatusMessage": false,
"canIncludeExpansion": false,
"expansion": null,
"receivedStatus": 0,
"receivedStatusInfo": {
"isRead": false,
"isListened": false,
"isDownload": false,
"isRetrieved": false
},
"messageId": 8488190336485840000,
"sentStatus": 30,
"isOffLineMessage": false
}