• c#开发微信公众号——关于c#对象与xml的转换


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

    举个例子:用户在微信公众号里面发了个“您好!”,微信服务器会以特定的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#对象相互转换)都是同样的道理。

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

  • 相关阅读:
    粤语·简约学习笔记
    Linux的网卡由eth0变成了eth1
    RedHat 更新CentOS Yum源
    Lamp 搭建
    像淘宝、京东这样的大型电商网站服务器构架完全部署方案
    完成静态服务器——Node.js摸石头系列之四
    实现使用Websocket通讯的聊天室——Node.js摸石头系列之六
    Node.js摸石头系列目录
    Aptana studio 3 修改配色方案
    Node.js 的安装和控制台命令——Node.js摸石头系列之一
  • 原文地址:https://www.cnblogs.com/ityuanmanito/p/5163443.html
Copyright © 2020-2023  润新知