custommessagehandle.cs需要继承senparc.weixin.mp.messagehandlers42295b4da0026d529ba5593a7bd6c77e这个抽象类,并实现部分方法。最初步的custommessagehandle.cs代码
可能如下:
using system; using system.collections.generic; using system.io; using system.linq; using system.web; using senparc.weixin.mp.entities; using senparc.weixin.mp.messagehandlers; namespace senparc.weixin.mp.sample.weixin { public class custommessagehandler : messagehandler<custommessagecontext> { public custommessagehandler(stream inputstream, postmodel postmodel) : base(inputstream, postmodel) { } public override iresponsemessagebase defaultresponsemessage(irequestmessagebase requestmessage) { var responsemessage = base.createresponsemessage<responsemessagetext>(); //responsemessagetext也可以是news等其他类型 responsemessage.content = "这条消息来自defaultresponsemessage。"; return responsemessage; } } }
我们可以看到必须要重写实现的抽象方法名为defaultresponsemessage(),这一条信息用于返回一条的消息,假如对应类型(如语音)的微信消息没有被代码处理,那么默认会返回这里的结果。
在defaultresponsemessage()方法中,我们看到这样一句:
var responsemessage = base.createresponsemessage<responsemessagetext>(); //responsemessagetext也可以是news等其他类型
这里的createresponsemessage<t>方法即创建一个返回对象,t可以为以下类型的任意一个,分别对应了不同的返回类型:
responsemessagetext - 对应文本消息
responsemessagenews - 对应图文消息
responsemessagemusic - 对应音乐消息
responsemessagexxx - 其他类型以此类推
关于上述所有类型参数的设置方法,可以看开源项目的demo,这里不再重复:https://github.com/jeffreysu/weixinmpsdk。
那么我们如何处理用户发过来的文字信息呢?
很简单——重写一个ontextrequest方法即可:
public override iresponsemessagebase ontextrequest(requestmessagetext requestmessage) { var responsemessage = base.createresponsemessage<responsemessagetext>(); responsemessage.content = "您的openid是:" + requestmessage.fromusername //这里的requestmessage.fromusername也可以直接写成base.weixinopenid + "。\r\n您发送了文字信息:" + requestmessage.content; //\r\n用于换行,requestmessage.content即用户发过来的文字内容 return responsemessage; }
这个方法中可以自由发挥,比如读取数据库、判断关键字,甚至返回不同的responsemessagexx类型(只要最终的类型都是在iresponsemessagebase接口下的即可)。
与ontextrequest对应,如果我们要处理语音、地理位置、菜单等类型的消息,只需要重写对应的方法,可以重写的方法如下:
public virtual iresponsemessagebase onimagerequest(requestmessageimage requestmessage); public virtual iresponsemessagebase onlinkrequest(requestmessagelink requestmessage); public virtual iresponsemessagebase onlocationrequest(requestmessagelocation requestmessage); public virtual iresponsemessagebase ontextrequest(requestmessagetext requestmessage); public virtual iresponsemessagebase onvoicerequest(requestmessagevoice requestmessage); public virtual iresponsemessagebase onvideorequest(requestmessagevideo requestmessage); public virtual iresponsemessagebase onevent_clickrequest(requestmessageevent_click requestmessage); public virtual iresponsemessagebase onevent_viewrequest(requestmessageevent_view requestmessage); public virtual iresponsemessagebase onevent_enterrequest(requestmessageevent_enter requestmessage); public virtual iresponsemessagebase onevent_locationrequest(requestmessageevent_location requestmessage); public virtual iresponsemessagebase onevent_subscriberequest(requestmessageevent_subscribe requestmessage); public virtual iresponsemessagebase onevent_unsubscriberequest(requestmessageevent_unsubscribe requestmessage); public virtual iresponsemessagebase onevent_scanrequest(requestmessageevent_scan requestmessage) public virtual iresponsemessagebase oneevent_masssendjobfinisrequest(requestmessageevent_masssendjobfinish requestmessage)
其中onevent_xx对应的都是event请求的子类型。
在custommessagehandler的基类设置的时候,我们看到使用了一个叫messagecontext的泛型(messagehandler<messagecontext>),这个messagecontext是sdk提供的一个默认的消息上下文处理类,这个类已经能够处理最基础的情况,如果您的应用不是很复杂,那么直接用这个类就行了。如果项目比较复杂,您也可以根据自己的需要写一个自己的类(继承imessagecontext接口),或继承这个类在扩展一些更多的属性(例如工作流和分布式缓存等等)。
至此我们已经使用massagehandler处理所有微信用户发送过来的请求。
下面介绍一些massagehandler的“秘密武器”。
onexecuting()和onexecuted()
我们可以直接重写这两个方法。其中onexecuting会在所有消息处理方法(如ontextrequest,onvoicerequest等)执行之前执行,这个过程中,我们可以把cancelexecute设为true,来中断后面所有方法的执行(包括onexecuted),例如:
public override void onexecuting() { if (requestmessage.fromusername == "olpjzjsxuqpjov0hlruzknzkc91e") { cancelexcute = true; //终止此用户的对话 //如果没有下面的代码,用户不会收到任何回复,因为此时responsemessage为null //添加一条固定回复 var responsemessage = createresponsemessage<responsemessagetext>(); responsemessage.content = "hey!你已经被拉黑啦!"; responsemessage = responsemessage;//设置返回对象 } }
如果onexecuting中没有中断,当例如ontextrequest方法执行完毕之后(或执行了默认方法),onexecuted()方法将会触发,我们也可以对应地重写。要注意的是,在onexecuted()方法内,responsemessage已经被赋了返回值。
更多微信公众平台开发:了解messagehandler。
