Senparc.Weixin SDK介绍
Senparc.Weixin SDk是目前.net平台上使用率最高的微信SDK,除硬件平台暂未发布以外覆盖了所有微信平台模块,自2013年免费开源起已经持续更新了4年,是GitHub上目前Star和Fork数最多的中国C#开源项目。
目前大多数模块都支持了.net 4.0 / .net 4.5 / .net core 三个版本,Senparc官方计划在2017年将新增.net 4.6.2版本,并着力强化.net core版本,在7月左右会停止对.net 4.0版本的更新。
其中,小程序的模块命名为Senparc.Weixin.WxOpen,Nuget地址:
https://www.nuget.org/packages/Senparc.Weixin.WxOpen
v1.0版本已于2017年1月9日凌晨同步上线!
Senparc.Wexin SDK系列库:
过去的4年时间,Senparc团队总共迭代发布了100多个稳定版本,目前总体框架已经比较完善,可以应对超高并发在内的各种系统环境。
以下是官方提供的一些资源:
官网:http://weixin.senparc.com/
源代码(包含Demo):https://github.com/JeffreySu/WeiXinMPSDK
在线Demo(包含Nuget项目入口):http://sdk.weixin.senparc.com/
Demo公众号:盛派网络小助手
公众号开发系列教程:http://www.cnblogs.com/szw/p/weixin-course-index.html
下载类库chm帮助文档:http://sdk.weixin.senparc.com/Document
在线类库帮助文档:http://doc.weixin.senparc.com/
微信开发资源汇总项目:https://github.com/JeffreySu/WeixinResource
Senparc.Weixin SDK交流QQ群:342319110
小程序开发交流QQ群:108830388
微信平台生态关系
加上小程序之后,整个公众号的平台生态又多了一环,根据开发代码体量和包含关系(尤其是核心重叠部分),目前大概是下面这样的场景:
整个2016年,开发者们被微信小程序吊足了胃口,每每微信官方有小程序的动态发布,都会被刷屏,大众对微信小程序的关注程度可见一斑。
对于开发者来说,无论微信小程序的实际商业应用广度或是被接受度如何,这都将是一块熟悉又陌生的广阔的处女地。
由于小程序的多数规则和微信公众号基本一致,因此我们的小程序模块(Senparc.Weixin.WxOpen.dll)多数代码是从公众号模块(Senparc.Weixin.MP.dll)移植过来的。
微信官方为小程序准备了比较细致的文档和教程(这一点和当初公众号相比简直不在一个级别上),以下是一些重要的线上资源:
小程序开发文:https://mp.weixin.qq.com/debug/wxadoc/dev/
小程序设计指南:https://mp.weixin.qq.com/debug/wxadoc/design/
开发工具下载:
https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
下文将整理目前为止对小程序后端开发最为重要的知识点、注意点进行介绍,或给出对应资源的地址,并就和微信公众号相关的技能给出相关的索引。
对于一个在高并发场景下保持高可用性的小程序来说,这几个方面的处理细节是不可忽视的:
消息处理
上下文
消息加密
AccessToken令牌处理
高级接口
异步开发
分布式缓存
同步锁
WebSocket
跟踪日志及异常处理
消息处理
微信小程序在进入客服会话状态之后,即可与客服进行对话,可以发送文字或图片信息,和公众号不同的是,目前小程序的消息系统是不能进行直接回复的,必须使用异步的方式调用“客服接口”推送消息(下文会讲到),为此我们优化了Senparc.Weixin SDK中的消息处理流程:MessageHandler。
MessageHandler是一个信消息的处理模块,也是整个微信开发过程中不可缺少的一部分。在MessageHandler中,开发者可以非常轻松地处理所有类型的微信消息。小程序的MessageHandler类叫做WxOpenMessageHandler。
在ASP.NET MVC我们只需要如下几步就可实现对消息的处理(和微信公众号一致)。
第一步:创建上上下文类,CustomWxOpenMessageContext.cs:
有关WxOpenMessageContext(上下文)的内容下文会讲到。
CustomWxOpenMessageContext.cs 代码如下:
using Senparc.Weixin.Context;
using Senparc.Weixin.WxOpen.Entities;
namespace Senparc.Weixin.MP.Sample.CommonService.WxOpenMessageHandler
{
public class CustomWxOpenMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase>
{
public CustomWxOpenMessageContext()
{
base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
}
/// <summary>
/// 当上下文过期,被移除时触发的时间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase,IResponseMessageBase> e)
{
/* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)
* 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除
*/
var messageContext = e.MessageContext as CustomWxOpenMessageContext;
if (messageContext == null)
{
return;//如果是正常的调用,messageContext不会为null
}
//TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考
//Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);
//api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");
}
}
}
源码:
第二步:创建自定义 CustomWxOpenMessageHandler.cs:
CustomWxOpenMessageHandler.cs 代码如下:
using System.IO;
using System.Web.Configuration;
using Senparc.Weixin.