文档中心>即时通信 IM>更多实践>类微信公众号搭建方案

类微信公众号搭建方案

最近更新时间:2026-05-13 17:52:38

我的收藏

概述

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

功能介绍

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

功能适用场景

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

















公众号搭建形式对比

对比维度
适用对象
有外部商家需求
在同一个 APP/Web 中无法同时登录商家与用户两个身份,需要有一个商家端,一个用户端
有外部商家需求
在一个 APP/Web 中可以同时拥有商家与用户两个身份
管理功能
(创建/删除/编辑公众号)
需开发者自行搭建商家管理后台​
需开发者自行搭建商家管理后台​
客户端功能
(订阅/取消订阅/获取公众号列表/收发消息)
自行搭建
自行搭建
实现方案
基于 IM 原生公众号能力
基于 IM 社群​
消息互动
​广播消息(一对多推文)
单聊消息(一对一私信互动)
群聊消息(一对多推文)
表情回应(对推文贴 emoji 互动)

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

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

1. 交互示例

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

1.1 商家 Web 端交互示例

创建、编辑、删除公众号



创建推文



推送、消息互动




1.2 商家 App 端交互示例





1.3 用户交互示例

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




2. 实现方案

2.1 管理公众号

2.1.1 创建公众号
服务端后台调用 创建公众号 可以实现创建公众号的功能。
2.1.2 编辑公众号
管理人员可以通过在后台调用 修改公众号资料 编辑公众号的资料。
2.1.3 删除公众号
调用 销毁公众号 接口实现对公众号的删除。

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 即可。
订阅公众号成功后,订阅者会收到 onOfficialAccountSubscribedJava / Swift / Objective-C / C++)通知。
当调用 服务端接口 修改订阅的公众号资料时,订阅者会收到 onOfficialAccountInfoChangedJava / Swift / Objective-C / C++)通知。
当调用 服务端接口 销毁订阅的公众号资料时,订阅者会收到 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 公众号收发消息

公众号可以为订阅的用户发送广播消息,也可以与订阅的用户进行单聊。当其中有消息的收发时,会产生 单聊会话,会话 conversationID 的组成为 c2c_officialAccountID
2.6.1 公众号发送广播消息
调用 公众号用户发送广播消息 可以向关注公众号的所有订阅者发送广播消息。
2.6.2 公众号与订阅者互发单聊消息
订阅者发给公众号:
调用 发送消息sendMessageJava / Swift / Objective-C / C++)接口发送给公众号消息,其中 receiver 填公众号 officialAccountID
公众号发给订阅者:
调用 单发单聊消息 向该订阅者发送单聊消息,其中:
From_Account 填公众号 officialAccountID
To_Account 填订阅者 userID
2.6.3 接收消息
两种消息都可以通过 IMSDK 的 消息监听器 来接收。

外部商家公众号形式:类 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 用户消息回应

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