tencent cloud

即时通信 IM

文档即时通信 IM更多实践类 WhatsApp Channel 搭建方案

类 WhatsApp Channel 搭建方案

PDF
聚焦模式
字号
最后更新时间: 2026-04-21 15:19:56

概述

为响应用户对多样内容创作、精准订阅者运营及长期互动的需求,弥补传统即时通讯工具在内容积累与商业服务延伸上的不足,公众号功能应运而生。该功能提供类似微信公众号的核心能力,包括创建和管理公众号,发布图文内容,并可与订阅者进行互动。

功能介绍

公众号主可向订阅者发送推文并可查看其历史推文,用户订阅公众号自动获取账号更新内容,并可与公众号进行消息互动。

功能适用场景

信息传播
品牌推广
提供便捷服务
本地指引
公众号可作为权威信息发布平台,通过图文的形式快速将各类资讯(如新闻、知识等)传递给大量用户。
商家可通过公众号发布品牌故事、产品动态等内容精准触达用户,提升品牌知名度与影响力。
公众号可集成高频服务功能,如在线办理(转账、预约)、信息查询(物流、成绩)等,为订阅者提供便捷服务。
公众号可作为周边生活的实用指南,通过图文整合本地化信息,如“社区周边疫苗接种点”,提高订阅者生活的便利程度。

















外部商家公众号形式:类微信公众号

如果您有多个外部商家需求,需要开放给 KFC、麦当劳等外部商家,可以参考下述交互示例(需要您结合 IM 基础能力进行 UI 开发)和技术实现方案。

1. 交互示例

类微信公众号的形式中商家账户与用户账户分离,商家可以在商家账户中创建公众号并对公众号进行管理,但不可将商家账户作为用户账户使用。因此,类微信公众号的形式适用于商家端与用户端拆分为两个 App 或将商家端与用户端作为 App 中两种模式切换的客户。您可以参考以下交互示例自行搭建 Web 端与 App 端的交互界面。

1.1 商家 Web 端交互示例

创建、编辑、删除公众号



创建推文



推送、消息互动




1.2 商家 App 端交互示例





1.3 用户交互示例

用户(公众号订阅者)可以在 App 中直接关注公众号并获取其推文,并可实现单聊消息的互动。




2. 实现方案

2.1 集成功能描述

公众号可以为订阅的用户发送广播消息,也可以与订阅的用户进行单聊。当其中有消息的收发时,会产生 单聊会话,会话 conversationID 的组成为 c2c_officialAccountID。公众号的创建等管理功能参考 服务端的接口,IMSDK 主要提供订阅公众号、取消订阅公众号、获取公众号列表等功能。
说明:
从 7.6.5011 版本开始支持。

2.2 公众号资料类介绍

属性
含义
说明
officialAccountID
公众号 ID
以 @TOA#_ 作为前缀,最长48个字节,可 自定义公众号 ID
officialAccountName
公众号名称
最长150字节,使用 UTF-8 编码,1个汉字占3个字节。
faceUrl
公众号展示头像
最长500字节。
organization
组织名称
最长500字节,使用 UTF-8 编码,1个汉字占3个字节。
introduction
简介
最长400字节,使用 UTF-8 编码,1个汉字占3个字节。
customData
自定义数据
最长3000字节。
createTime
创建时间
单位:秒。
subscriberCount
订阅的人数
公众号目前的订阅者人数。
subscribeTime
登录用户订阅的时间
单位:秒。

2.3 订阅公众号

调用 subscribeOfficialAccountJava / Swift / Objective-C / C++)订阅公众号,直接传入公众号的 officialAccountID 即可。
1. 订阅公众号成功后,订阅者会收到 onOfficialAccountSubscribedJava / Swift / Objective-C / C++)通知。
2. 当调用 服务端接口 修改订阅的公众号资料时,订阅者会收到 onOfficialAccountInfoChangedJava / Swift / Objective-C / C++)通知。
3. 当调用 服务端接口 销毁订阅的公众号资料时,订阅者会收到 onOfficialAccountDeletedJava / Swift / Objective-C / C++)通知。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getFriendshipManager().subscribeOfficialAccount("official_test", new V2TIMCallback() {
@Override
public void onSuccess() {
// 订阅公众号成功
}

@Override
public void onError(int code, String desc) {
// 订阅公众号失败
}
});

V2TIMManager.getFriendshipManager().addFriendListener(new V2TIMFriendshipListener() {
@Override
public void onOfficialAccountSubscribed(V2TIMOfficialAccountInfo officialAccountInfo) {
// 订阅公众号通知
}

@Override
public void onOfficialAccountDeleted(String officialAccountID) {
// 订阅的公众号被销毁通知
}

@Override
public void onOfficialAccountInfoChanged(V2TIMOfficialAccountInfo officialAccountInfo) {
// 订阅的公众号资料更新通知
}
});
V2TIMManager.shared.subscribeOfficialAccount(officialAccountID: "officialAccountID") {
print("subscribeOfficialAccount succ")
} fail: { code, desc in
print("subscribeOfficialAccount fail, \\(code), \\(desc)")
}
V2TIMManager.shared.addFriendListener(listener: self)

func onOfficialAccountSubscribed(officialAccountInfo: V2TIMOfficialAccountInfo) {
print("officialAccountInfo:\\(officialAccountInfo.description)");
}

func onOfficialAccountDeleted(officialAccountID: String) {
print("officialAccountID:\\(officialAccountID)");
}

func onOfficialAccountInfoChanged(officialAccountInfo: V2TIMOfficialAccountInfo) {
print("officialAccountInfo:\\(officialAccountInfo.description)");
}
[[V2TIMManager sharedInstance] subscribeOfficialAccount:@"official_test" succ:^ {
NSLog(@"订阅公众号成功");
} fail:^(int code, NSString *desc) {
NSLog(@"订阅公众号失败, code: %d, msg: %@", code, desc);
}];

[[V2TIMManager sharedInstance] addFriendListener:self];

- (void)onOfficialAccountSubscribed:(V2TIMOfficialAccountInfo *)officialAccountInfo {
// 公众号订阅通知
}

- (void)onOfficialAccountDeleted:(NSString *)officialAccountID {
// 订阅的公众号被销毁通知
}

- (void)onOfficialAccountInfoChanged:(V2TIMOfficialAccountInfo *)officialAccountInfo {
// 订阅的公众号资料更新通知
}
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

Callback() = default;
~Callback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess() override {
if (success_callback_) {
success_callback_();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 订阅公众号成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 订阅公众号失败
delete callback;
});
V2TIMManager::GetInstance()->GetFriendshipManager()->SubscribeOfficialAccount(
"official_test", callback);

// 公众号通知
class FriendshipListener final : public V2TIMFriendshipListener {
public:
FriendshipListener() = default;
~FriendshipListener() override = default;
void OnOfficialAccountSubscribed(const V2TIMOfficialAccountInfo &info) override {
// 公众号订阅通知
}
void OnOfficialAccountDeleted(const V2TIMString &officialAccountID) override {
// 订阅的公众号被销毁通知
}
void OnOfficialAccountInfoChanged(const V2TIMOfficialAccountInfo &info) override {
// 订阅的公众号资料更新通知
}
};

FriendshipListener friendshipListener;
V2TIMManager::GetInstance()->AddFriendshipListener(&friendshipListener);

2.4 取消订阅公众号

调用 unsubscribeOfficialAccountJava / Swift / Objective-C / C++)取消订阅公众号,直接传入公众号的 officialAccountID 即可。
取消订阅公众号成功后,取消订阅的用户会收到 onOfficialAccountUnsubscribedJava / Swift / Objective-C / C++)通知。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getFriendshipManager().unsubscribeOfficialAccount("official_test", new V2TIMCallback() {
@Override
public void onSuccess() {
// 取消订阅公众号成功
}
@Override
public void onError(int code, String desc) {
// 取消订阅公众号失败
}
});

V2TIMManager.getFriendshipManager().addFriendListener(new V2TIMFriendshipListener() {
@Override
public void onOfficialAccountUnsubscribed(String officialAccountID) {
// 取消订阅公众号通知
}
});
V2TIMManager.shared.unsubscribeOfficialAccount(officialAccountID: "officialAccountID") {
print("unsubscribeOfficialAccount succ")
} fail: { code, desc in
print("unsubscribeOfficialAccount fail, \\(code), \\(desc)")
}

V2TIMManager.shared.addFriendListener(listener: self)

func onOfficialAccountUnsubscribed(officialAccountID: String) {
print("officialAccountID:\\(officialAccountID)");
}
[[V2TIMManager sharedInstance] unsubscribeOfficialAccount:@"official_test" succ:^ {
NSLog(@"取消订阅公众号成功");
} fail:^(int code, NSString *desc) {
NSLog(@"取消订阅公众号失败, code: %d, msg: %@", code, desc);
}];


[[V2TIMManager sharedInstance] addFriendListener:self];


- (void)onOfficialAccountUnsubscribed:(NSString * _Nullable)officialAccountID {
// 取消订阅公众号通知
}
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

Callback() = default;
~Callback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess() override {
if (success_callback_) {
success_callback_();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 取消订阅公众号成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 取消订阅公众号失败
delete callback;
});
V2TIMManager::GetInstance()->GetFriendshipManager()->UnsubscribeOfficialAccount(
"official_test", callback);

// 公众号通知
class FriendshipListener final : public V2TIMFriendshipListener {
public:
FriendshipListener() = default;
~FriendshipListener() override = default;

void OnOfficialAccountUnsubscribed(const V2TIMString &officialAccountID) override {
// 取消订阅公众号通知
}
};

FriendshipListener friendshipListener;
V2TIMManager::GetInstance()->AddFriendshipListener(&friendshipListener);

2.5 获取公众号列表

调用 getOfficialAccountsInfoJava / Swift / Objective-C / C++)接口获取公众号列表。
officialAccountIDList 列表为空时,为获取订阅的公众号列表。
officialAccountIDList 填入指定的公众号 ID 时,为获取填入的公众号列表。
示例代码如下:
Java
Swift
Objective-C
C++
List<String> officialAccountIDList = new ArrayList<>();
V2TIMManager.getFriendshipManager().getOfficialAccountsInfo(officialAccountIDList, new V2TIMValueCallback<List<V2TIMOfficialAccountInfoResult>>() {
@Override
public void onSuccess(List<V2TIMOfficialAccountInfoResult> v2TIMOfficialAccountInfoResults) {
// 获取订阅的公众号列表成功
}

@Override
public void onError(int code, String desc) {
// 获取订阅的公众号列表失败
}
});
V2TIMManager.shared.getOfficialAccountsInfo(officialAccountIDList: ["officialAccountID"]) { officialAccountResultList in
officialAccountResultList.forEach { item in
print(item.description)
}
} fail: { code, desc in
print("getOfficialAccountsInfo fail, \\(code), \\(desc)")
}
[[V2TIMManager sharedInstance] getOfficialAccountsInfo:nil succ:^(NSArray<V2TIMOfficialAccountInfoResult *> *resultList) {
[self appendString:[NSString stringWithFormat:@"获取订阅的公众号列表完成:%@", resultList]];
} fail:^(int code, NSString *desc) {
[self appendString:[NSString stringWithFormat:@"获取订阅的公众号列表失败,code:%d msg:%@",code,desc]];
}];
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T &)>;
using ErrorCallback = std::function<void(int, const V2TIMString &)>;


ValueCallback() = default;
~ValueCallback() override = default;


void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}


void OnSuccess(const T &value) override {
if (success_callback_) {
success_callback_(value);
}
}
void OnError(int error_code, const V2TIMString &error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}


private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};


auto callback = new ValueCallback<V2TIMOfficialAccountInfoResultVector>{};
callback->SetCallback(
[=](const V2TIMOfficialAccountInfoResultVector& officialAccountInfoResultList) {
// 获取订阅的公众号列表成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取订阅的公众号列表失败
delete callback;
});

V2TIMManager::GetInstance()->GetFriendshipManager()->GetOfficialAccountsInfo(
officialAccountIDList, callback);

2.6 公众号收发消息

公众号的消息分为:公众号给所有订阅者发送的广播消息公众号与某一个订阅者之间的单聊消息
2.6.1 公众号发送广播消息
方式一:
调用 公众号用户发送广播消息 可以向关注公众号的所有订阅者发送广播消息。
方式二:
公众号控制台 的推文管理页面,创建一条推文后,点击发送按钮即可直接向所有的订阅者发布推文。
1. 用户可以选择创建推文的形式。系统支持以下三类:
图文形式:推文文案 + 图片素材
图片形式:图片素材
文字形式:推文文案
2. 用户可在推文内容输入框中撰写文案,并在图片上传区上传本地图片。
3. 推文内容标题的右侧点击添加链接,支持在推文中插入超链接,完成二次跳转。
4. 支持公众号内容预览。用户输入的内容将在右侧预览界面中实时展示。
5. 发送推文。在创建推文界面,填写好所有的信息后,点击发布按钮即可发送推文。发布成功后,发送的推文将显示在推文列表里。



2.6.2 公众号与订阅者互发单聊消息
订阅者发给公众号:
调用 发送消息sendMessageJava / Swift / Objective-C /C++)接口发送给公众号消息,其中 receiver 填公众号 officialAccountID
公众号发给订阅者:
调用 单发单聊消息 向该订阅者发送单聊消息,其中:
From_Account 填公众号 officialAccountID
To_Account 填订阅者 userID
2.6.3 接收消息
两种消息都可以通过 IMSDK 的 消息监听器 来接收。

2.7 实现公众号的创建

方式一:
服务端后台调用 创建公众号 可以实现创建公众号的功能。
方式二:
公众号管理页面,单击创建公众号按钮。点击完创建公众号按钮后出现创建公众号弹窗,可以在公众号的创建弹窗中填写公众号的公众号名称、公众号简介和公众号头像。填写完成后点击创建按钮即可保存新建的公众号设置。




2.8 实现公众号的编辑与删除

方式一:
管理人员可以通过在后台调用 修改公众号资料 编辑公众号的资料,调用 销毁公众号 接口实现对公众号的删除。
方式二:
在公众号管理页面,点击管理页面的编辑按钮可以实现对公众号的编辑,支持编辑公众号名称、公众号简介、公众号头像。




外部商家公众号形式:类 WhatsApp channel

如果您有多个外部商家需求,需要开放给 KFC、麦当劳等外部商家,可以参考下述交互示例(需要您结合 IM 基础能力进行 UI 开发)和技术实现方案。

1. 交互示例

类 WhatsApp channel 通过群聊的形式实现公众号消息发送,用户加群就是订阅公众号,支持一个公众号100万订阅者,公众号主与管理员能够在公众号中发送群聊消息,普通用户仅能接收群聊消息,但可对消息进行 emoji 回复。使用 会话分组 可以将 App 中的 Chat 与公众号进行区分,默认公众号上限为1000个(会话分组上限),如果想要创建更多公众号,请 联系我们。该模式适用于商家端和 C 端在同一个 App / Web 上用的客户,您可参考以下交互示例自行搭建 Web 端与 App 端的交互界面。

1.1 商家 Web 端交互示例

创建、编辑公众号



创建推文




1.2 商家 App 端交互示例





1.3 用户交互示例

订阅者可以在 App 中直接关注公众号、获取公众号的推送,订阅后,订阅者能够通过 emoji 表情回应的方式互动。




2. 实现方案

2.1 创建公众号

创建公众号即 创建社群,groupType 选择 Community,支持一个群10万至100万人。创建后 设置群自定义字段,标记该社群为公众号,区别于其他正常的社群群聊。

2.2 订阅公众号

订阅公众号即 加入社群,加入后如果想将公众号(特定的社群)和普通单聊群聊的未读计数分开展示,可以调用新建会话分组 createConversationGroup 将公众号会话(特定的社群),通过 addConversationsToGroup 添加到公众号分组。

2.3 取消订阅公众号

取消订阅公众号即 退出社群

2.4 获取公众号列表

通过调用 getJoinedGroupList 获取公众号列表,获取所有加入过的社群列表后,调用 getGroupsInfo 查询群资料中的群自定义字段是否有公众号的标记,从而获得用户加入的公众号(社群)列表。

2.5 公众号主发消息

公众号主调用群聊 发送消息能力 发送文本、富媒体、自定义等消息。

2.6 用户消息回应

用户可以对某一个消息进行 表情回应

平台官方公众号形式

如果您是自己平台的官方公众号账号,不需开放给外部商家,可以直接通过 控制台 实现此公众号功能。该控制台界面仅客户本人可见,支持创建、编辑、管理公众号,并可在此查看和创建公众号推文。客户端公众号相关能力集成,推荐采用本文介绍的“类微信公众号”方案,具体步骤请参见 外部商家公众号形式实现方案









帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈