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