asp.net微信公众号开发,测试公众号收发消息

准备:

1、学习阶段,可以申请测试账号,此账号接口权限很多,方便做测试。

2、由于微信web开发必须为外网服务器,可以将使用工具将内网穿透到外网,本人使用的是natapp,该网站有免费的隧道,可是域名每次都是随机生成的,每次开发微信功能时,都需要在测试账号界面更改服务器,验证token,较为麻烦。建议购买隧道,价格核还算公道,会很省事。注意,每次做开发时都需要打开natapp的客户端,因此需要配置config,使得每次打开natapp都可以直接穿透,不需要输入代码。

3、使用本机作为服务器,每次验证功能时需要将项目通过IIS发布到本地文件夹。

验证token

验证token的目的在于确认你所填写的url是有效的。验证位置在申请测试账号页面,我们需要做的,就是在项目的启动项的后太码里面获取服务的参数timestamp、nonce,和自己填写的token经过一个加密算法形成一个字符串,如何和请求服务器获得的signature吻合,则验证成功。验证只需要一次,在申请测试号界面token验证通过,则可以注释掉验证代码。

 private void valid() {
            string echoStr = Request.QueryString["echoStr"].ToString();
            if (CheckSignature())
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    Response.Write(echoStr);
                    Response.End();
                }
            }
        }
        
private bool CheckSignature()
        {
            string signature = Request.QueryString["signature"].ToString();
            string timestamp = Request.QueryString["timestamp"].ToString();
            string nonce = Request.QueryString["nonce"].ToString();
            string[] ArrTmp = { Token, timestamp, nonce };
            Array.Sort(ArrTmp);     //字典排序  
            string tmpStr = string.Join("", ArrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            tmpStr = tmpStr.ToLower();
            if (tmpStr == signature)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

接受消息(微信服务器)

用户关注了公众号以后,可能会对公众号发送一个“你好”的消息。这个消息会先发送给微信的服务器(手机微信上面的操作,肯定是先由微信服务器处理),再通过微信服务器发送的我们填写的url上,此处即是我们本机。发送到本机的哪里呢,发送到本机IIS发布好的项目里,由项目里的默认项负责处理。

 private string GetPostMsg()
        {
            try
            {
                System.IO.Stream s = Request.InputStream;
                int count = 0;
                byte[] buffer = new byte[s.Length];
                StringBuilder builder = new StringBuilder();
                while ((count = s.Read(buffer, 0, buffer.Length)) > 0)
                {
                    builder.Append(Request.ContentEncoding.GetString(buffer, 0, count));
                }
                s.Flush();
                s.Close();
                s.Dispose();
                return builder.ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

发送消息

微信公众号在接受了用户的消息以后,发给本机,再由本机接受数据,通过对发送的数据进行解析,明确用户的目的,再做出相应的回应,这有点类似AI,其实就是一个switch判断而已。

   private void ResponseMsg(string _postStr)
        {
            try
            {
            XmlDocument document = new XmlDocument();
            document.LoadXml(_postStr);
            XmlNode root = document.SelectSingleNode("xml");
            XmlNodeList nodeList = root.ChildNodes;

            //model存储获取的数据
            var model = new
            {
                ToUserName = nodeList.Item(0).InnerText,
                FromUserName = nodeList.Item(1).InnerText,
                CreateTime = nodeList.Item(2).InnerText,
                MsgType = nodeList.Item(3).InnerText,
                Content = nodeList.Item(4).InnerText
            };
            //获取当前的时间
            int currentTime = AppGL.ConvertDateTimeInt(DateTime.Now);

            switch(model.Content.Substring(0,2))
            {
                case "你好":Response.Write(你想要发送的数据(注意格式));
                    break;
                case "图片":Response.Write(你想要发送的数据(注意格式));
                    break;
                case "电影":Response.Write(你想要发送的数据(注意格式));
                    break;
                default:
                           Response.Write(你想要发送的数据(注意格式));
                    break;
            }
            }
            catch (Exception ex)
            {

              //错误信息,写入日志
                WriteTextLog(ex.Message);
            }
        }

结语

本文所写是微信开发中基础中的基础,完全是针对刚入行的朋友,不喜勿喷。后续还会持续更新,欢迎交流。

posted @ 2018-08-26 14:25  mangata  阅读(262)  评论(0编辑  收藏  举报