在成为微信公众号开发者以后,整个交互流程:用户->微信服务器->自己的服务器->返回微信服务器->用户;

举个例子:用户在微信公众号里面发了个“您好!”,微信服务器会以特定的xml形式(如下) 

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[您好!]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>

  

发送给自己的服务器(在微信公众号后台 开发选项里面 配置的 url服务器地址),自己的服务器接受到此xml消息后根据用户输入的消息不同来做不同的业务逻辑处理,例如:给用户回复个“欢迎!”
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎!]]></Content>
</xml>

  

返回给微信服务器,微信服务器根据ToUserName FromUserName返回给用户
特别注意:开发者在给微信服务器返回xml消息时一定要将ToUserName FromUserName与用户发过来的ToUserName FromUserName做个对调,否则回传给微信服务器,微信服务器是识别处理不了的(用户收不到相对应的消息) 那么在两者服务器(微信服务器和自己的服务器)进行通信的时候,对xml的处理就显得尤为重要,这里总共提供两种处理方案,重点在第二种(用c#对象与xml互转换进行)
方案一:直接使用XmlDocument类
   XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(postStr))); //postStr为微信服务器传过来的xml
XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");

  

根据选的节点的 InnerText属性就能获取到此节点的内容值

方案二:先将微信服务器传过来的xml序列化成c#对象(需要自己根据官方文档定义对应的model 实体),开发过程中就直接使用对象的属性来操作对应的xml的节点,然后经过反序列化成xml返回给微信服务器,这样开发起来就回到我们熟悉的开发模式,万物皆对象,             点点就出来;架构更清晰,代码更优雅;对吧

第一步:转xml为对象

    //将微信服务器传过来的xml数据 转换成 obj实体
   

 var xmlObj = XmlUtil.XmlToObjectFromStr<xml>(typeof(xml), postStr);  
    xmlObj.ExchageValue(); //写了个扩展方法对调ToUserName FromUserName

  

    

  

    //返回文本消息
    // 把需要返回给用户的信息进行设置 TextXml 为自定义的实体(根据官方文档被动回复消息xml)
    TextXml txml = new TextXml(xmlObj.ToUserName, xmlObj.FromUserName);
    txml.Content.Value = "自定义内容!";      return XmlUtil.ToXml(txml); //将实体 转换为 xml

  

     

  解释一下:这里将实体属性全部定义为 XMLNode类型的原因是  序列化成xml的时候带上cdata不转义标记

     将实体转换为xml方法:

     

       

    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", ""); //去除xmlns:xsd

这两行代码是要去掉   xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

否则维系服务器就不会识别处理(亲测)

       返回result的时候 正则表达式是将xml的节点 <TextXml>替换成<xml>

       这样在我们开发过程中每次只需要创建要回复的消息类型的实体,然后给对应的属性赋值,再经过反序列化xml交给微信服务器就可以了;开发过程简单明了了很多!当然后面还会遇到xml带子节点的情况(跟c#对象相互转换)都是同样的道理。

  希望能帮到要用或者即将要用的朋友们!!

c#开发微信公众号——关于c#对象与xml的转换的更多相关文章

  1. PHP开发微信公众号(一)二维码的获取

    要开发微信公众号,首先进行需要注册一个,然后认证.这就不用多说了. 当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sa ...

  2. Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token

    获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...

  3. Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装

    在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...

  4. 小机器人自动回复(python,可扩展开发微信公众号的小机器人)

    api来之图灵机器人.我们都知道微信公众号可以有自动回复,我们先用python脚本编写一个简单的自动回复的脚本,利用图灵机器人的api. http://www.tuling123.com/help/h ...

  5. vue+node.js+webpack开发微信公众号功能填坑——v -for循环

    页面整体框架实现,实现小功能,循环出数据,整体代码是上一篇 vue+node.js+webpack开发微信公众号功能填坑--组件按需引入 修改部门代码 app.vue <yd-flexbox&g ...

  6. vue+node.js+webpack开发微信公众号功能填坑——组件按需引入

    初次开发微信公众号,整体框架是经理搭建,小喽喽只是实现部分功能,整体页面效果 整个页面使用两个组件:布局 FlexBox,搜索框 Search,demo文档 http://vue.ydui.org/d ...

  7. PHP开发微信公众号

    PHP开发微信公众号:配置和部署服务器及Token认证 https://zhuanlan.zhihu.com/p/28259840

  8. 使用vue开发微信公众号下SPA站点的填坑之旅

    原文发表于本人博客,点击进入使用vue开发微信公众号下SPA站点的填坑之旅 本文为我创业过程中,开发项目的填坑之旅.作为一个技术宅男,我的项目是做一个微信公众号,前后端全部自己搞定,不浪费国家一分钱^ ...

  9. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

随机推荐

  1. python 3 过滤股票

    参考某个博客,代码不全,地址找不到了见谅,加了些自己弄的算法. 备忘 #-*- coding: utf-8 -*-import os, reimport time def filefilter(com ...

  2. 在 Azure 虚拟机中配置 Always On 可用性组(经典)

    在开始之前,请先假设现在可以在 Azure Resource Manager 模型中完成此任务. 我们建议使用 Azure Resource Manager 模型来进行新的部署. 请参阅 Azure ...

  3. Sqlite EF6注册

    在EF6使用Sqlite的时候.Sqlite需要安装sqlite-netFx40-setup-bundle-x64-2010-1.0.97.0.exe.我不想在项目发布的时候,安装的时候执行该程序,于 ...

  4. Linux Reboot And Poweroff Command

    1.Environment:RedHat Linux Enterprise 6+Vmware Workstation 12 Pro 2.Linux shutdown and restart comma ...

  5. January 08 2017 Week 2nd Sunday

    Believe not all that you see nor half what you hear. 眼见的不能全信,耳闻的也不能半信. What you hear, what you see, ...

  6. December 29th 2016 Week 53rd Thursday

    The true nobility is in being superior to your previous self. 真正的高贵在于超越过去的自己. It is really difficult ...

  7. boost编译

    从boost官网( http://www.boost.org )上下载最新的boost版本,现在最新是1.64版本,解压到自定义目录(我解压到了E盘E:\boost_1_64_0\,最终的目录结构是E ...

  8. Nexus修改admin密码及其添加用户

    Nexus之所以修改密码,是为了安全起见,个人学习的话,本地windows或者虚拟机即可,外网服务器建议将密码修改复杂点,而且强烈建议端口不要8081,最好将其改为其他的.同样也是为了安全起见. 添加 ...

  9. phantomJS浏览器

    无界面浏览器 下载解压缩 http://phantomjs.org/download.html selenium调用 from selenium import webdriver import tim ...

  10. stateless 无状态组件

    使用: