微信开发第二篇了解微信运行机理,并简单介绍服务器被动交互一些功能

微信开发第二篇

上一篇讲述了公众号内部的程序员需要注意的一些内容。http://blog.csdn.net/u010773333/article/details/48047031

这里进行服务器被动交互的基础讲解,被动交互是由手机微信客户端发起的请求。开发公众微信号的准备一台外网服务器(80端口不能禁用或者被占用),申请一个自己网站的域名。

下面要编写代码,首先要知道自己的服务器,微信服务器,和手机微信客户端之间的运行原理


下面需要编写自己的代码,并且挂到自己的服务器了。我这个以C#语言进行讲解

首先要拿到微信公众号的AppID(应用ID) ,AppSecret(应用密钥),URL(服务器地址),Token(令牌),EncodingAESKey(消息加解密密钥)

先建一个项目(随便一个项目)设置一个首页,把这个项目用自己申请的域名挂到自己的服务器(一定要用80端口)并能实现简单的访问。

之后配置url和Token 主要是Token这个要参看微信官方文档。url就是自己服务器上的那个自己的项目首页就是交互时微信服务器首先访问的页面。一定要启用“服务器配置”如下图



对于微信服务器第一次请求咱们自己的服务器是发的是get请求,新的账号首先要微信接入测试。

在首页首先判断是不是第一次访问要是get请求说明是第一次要进行微信接入测试。测试成功之后就不在测试了,这段代码原则性只执行一遍。

代码如下:

if (Request.HttpMethod == "GET")
            {
                Auth(); //微信接入的测试
            }
            else
            {
                Stream s = System.Web.HttpContext.Current.Request.InputStream;
                byte[] b = new byte[s.Length];
                s.Read(b, 0, (int)s.Length);
                postStr = Encoding.UTF8.GetString(b);
                if (!string.IsNullOrEmpty(postStr)) //请求处理  
                {
                    weixinservice.Handle(postStr);
                }  
            }

 public void Auth()
        {
            string echoStr = System.Web.HttpContext.Current.Request.QueryString["echoStr"];
            if (CheckSignature())
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    System.Web.HttpContext.Current.Response.Write(echoStr);
                    System.Web.HttpContext.Current.Response.End();
                }
            }
        }

并且需要知道微信服务器和咱们自己的服务器的交互是xml格式

          <xml>
                  <ToUserName><![CDATA[{0}]]></ToUserName>
                  <FromUserName><![CDATA[{1}]]></FromUserName>
                  <CreateTime>{2}</CreateTime>
                  <MsgType><![CDATA[event]]></MsgType>
                   <Event><![CDATA[{3}]]></Event>
                   <EventKey>{4}</EventKey>
                   </xml>

在WeixinService类中添加如下方法

      private string RequestXml { get; set; }

        public void Handle(string postStr)
        {
            //封装请求类  
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(postStr);
            XmlElement rootElement = doc.DocumentElement;
            //MsgType  
            XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
            //接收的值--->接收消息类(也称为消息推送)  
            WeiXinModel requestXML = new WeiXinModel();
            requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
            requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
            requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
            requestXML.MsgType = MsgType.InnerText;
            string response = string.Empty;
            EventMessage em = EventMessage.LoadFromXml(RequestXml);
            IHandler handler = null;
            //根据不同的类型进行不同的处理
            switch (requestXML.MsgType)
            {
                case "text":
                    //requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
                    handler = new TextHandler(postStr);
                    response = handler.HandleRequest();
                    break;
                case "image": //图片  
                    requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
                    break;
                case "location": //位置  
                    requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
                    requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
                    requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
                    requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
                    break;
                case "link": //链接
                    //response = SubscribeEventHandler(em);
                    break;
                case "event": //事件推送 支持V4.5+  
                    handler = new Kingsun.WeiXin.Handlers.EventHandler(postStr);
                    response = handler.HandleRequest();
                    break;
            }
            //回复消息
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.Write(response);
            HttpContext.Current.Response.End();          
        }

其中requestXML.MsgType就是手机微信端出发的是什么事件的类型。咱们服务器通过手机端的不同类型可以做出不同相应,其中

可以接收用户手机微信客户端的一些信息如我新建了一个WeiXinModel类:发送方openid,接收方openid ,时间和类型。

           WeiXinModel requestXML = new WeiXinModel();
            requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
            requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
            requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
            requestXML.MsgType = MsgType.InnerText;

其中event事件比较特殊 event事件 subscribe(扫描二维码并且可以通过方法把手机微信openid存到自己的服务器上),scan(扫描带参数二维码,并直接关注事件),click(点击事件)这三种,具体看微信官方给的解释

我的代码如下:

EventMessage em = EventMessage.LoadFromXml(RequestXml);
            string content = "";
            if (em != null)
            {
                switch (em.Event.ToLower())
                {
                    case ("subscribe"):
                        //加载菜单
                        if (string.IsNullOrEmpty(em.EventKey))
                        {
                            //response = ResponseMessage.GetText(em.FromUserName, em.ToUserName, "关注成功");                 
                            response = SubscribeEventHandler(em);
                        }
                        else
                        {
                            content = em.EventKey.Replace("qrscene_", "");//二维码携带的信息
                            response = SubscribeEventHandler(em, content);//扫描带参数二维码先关注后推送事件
                        }
                        break;
                    case "scan":
                        response = ResponseMessage.ScanQrcode(em.FromUserName, em.ToUserName, em.EventKey);//扫描带参数二维码已关注 直接推送事件
                        break;
                    case "click":
                        response = ClickEventHandler(em);
                        break;
                }
            }
            return response;


其中给出一个点击事件:

        /// <summary>
        /// 关注
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string SubscribeEventHandler(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Commons.GetNowTime();
            tm.Content = "亲,您已经学会了服务器被动交互";
            return tm.GenerateContent();
        }




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值