微信--使用客服消息异步自动回复用户消息

接收到微信用户发送过来的消息,我们服务器处理并回应。

需要注意一下,微信说明

对于每一个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         }

 

posted @ 2015-03-27 12:52  deeround  阅读(2783)  评论(2编辑  收藏  举报
UP