一、前言
微信是目前最流行的即时通讯工具之一,同时在微门户、企业管理等方面进行社交平台应用的扩展,尤其是企业号的发布,更确立了微信作为企业信息化管理的一种延伸和支持。
二、功能特点
本文将围绕需求之一,即内部群组聊天展开,具体功能包括:
1、 多群组聊天,用户基于微信通讯录;
2、 支持表情功能;
3、 可以发送文字、图片、文件、视频等信息;(其中图片、文件、视频作为二期实现);
4、 聊天历史记录查询;
三、功能设计
1) 模块定义
2) 组件定义
整个插件系统主要包含以下几个组件(类似于vs的项目工程):
2、数据通讯流程
聊天的信息交互都采用业界即时通讯普遍的方式,Socket通信模式实现,整体框架分客户端和服务器端:
Ø 客户端采用html5中的WebSocket组件;
Ø 服务器端采用C#编写,并以window服务的方式部署和运行;
通讯流程:
1) 客户端连接
客户端在第一次连接时,通知服务器端,进行“握手”操作。传送的数据包格式定义:
|
返回结果:
<wxchatmessage>
<action>connect</action>
<result>ok</result> //result:ok,error
</wxchatmessage >
2) 客户端数据发送
客户端连接上服务器端后,将发送相关信息,发送的数据报格式:
<wxchatmessage>
<action>send</action>
<!--群组id,如果为空,则表示点对点聊天,touserids必须不为空-->
<groupid></groupid>
<!--发送者标识-->
<fromusesrid></fromusesrid >
<touserids></touserids> //接收者标识,如为空,则所有人;不为空,则表示私聊
<type>text</type> //text:文本、image:图片、file:文件、voice:音频;
<content>内容</content> //type=text显示;
<media> //type=text,image,file,voice 支持多个
<url></url> //type=text,image,file,voice
<title></title> //type=file
</media> //type=image |voice
<createdatetime>发送时间</createdatetime>
</wxchatmessage >
3) 服务器端数据接收
服务器端接收数据来自客户端的数据后,首先解析发送过来的数据包,根据数据包定义进行发送(给客户端);
a、 解析客户端发送过来的数据;
b、 将发送的数据存入缓存;
4) 服务器端数据发送(给客户端)
服务器端的数据解析后,判断touserids和groupid,根据groupid来判断该消息发送给哪个群组;
根据touserids,判断是发送给指定群组中的哪些人,就是私聊;
<wxchatmessage>
<action>receive</action>
<!--发送者标识-->
<fromusesrid></fromusesrid >
<touserid></touserid> //单个接收者标识
<type>text</type> //text:文本、image:图片、file:文件、voice:音频;
<content>内容</content> //type=text显示;
<media> //type=text,image,file,voice 支持多个
<url></url> //type=text,image,file,voice
<title></title> //type=file
</media> //type=image |voice
<createdatetime>发送时间</createdatetime>
</wxchatmessage >
5) 客户端接收消息
客户端接收来自于服务器端发送的消息。
a、 根据html5的websocket中的onmessage事件获取服务器端发送的信息;
b、 根据数据包的格式定义解析;
c、 将解析后的内容呈现在对话窗口中;
6) 客户端断开
客户端断开后,发送数据包通知服务器端。数据包格式:
<wxchatmessage>
<action>disconnect</action>
<!--群组id-->
<groupid></groupid>
<!--发送者标识-->
<fromusesrid></fromusesrid >
<type>text</type>
<content>内容</content>
<createdatetime>发送时间</createdatetime>
</wxchatmessage >
3、数据存储
1) 消息文本存储
在利用Socket数据通讯过程中,是不保存数据的,如实现历史记录查询,必须对所有的内容进行存储。
存储的方式将采用间隔定时存储,将缓存中的内容存储到数据库中。通知存储的方式将采用windows服务。
存储流程:
a、 读取指定条数缓存中最旧的队列数据,转换成DataTable批量存储到数据库中(sqlbulkcopy方法);
b、 在缓存中删除已存入数据库的队列数据;
2) 多媒体(media)存储
所有的多媒体文件直接上传到服务器目录下,保存时间保留5天。
多媒体数据定时存储到数据库中。
4、对话窗口
1) 第一次进入
用户第一次进入聊天界面时,会从数据库获取该组聊天的最新x条历史记录。
根据用户id,获取头像、昵称;通过用户id调用微信接口获取。此处一定要将用户信息缓存起来,使得用户信息有效期保留24小时;
建立socket连接,发送客户端数据包;
2) 发送文本消息
调用消息时,根据发送类型,组装数据包。
调用html5的websocket中onsend事件,发送数据包到服务器端;
3) 发送表情
所有的表情符号,使用编码表示,如微笑图标:[微笑]等
在对话框中显示的时候,进行语义转换;
也是文本类消息的一种。
4) 发送文件(该功能仅限Android版本微信使用)
将手机端的文件上传给其他用户;
上传流程:
a、 选择本机文件,点击上传;
b、 上传到服务器,并返回url和文件名信息;
c、 再将这些信息包装成通讯数据包发送给服务器端;
d、 服务器端再发送给接收客户端;
5) 发送图片
发送图片将直接调用微信的js-sdk,图片来源有2种,一种是手机图片,还有一种是直接拍摄后获取。
基本流程与发送文件一致,详见微信js-sdk开发文档。
6) 发送音频
发送音频将直接调用微信的js-sdk,音频来源是直接录音;
基本流程与上传图片类似,详见微信js-sdk开发文档;
四、数据定义
1、外部数据
系统涉及到的外部数据,主要包括用户基本信息和用户组信息;
用户基本信息获取依赖于微信,并通过微信接口调用;
用户组信息获取依赖于微信,并通过微信接口调用;
2、数据通讯包定义
详见“数据通讯流程”章节。
3、数据表定义
1) 数据表:ChatInfo
代码 | 注释 | 数据类型 | 长度 |
ID | 主键 | int |
|
Content | 信息内容 | Nvarchar | 500 |
CreateDatetime | 时间 | datetime |
|
FromUserId | 发送者账号(微信登录账户) | nvarchar | 50 |
ToUserId | 接收者账号(微信昵称);可多个,英文逗号分隔。 | nvarchar | 50 |
GroupId | 分组标识 | nvarchar | 50 |
五、适用条件
本插件所适用的微信版本号为6.1(含)以上。
本插件适用于iOS 和 Android操作系统,除文件上传无法适用于Android版微信。