热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

微信开发第二篇上一篇讲述了公众号内部的程序员需要注意的一些内容。http:blog.csdn.netu010773333articledetails48047031这里进行服务器被动交互

微信开发第二篇

上一篇讲述了公众号内部的程序员需要注意的一些内容。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格式

         
                 
                 
                  {2}
                 
                  
                   {4}
                  

在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;


其中给出一个点击事件:

        ///


        /// 关注
        ///

        ///
        ///
        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();
        }





推荐阅读
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • Python应用实例大揭秘:七大令人惊叹的高阶技巧展示
    2020年,Python无疑成为了最炙手可热的编程语言,其影响力已远远超出程序员的范畴。从初学者到资深从业者,甚至小学生,都在纷纷加入Python的学习热潮中。凭借其低门槛、易上手和强大的功能,Python正逐渐成为各行业不可或缺的工具。本文将揭示七个令人惊叹的Python高级应用技巧,帮助读者进一步提升编程水平。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
author-avatar
yushun
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有