​前言:OSS.Social是个开源的社交网站接口集成项目,当前也有很多其他不错的项目,不过始终没有我想要的那种简单清晰,只能撸起袖子,从头打造一个。当前正在进行的是对微信项目的开发,这里把对接口的整理,设计的思路,和项目的代码实现方式做一个概要分享。

代码下载地址:【github】  【开源中国

一. 模块划分

​微信对外开放的接口已经非常的多,再加上时间演进的原因,可以说甚至有点杂乱。不过在大模块上基本上还是很清晰的。

​这里针对已有的微信接口(排除支付,会在OSS.PayCenter中开源),根据接口的功能范围,我把当前接口主要分为以下:授权接口,功能接口,实时消息接口 三个主要模块,每个模块下又有子项,如下图(在线查看,可以看到各个子项):

 

1. 实时消息模块(Msg文件夹)

​主要处理实时消息的交互,在消息中又分为普通消息和事件消息。事件消息是非常重要的一个模块,在后续的诸多功能中起到了一个消息中枢的作用,很多重要通知都是通过这个功能推送过来的。如果接触过消息队列的同学,可能会发现这个事件消息就像是我们业务系统中的消息中心模块。

2. 公众号功能模块(Offcial文件夹)

​这个模块主要是公众号的一些功能接口,主要针对的对象是公众号账户,这类接口都有一个共同的地方,调用时需要全局AccessToken。在这个模块中,我又根据接口的功能对象,将功能进行相应的拆分,有了如上图的划分。

3. 社交接口模块

​这个模块是最常见的模块,主要针对的对象都是单一用户,在像微博,豆瓣,以及所有稍微有一定规模用户群体的社交网站都会有这些功能,各家性质不同,接口也不一,但都会有如 Oauth 授权接口,像新浪会有发送微博等功能,微信当前主要是授权和获取用户基本信息。

二. 消息模块的设计实现方式

消息模块是微信接口中最重要的一块功能,除了普通的消息之外,它的事件消息可以说完全是一个我们消息队列中心,及时将各种事件push到业务方服务器上,方便我们快速处理。简单介绍下消息模块的实现方式。

a.  调用展示:

​下图是消息模块的调用展示,两种模式,一种是最基本的模式,实体和执行事件委托(event delegate)都是已经封装好的,处理逻辑就好。 另外一种是高级模式,实体和处理方法调用注册方法

 

b.  设计思路(见下方流程图)

​ 消息模块中主要处理的是实时的消息接收和回复。发起方是由微信调用,接收方处理消息执行并响应。在整个处理过程中,不管是普通消息还是事件消息,都会经历一个完整的生命周期,在这个周期里包含了:接收=》解析=》业务逻辑执行=》封装消息 =》回复

​针对当前生命周期,接收和回复都是通用的,主要是业务逻辑的不同, 在这个模块中我们采用Handler的处理方式,由主入口进入,针对不同的消息类型采用对应的解析,执行和封装。

​也就是说开发者需要关心的只是 接收实体,执行逻辑方法和返回实体。对于微信提供的基础消息类型来说,这里就非常清晰了,预先定义好对应的接收实体,和相应的处理方法委托,调用时给对应的委托添加具体执行方法即可。在OSS.Social的项目中,我的实现方式是,通过泛型获取接收实体,通过定义事件类型的委托,作为业务逻辑方法,开发者只需要在业务方法中返回想要需要的消息类型即可。(为何使用事件类型委托 ,在代码讲解章节将会讲解),具体方式见上图的基础调用方式。

​同时,除了微信自身提供的基本的消息类型之外,我们还需要考虑到后续的事件消息扩展,这里强调一下扩展的必要性,微信的事件消息会有很多 ,同时可能随时会有新的字段调整等,像卡券中渠道等字段。也就是说我们需要一个高级的消息处理模式,开发者能够自己定义接收实体,以及相应的自定义事件类型。

​消息生命周期执行时,我们需要知道的是: 对应的消息类型名称,对应的实体类型,和事件方法,才能完成整个生命周期,也就是说我们需要开发者在开发时传入以上信息,底层框架能提供保存的功能,事件执行时根据对应消息类型,实例化对应的消息实体,传入执行事件。在OSS.Social 项目中,我采用的方式是提供Register方法,底层使用ConcurrentDictionary字典保存对应的类型和方法,在解析过程中通过CreateInstance反射获取对应的消息实体,传入委托方法。

​这里没有把所有的事件消息全部封装,而是提供了一个高级消息处理模式。其一:我们要的是简单,清晰,扩展强,全部封装起来不仅代码臃肿,给调用者也造成一定的限制。其次:主要是一个个全写完,估计这双手要撸秃皮了。

​这个模块的主要思路就是把过程流程化,明确需要哪几个步骤,然后每个步骤可能的情况进行细化。这里只是提供了一个简单的概要思路,后续会有针对当前章节的详细讲解。

c. 流程图

 

感兴趣的同学可以去下载源码查看,欢迎贡献。后边其他部分,以及相关的代码讲解都会慢慢放出来,希望大家一块学习进步!

微信公众号:

 

开源OSS.Social微信项目解析的更多相关文章

  1. 开源OSS.Social微信项目进阶介绍

    在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,主要在讲述解决思路和过程,没有详细实现和使用介绍.本着不能马虎的态度,这篇文章我来给大家分解一下项目结构,使 ...

  2. OSS.Social微信项目标准库介绍

    经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下, ...

  3. 开源OSS.Social项目进阶介绍和使用展示

    在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,没有全局介绍,没有详细讲解,也没有如何使用,很多朋友估计匆匆一瞥就忙着抢开工红包去了.本着不能马虎的态度,这 ...

  4. Android开发周报:Flyme OS开源、经典开源项目解析

    Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...

  5. renren-fast开源项目解析日志—1、项目的部署

    renren_fast项目解析日志 一.环境搭建 1.后端部署 (1)下载源码 按照步骤,从码云上down了fast,zip的(引maven项目)项目包. (2)安装lombok插件 安装lombok ...

  6. .Net开源oss项目进度更新(含小程序接口)

    和大家分享下当前OSS开源项目的进度情况: 一. OSS.Common [开源中国] [github] 经过昨天的努力,oss.common项目初步完成了对.net standard的支持,迁移过程本 ...

  7. [Swift通天遁地]七、数据与安全-(3)Cocopods的安装和开源类库对JSON的解析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. 【开源分享】微信营销系统(第三方微信平台)github 开源

    升讯威微信营销系统(微信第三方平台) 在线体验:http://wxcm.eeipo.cn/开源地址GitHub:https://github.com/iccb1013/Sheng.WeixinCons ...

  9. 数据库开源框架GreenDao的使用解析

    数据库开源框架GreenDao的使用解析 1,GreenDao概述 1),greenDao是一个当下十分火热的数据库开源框架,或者说是一个帮助Android开发者将数据存到SQLite中的一个开源项目 ...

随机推荐

  1. 让MySQL数据库支持Emoji表情

    问题:Emoji 表情是按照4个字节存储的,所以传统 mysql utf-8编码只能最大存储3字节. 解决:修改MySQL(5.5.3以上版本) 编码为utf8mb4 即可存储Emoji表,同时设置 ...

  2. 用Quick Cocos2dx做一个连连看(三)

    做个日记吧. 最近比较忙,斗志也不高,昨天有点时间了,开始做了一下连接方法,一开始用的搜索算法,但是bug比较多,究其原因是对语法和算法都不是很熟悉. 然后昨天下午利用点时间用稍微通俗一点的连接算法, ...

  3. IE去掉input的type=”text”输入内容时出现的X和type=”password”出现的眼睛图标

    从IE 10开始,type=”text” 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清除已经输入的文本.对于type=”password”的 input 则会在右方显示 ...

  4. 数据分析与R语言-概念点(一)

    一.数据分析 1.数据分析的多层模型 常用的统计量 常用的算法 常用的数据分析工具 常见的报表 二.R语言 1.什么是R语言?     R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个 ...

  5. FZU 2092 收集水晶

    暴力DP. dp[x1][y1][x2][y2][t]表示,第一个人在(X1,Y1),第二个人在(X2,Y2),时间为t的时候获得的最大价值. 时间复杂度o(t*n*m*n*m*5*5). 什么都不优 ...

  6. TCP协议和UDP协议的区别

    1. TCP协议面向连接. UDP协议面向非连接 (有无链接)2. TCP协议传输速度慢. UDP协议传输速度快 (传输速度)3. TCP协议保证数据顺序. UDP协议不保证 (数据的有序性. 在IP ...

  7. js脚本语言(数组)

    定义:给数据Array(1,3.14,"aa")给长度(Array(5))使用方括号定义[1,3.14,"aa"] 属性:lenght(数据的长度) 方法:pu ...

  8. IOS开发中UIAlertController(警告框)的使用

    步骤一.初始化: UIAlertController * inputname = [UIAlertController alertControllerWithTitle:@"未输入账户&qu ...

  9. IOS开发中如何给UIImageView添加点击事件

    1.先创建一个UIImageView控件: photeImageView = [[UIImageView alloc]init]; photeImageView.frame = CGRectMake( ...

  10. ipyparallel 中的 pi的求法

    1.PI的求法的数学依据 如图,可以看见在边长为1的正方形里面,有一个1/4圆,我们随机在正方形中取点,点在圆内的概率和点在正方形内的概率之比正好为两者的面积之比.这样就有在圆内的点的数目比所有点的数 ...