接收到微信用户发送过来的消息,我们服务器处理并回应。
需要注意一下,微信说明
对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器,只支持认证服务号。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。
关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。
假如服务器无法保证在五秒内处理并回复,必须直接回复空串(是指回复一个空字符串,而不是一个XML结构体中content字段的内容为空,请切勿误解),微信服务器不会对此作任何处理,并且不会发起重试。。这种情况下,可以使用客服消息接口进行异步回复。
请开发者注意,一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:
1、开发者在5秒内未回复任何内容 2、开发者回复了异常数据,比如JSON数据等
我们无法保证我们服务器能在5秒回应的话,推荐使用异步处理,使用客服消息回复用户(不讨论客服消息次数限制等问题)
WeixinServer
#region 静态全局变量 private static Token _Token = null; private static Ticket _Ticket = null; private readonly static string appid = "wx123456789000"; private readonly static string secret = "abcdefghijklmnopqrstuvwxyz"; private readonly static string domain = "http://wechat.mydomain.com"; #endregion // 消息处理 public void DisposeMsg(Stream stream) { XmlDocument doc = new XmlDocument(); doc.Load(stream); string type = GetMsgType(doc); string openid = GetMsgOpenid(doc); string access_token = AccessToken(); string url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + access_token; switch (type) { case "event": { string ev = GetMsgEvent(doc); if (ev == "subscribe") { //关注时,回复用户消息 string data = "{"touser":"" + openid + "","msgtype":"news","news":{"articles": [{"title":"欢迎关注 “XXXX“ ","description":"","url":"","picurl":"" + domain + "/weixin/msg/face1.png"},{"title":"“XXXX” 安卓版下载","description":"","url":"","picurl":"" + domain + "/weixin/msg/jiantou.png"},{"title":"“XXXX” 苹果版下载","description":"","url":"","picurl":"" + domain + "/weixin/msg/jiantou.png"}]}}"; HttpHelper.Post(url, data); } } break; case "text": { string content = GetMsgContent(doc); string data = ""; switch (content) { case "tw": { data = "{"touser":"" + openid + "","msgtype":"news","news":{"articles": [{"title":"欢迎关注 “XXXX“ ","description":"","url":"","picurl":"" + domain + "/weixin/msg/face1.png"},{"title":" “XXXX” 安卓版下载","description":"","url":"","picurl":"" + domain + "/weixin/msg/jiantou.png"},{"title":" “XXXX” 苹果版下载","description":"","url":"","picurl":"" + domain + "/weixin/msg/jiantou.png"}]}}"; } break; default: { content = "欢迎关注 “XXXX”nnAPP下载:Android IOS"; data = "{"touser":"" + openid + "","msgtype":"text","text":{"content":"" + content + ""}}"; } break; } HttpHelper.Post(url, data); } break; default: break; } }
Action里面处理
[HttpPost] public ActionResult Access() { //异步操作 使用客服消息接口回复用户 Stream stream = Request.InputStream; AsyncManager.OutstandingOperations.Increment(); var task = Task.Factory.StartNew(() => weixin.DisposeMsg(stream)); task.ContinueWith(t => { //AsyncManager.Parameters["model"] = t.Result; AsyncManager.OutstandingOperations.Decrement(); }); return Content(""); }