zoukankan      html  css  js  c++  java
  • 微信使用客服消息异步自动回复用户消息

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

    需要注意一下,微信说明

    对于每一个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         }
  • 相关阅读:
    网址收集
    高德地图根据经纬度转换成地址JS代码demo
    mybatis处理查询map列表属性为null的问题,而导致查询map无该key对象
    java输出流实现文件下载
    java后台生成zip打包文件
    java代码判断图片文件格式, 不是根据文件后缀来判断。
    model对象之setter方法使用,解决去除空格和将数字转成字符串展示方法
    使用mysql触发器脚本,解决流水数据的添加。
    spring测试父类,使用junit-4.4.jar,spring-test.jar
    Eclipse对svn操作切换账号或更换svn地址方法
  • 原文地址:https://www.cnblogs.com/deeround/p/4371482.html
Copyright © 2011-2022 走看看